Sfoglia il codice sorgente

【优化】登录后进入场景流程

johnclot69 7 mesi fa
parent
commit
99d702cdc7

+ 8 - 10
DotNet/Hotfix/Helper/MapHelper.cs

@@ -95,11 +95,9 @@ namespace ET.Server
         {
             Map map = null;
 
-            GameMapComponent component = player.DomainScene().GetComponent<GameMapComponent>();
-
             if (player.Map != null)
             {
-                map = component.Get(player.Map.Id);
+                map = player.DomainScene().GetComponent<GameMapComponent>().Get(player.Map.Id);
             }
 
             // 老场景
@@ -117,7 +115,7 @@ namespace ET.Server
 
             if (map != null)
             {
-                map = ChangeArea(player, new AreaData(10099, map.Id), false);
+                map = ChangeArea(player, new AreaData(10099, map.Id), true);
             }
 
             return map;
@@ -132,7 +130,7 @@ namespace ET.Server
         /// <returns></returns>
         public static Map CreateMap(WNPlayer player, JObject jObject, bool forceCreate)
         {
-            Log.Debug($"createArea areaData:{JsonConvert.SerializeObject(jObject, Formatting.Indented)}");
+            Log.Debug($"CreateMap areaData:{JsonConvert.SerializeObject(jObject, Formatting.Indented)}");
             int mapId = Convert.ToInt32(jObject.SelectToken("areaId"));
             MapConfig prop = MapConfigCategory.Instance.Get(mapId);
             if (prop == null)
@@ -161,14 +159,14 @@ namespace ET.Server
 
             Log.Info($"createArea instanceId:{instanceId}, templateId:{prop.TemplateID}, bs:{player.GetZoneManager()}");
 
-            int resCode = player.GetZoneManager().createZoneRequest(player.GetId().ToString(),
-                "bs-" + ConstGame.GameServerId, prop.TemplateID, instanceId.ToString(), forceCreate, enterData);
+            int resCode = player.GetZoneManager().createZoneRequest(player.GetId().ToString(), "bs-" + ConstGame.GameServerId,
+                prop.TemplateID, instanceId.ToString(), forceCreate, enterData);
 
             if (resCode == 0)
             {
                 jsonObject.Add("instanceId", instanceId);
                 jsonObject.Add("areaId", mapId);
-                return CreaLocalMap(player, prop, jsonObject, instanceId, mapId, "bs-" + ConstGame.GameServerId);
+                return CreatLocalMap(player, prop, jsonObject, instanceId, mapId, "bs-" + ConstGame.GameServerId);
             }
 
             Log.Warning($"createZoneRequest resCode={resCode}, mapID={prop.Id}, playerId={player.GetId()}");
@@ -186,7 +184,7 @@ namespace ET.Server
         /// <param name="mapId"></param>
         /// <param name="bsServerId"></param>
         /// <returns></returns>
-        public static Map CreaLocalMap(WNPlayer player, MapConfig prop, JObject data, long instanceId, int mapId, string bsServerId)
+        public static Map CreatLocalMap(WNPlayer player, MapConfig prop, JObject data, long instanceId, int mapId, string bsServerId)
         {
             Scene scene = player.DomainScene();
 
@@ -199,7 +197,7 @@ namespace ET.Server
             }
             else
             {
-                Log.Error($"createZone:{mapId} fail! there is no area type of this,type:{prop.Type}");
+                Log.Error($"CreatLocalMap:{mapId} fail! there is no area type of this,type:{prop.Type}");
             }
 
             return map;

+ 2 - 2
DotNet/Hotfix/Module/FastStream/FastStreamComponentSystem.cs

@@ -16,7 +16,7 @@ namespace ET.Server
                 self.FastStreamClient = new EasyClient();
                 self.FastStreamClient.Initialize<FastStreamBuffer>(new FastStreamMessageDecoder(FastStreamMessageDecoder.LEN_HEAD), OnSessionDataReceived);
                 self.FastStreamClient.NoDelay = true;
-                self.FastStreamClient.ReceiveBufferSize = 10* 1024 * 1024;
+                self.FastStreamClient.ReceiveBufferSize = 10 * 1024 * 1024;
 
                 self.FastStreamClient.Connected += new EventHandler(OnSessionConnected);
                 self.FastStreamClient.Error += new EventHandler<ErrorEventArgs>(OnSessionError);
@@ -24,7 +24,7 @@ namespace ET.Server
 
                 //IPAddress ipAddress = Dns.GetHostAddresses("localhost")[0];
                 IPEndPoint endpoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 3370);
-                // IPEndPoint endpoint = new IPEndPoint(IPAddress.Parse("47.97.163.95"), 3370);
+                // IPEndPoint endpoint = new IPEndPoint(IPAddress.Parse("47.98.144.16"), 3370);
                 self.FastStreamClient.ConnectAsync(endpoint);
             }
         }

+ 8 - 8
DotNet/Hotfix/Scenes/Game/Handler/C2G_AddUnitsToMapHandler.cs

@@ -39,14 +39,14 @@ namespace ET.Server
             }
 
             // 临时openId
-            while (true)
-            {
-                string _openId = (10000 + new Random().Next(99999999)).ToString();
-                if (player.Map.GetUnitPlayerByOpenId(_openId) != null) continue;
-                await player.Map.AddUnitPlayer(_openId, request.UnitId, request.Force, request.Flag, request.X, request.Y, GetRandomPlayerName(), GetRandomUrl());
-                break;
-            }
-
+            // while (true)
+            // {
+            //     string _openId = (10000 + new Random().Next(99999999)).ToString();
+            //     if (player.Map.GetUnitPlayerByOpenId(_openId) != null) continue;
+            //     await player.Map.AddUnitPlayer(_openId, request.UnitId, request.Force, request.Flag, request.X, request.Y, GetRandomPlayerName(), GetRandomUrl());
+            //     break;
+            // }
+            await ETTask.CompletedTask;
             reply();
         }
 

+ 1 - 1
DotNet/Hotfix/Scenes/Game/Handler/C2G_BindPlayerHandler.cs

@@ -56,7 +56,7 @@ namespace ET.Server
 
             // 登录数据
             player.OnLogin();
-            map.PlayerLogin(player);
+            map.OnPlayerLogin(player);
 
             response.Player = PlayerHelper.PlayerInfoToProto(player);
             response.Player.areaId = mapConfig.TemplateID;

+ 2 - 1
DotNet/Hotfix/Scenes/Game/Handler/C2G_EnterMapHandler.cs

@@ -52,7 +52,8 @@ namespace ET.Server
             }
 
             map.PlayerEnterRequest(player);
-            map.PlayerEntered(player);
+            map.OnPlayerEntered(player);
+            player.OnEndEnterScene();
 
             response.MapInstanceId = player.Map.Id;
             reply();

+ 4 - 39
DotNet/Hotfix/Scenes/Game/Map/MapEventComponentSystem.cs

@@ -65,19 +65,7 @@ namespace ET.Server
                     else
                     {
                         int objId = int.Parse(parames[1]);
-                        if (objId > 0 && objId != 1 && objId != 2 && objId != 3)
-                        {
-                            Map map = self.GetParent<Map>();
-                            Struct.UnitPlayerData unitPlayerData = map.GetUnitPlayerByObjId(objId);
-                            if (unitPlayerData != null)
-                            {
-                                unitPlayerData.DeadState = 1;
-                                if (!map.DeadUnitPlayer.Exists(o => o == unitPlayerData.ObjId))
-                                {
-                                    map.DeadUnitPlayer.Add(unitPlayerData.ObjId);
-                                }
-                            }
-                        }
+                        Log.Debug($"场景单位死亡...objId:{objId}");
                     }
                     break;
                 }
@@ -86,16 +74,7 @@ namespace ET.Server
                     int objId = int.Parse(parames[1]);
                     if (objId > 0)
                     {
-                        Map map = self.GetParent<Map>();
-                        Struct.UnitPlayerData unitPlayerData = map.GetUnitPlayerByObjId(objId);
-                        if (unitPlayerData != null)
-                        {
-                            unitPlayerData.DeadState = 0;
-                            if (map.DeadUnitPlayer.Exists(o => o == unitPlayerData.ObjId))
-                            {
-                                map.DeadUnitPlayer.Remove(unitPlayerData.ObjId);
-                            }
-                        }
+                        Log.Debug($"场景单位复活...objId:{objId}");
                     }
                     break;
                 }
@@ -110,26 +89,12 @@ namespace ET.Server
         {
             Map map = self.GetParent<Map>();
 
-            if (map.Player == null)
+            if (map == null)
             {
                 return;
             }
-            // 玩家离开
-            map.Player.GetComponent<PlayerTempDataComponent>().MapData.ready = false;
-            // 记录玩家历史
-            map.SyncPlayerHistoryData(map.Player);
-            // 战斗服场景玩家离开
-            map.PlayerLeaveRequest(map.Player, false);
-            // 本地场景移除玩家
-            map.RemovePlayer(map.Player, false);
-            // 战斗服结束场景
-            map.DestroyZoneRequest();
-            // 移除本地场景数据
-            map.DomainScene().GetComponent<GameMapComponent>().Remove(map.Id);
 
-            map.Player.Map = null;
-
-            map.Dispose();
+            Log.Debug($"场景结算事件...");
         }
 
         /// <summary>

+ 65 - 161
DotNet/Hotfix/Scenes/Game/Map/MapSystem.cs

@@ -17,15 +17,16 @@ namespace ET.Server
             protected override void Awake(Map self, JObject opts, WNPlayer player)
             {
                 Log.Debug($"创建场景实体...create area opts:{opts.ToString()}");
-                self.createTime = TimeHelper.ServerNow();
+                self.CreateTime = TimeHelper.ServerNow();
                 self.LogicServerId = opts.SelectToken("logicServerId") != null? Convert.ToInt32(opts.SelectToken("logicServerId")) : 0;
                 self.MapId = Convert.ToInt32(opts.SelectToken("areaId"));
                 self.Prop = MapConfigCategory.Instance.Get(self.MapId);
                 self.Type = self.Prop.Type;
-                self.Player = player;
-                self.UnitPlayers = new Dictionary<string, Struct.UnitPlayerData>();
+                self.HasPlayerEntered = false;
+                self.Actors = new Dictionary<long, Struct.Actor>();
                 self.DeadUnits = new List<int>();
                 self.DeadUnitPlayer = new List<int>();
+                self.IsLeaveKeepObject = false;
 
                 // 战斗服事件组件
                 self.AddComponent<MapEventComponent>();
@@ -40,19 +41,6 @@ namespace ET.Server
             }
         }
 
-        /// <summary>
-        /// 初始化场景数据
-        /// </summary>
-        /// <param name="self"></param>
-        public static void Reset(this Map self)
-        {
-            self.UnitPlayers.Clear();
-            self.TotalLikeNum = 0;
-            self.ConfigNum = 0;
-            self.DeadUnits.Clear();
-            self.DeadUnitPlayer.Clear();
-        }
-
         public static ZoneManagerPrx GetZoneManager(this Map self)
         {
             return self.DomainScene().GetComponent<BattleIceAgentComponent>().IceZoneManager;
@@ -92,17 +80,6 @@ namespace ET.Server
             player.GetComponent<PlayerTempDataComponent>().SyncHistoryData(self.Prop, self.InstanceId, result);
         }
 
-        /// <summary>
-        /// 获取场景角色
-        /// </summary>
-        /// <param name="self"></param>
-        /// <param name="playerId"></param>
-        /// <returns></returns>
-        public static WNPlayer GetPlayer(this Map self, long playerId)
-        {
-            return self.Player;
-        }
-
         /// <summary>
         /// 分配阵营
         /// </summary>
@@ -113,51 +90,6 @@ namespace ET.Server
             player.Force = (int)AreaForce.FORCEA;
         }
 
-        /// <summary>
-        /// 移除角色,通用框架接口 切换场景/掉线会自动调用,尽量 不要手动调用
-        /// </summary>
-        /// <param name="self"></param>
-        /// <param name="player"></param>
-        /// <param name="keepObject"></param>
-        public static void RemovePlayer(this Map self, WNPlayer player, bool keepObject)
-        {
-            Log.Info($"removePlayer: playerId={player.GetId()}, mapId={self.MapId}, ip={player.Session.RemoteAddress}");
-            WNPlayer actorPlayer = self.GetPlayer(player.GetId());
-            if (actorPlayer != null)
-            {
-                // self.Players.Remove(player.GetId());
-            }
-            // 重置进入场景标识
-            player.GetComponent<PlayerTempDataComponent>().MapData.ready = false;
-        }
-
-        /// <summary>
-        /// 玩家进入场景请求
-        /// </summary>
-        /// <param name="self"></param>
-        /// <param name="player"></param>
-        public static void PlayerEnterRequest(this Map self, WNPlayer player)
-        {
-            bool ready = player.GetComponent<PlayerTempDataComponent>().MapData.ready;
-            if (ready)
-            {
-                Log.Info($"PlayerEnterRequest: playerId={player.GetId()}, ready={ready}");
-                return;
-            }
-
-            try
-            {
-                string enterData = player.ToJSON4EnterScene(self);
-                Log.Debug($"{player.GetName()}, enterSceneData:{enterData}");
-                self.GetZoneManager().playerEnterRequest(player.GetId().ToString().Trim(), self.Id.ToString().Trim(), enterData);
-            }
-            catch (Exception e)
-            {
-                Log.Warning(
-                    $"playerEnterRequest: playerName={player.GetName()}, instanceId={self.Id}, mapName={self.Prop.Name}, serverID={self.BattleServerId}, e={e}");
-            }
-        }
-
         /// <summary>
         /// 场景添加角色
         /// </summary>
@@ -165,10 +97,15 @@ namespace ET.Server
         /// <param name="player"></param>
         public static void AddPlayer(this Map self, WNPlayer player)
         {
-            Log.Info($"addPlayer: playerId={player.GetId()}, mapId={self.MapId}, ip={player.Session.RemoteAddress}");
-            player.Map = self;
+            Log.Info($"AddPlayer: playerId={player.GetId()}, mapId={self.MapId}, ip={player.Session.RemoteAddress}");
             self.SetForce(player);
-            self.Player = player;
+            player.Map = self;
+
+            if (!self.Actors.ContainsKey(player.GetId()))
+            {
+                self.HasPlayerEntered = true;
+                self.Actors.Add(player.GetId(), new Struct.Actor());
+            }
         }
 
         /// <summary>
@@ -186,8 +123,9 @@ namespace ET.Server
         /// </summary>
         /// <param name="self"></param>
         /// <param name="player"></param>
-        public static void PlayerEntered(this Map self, WNPlayer player)
+        public static void OnPlayerEntered(this Map self, WNPlayer player)
         {
+
         }
 
         /// <summary>
@@ -195,28 +133,43 @@ namespace ET.Server
         /// </summary>
         /// <param name="self"></param>
         /// <param name="player"></param>
-        public static void PlayerLogin(this Map self, WNPlayer player)
+        public static void OnPlayerLogin(this Map self, WNPlayer player)
         {
         }
 
         /// <summary>
-        /// 玩家离开场景请求
+        /// 移除角色,通用框架接口 切换场景/掉线会自动调用,尽量 不要手动调用
         /// </summary>
         /// <param name="self"></param>
         /// <param name="player"></param>
         /// <param name="keepObject"></param>
-        public static void PlayerLeaveRequest(this Map self, WNPlayer player, bool keepObject)
+        public static void RemovePlayer(this Map self, WNPlayer player, bool keepObject)
         {
-            try
+            Log.Info($"RemovePlayer: playerId={player.GetId()}, mapId={self.MapId}, ip={player.Session.RemoteAddress}");
+            // 重置进入场景标识
+            // player.GetComponent<PlayerTempDataComponent>().MapData.ready = false;
+
+            if (self.Actors.ContainsKey(player.GetId()))
             {
-                self.GetZoneManager().playerLeaveRequest(player.GetId().ToString().Trim(), self.InstanceId.ToString().Trim(), keepObject);
+                self.PlayerLeaveRequest(player, keepObject);
+                self.Actors.Remove(player.GetId());
             }
-            catch (Exception e)
+        }
+
+        /// <summary>
+        /// 玩家离线时触发
+        /// </summary>
+        /// <param name="self"></param>
+        /// <param name="player"></param>
+        public static void OnPlayerLogout(this Map self, WNPlayer player)
+        {
+            if (self.Actors.ContainsKey(player.GetId()))
             {
-                Log.Warning($"playerLeaveRequest: catch - {e}");
+                // 本场景移除玩家
+                self.RemovePlayer(player, self.IsLeaveKeepObject);
             }
-
-            Log.Debug($"playerLeaveRequest--------------------{player.GetName()} - {self.InstanceId} - {self.Prop.Name}");
+            // 移除本地玩家数据
+            self.DomainScene().GetComponent<GamePlayerComponent>().Remove(player.GetId());
         }
 
         /// <summary>
@@ -278,107 +231,58 @@ namespace ET.Server
         }
 
         /// <summary>
-        /// 战斗服结束场景
-        /// </summary>
-        /// <param name="self"></param>
-        public static void DestroyZoneRequest(this Map self)
-        {
-            self.GetZoneManager().destroyZoneRequest(self.Id.ToString());
-        }
-
-        /// <summary>
-        /// 增加单位玩家本地数据
+        /// 玩家进入场景请求
         /// </summary>
         /// <param name="self"></param>
-        /// <param name="openId"></param>
-        /// <param name="templateId"></param>
-        /// <param name="force"></param>
-        /// <param name="flag"></param>
-        /// <param name="x"></param>
-        /// <param name="y"></param>
-        /// <param name="name"></param>
-        /// <param name="url"></param>
-        /// <returns></returns>
-        public static async ETTask<Struct.UnitPlayerData> AddUnitPlayer(this Map self, string openId, int templateId, int force, string flag, float x, float y, string name, string url)
+        /// <param name="player"></param>
+        public static void PlayerEnterRequest(this Map self, WNPlayer player)
         {
-            if (templateId <= 0)
-            {
-                Log.Debug("illegal templateId @AddUnitPlayer");
-                return null;
-            }
-            if (self.UnitPlayers.ContainsKey(openId))
+            self.Actors.TryGetValue(player.GetId(), out Struct.Actor actor);
+            if (actor.Ready)
             {
-                Log.Debug("already contain unit @AddUnitPlayer");
-                return null;
+                Log.Info($"PlayerEnterRequest: playerId={player.GetId()}, ready={actor.Ready}");
+                return;
             }
 
-            // 战斗服数据
-            Struct.MonsterUnit unit = new Struct.MonsterUnit();
-            unit.id = templateId;
-            unit.force = force;
-            if (!string.IsNullOrEmpty(flag))
-            {
-                unit.flag = flag;
-            }
-            else
+            try
             {
-                unit.x = x;
-                unit.y = y;
+                string enterData = player.ToJSON4EnterScene(self);
+                Log.Debug($"{player.GetName()}, EnterSceneData:{enterData}");
+                self.GetZoneManager().playerEnterRequest(player.GetId().ToString().Trim(), self.Id.ToString().Trim(), enterData);
             }
-            unit.autoGuard = true;
-            unit.uuid = name;
-            unit.alias = url;
-
-            int objId = await self.AddUnits(unit, true);
-            var unitPlayerData = new Struct.UnitPlayerData
-            {
-                OpenId = openId,
-                TemplateId = templateId,
-                ObjId = objId,
-                Name = name,
-                Url = url,
-                Level = 1,
-                Likes = 0,
-                ReliveTime = 0,
-                x = 0,
-                y = 0,
-                Map = self
-            };
-
-            if(!self.UnitPlayers.TryAdd(openId, unitPlayerData))
+            catch (Exception e)
             {
-                Log.Debug("openid already exist");
-                await self.RemovePointUnit(objId);
-                return null;
+                Log.Error($"PlayerEnterRequest: playerName={player.GetName()}, instanceId={self.Id}, mapName={self.Prop.Name}, serverID={self.BattleServerId}, e={e}");
             }
-            return unitPlayerData;
         }
 
         /// <summary>
-        /// 获取单位玩家
+        /// 玩家离开场景请求
         /// </summary>
         /// <param name="self"></param>
-        /// <param name="openId"></param>
-        /// <returns></returns>
-        public static Struct.UnitPlayerData GetUnitPlayerByOpenId(this Map self, string openId)
+        /// <param name="player"></param>
+        /// <param name="keepObject"></param>
+        public static void PlayerLeaveRequest(this Map self, WNPlayer player, bool keepObject)
         {
-            if (self.UnitPlayers.TryGetValue(openId, out Struct.UnitPlayerData unitPlayer))
+            try
             {
-                return unitPlayer;
+                self.GetZoneManager().playerLeaveRequest(player.GetId().ToString().Trim(), self.InstanceId.ToString(), keepObject);
+            }
+            catch (Exception e)
+            {
+                Log.Error($"PlayerLeaveRequest: 出错 - {e}");
             }
 
-            return null;
+            Log.Debug($"PlayerLeaveRequest--------------------{player.GetName()} - {self.InstanceId} - {self.Prop.Name}");
         }
 
         /// <summary>
-        /// 获取单位玩家
+        /// 战斗服结束场景
         /// </summary>
         /// <param name="self"></param>
-        /// <param name="objId"></param>
-        /// <returns></returns>
-        public static Struct.UnitPlayerData GetUnitPlayerByObjId(this Map self, int objId)
+        public static void DestroyZoneRequest(this Map self)
         {
-            return self.UnitPlayers.Values.FirstOrDefault(unitPlayer => unitPlayer != null && unitPlayer.ObjId == objId);
+            self.GetZoneManager().destroyZoneRequest(self.Id.ToString());
         }
     }
 }

+ 17 - 11
DotNet/Hotfix/Scenes/Game/Player/PlayerSystem.cs

@@ -176,8 +176,6 @@ namespace ET.Server
         /** 客户端资源加载完成通知 给客户端推送的数据要在这里 **/
         public static void OnReady(this WNPlayer self)
         {
-            self.OnEndEnterScene();
-
             // 登录第一次进场景处理,此次登陆登出期间只处理一次
             if (self.ReadyFirst)
             {
@@ -204,20 +202,28 @@ namespace ET.Server
         /** 向客户端推送角色相关数据 **/
         public static void OnEndEnterScene(this WNPlayer self)
         {
-            bool ready = self.GetComponent<PlayerTempDataComponent>().MapData.ready;
-            if (ready)
+            self.GetXmdsManager().playerReady(self.GetId().ToString());
+
+            self.Map.Actors.TryGetValue(self.GetId(), out Struct.Actor actor);
+            if (actor != null)
             {
-                Log.Warning($"$OnEndEnterScene跳过 : playerId={self.GetId()}, 玩家场景:{self.Map.MapId}, 进入场景:" + (self.Map?.MapId ?? -1));
-                return;
+                if (actor.Ready)
+                {
+                    Log.Warning($"$OnEndEnterScene跳过 : playerId={self.GetId()}, 玩家场景:{self.Map.MapId}, 进入场景:" + (self.Map?.MapId ?? -1));
+                    return;
+                }
+
+                actor.Ready = true;
             }
 
-            self.GetComponent<PlayerTempDataComponent>().MapData.ready = true;
+            // todo 弹幕游戏的设置, 后面会调整
 
-            self.GetXmdsManager().playerReady(self.GetId().ToString().Trim());
             //PKMode设置为All
-            self.GetXmdsManager().refreshPlayerPKMode(self.GetId().ToString().Trim(), false, (int)PkModel.All);
+            self.GetXmdsManager().refreshPlayerPKMode(self.GetId().ToString(), false, (int)PkModel.All);
             //设置为自动战斗
-            self.GetXmdsManager().autoBattle(self.Map.Id.ToString().Trim(), self.GetId().ToString().Trim(), true);
+            self.GetXmdsManager().autoBattle(self.Id.ToString().Trim(), self.GetId().ToString(), true);
+
+            Log.Info($"OnEndEnterScene : mapId={self.Map.MapId}, map={self.Map.Prop.Name}");
         }
 
         /// <summary>
@@ -261,7 +267,7 @@ namespace ET.Server
                 skills = self.GetComponent<PlayerSkillComponent>().ToJson4BattleServerSkills,
                 tasks = new { },
                 flags = new { },
-                playerEntered = false,
+                playerEntered = map.HasPlayerEntered,
                 avatars = new { },
                 basic = self.GetBattlerServerBasic(),
                 connectServerId = "bs-" + ConstGame.GameServerId,

+ 3 - 3
DotNet/Hotfix/Scenes/Game/Player/PlayerTempDataComponentSystem.cs

@@ -14,9 +14,9 @@ namespace ET.Server
                 self.MapData = new PlayerMapInfo();
 
                 self.MapData.mapId = 10099;
-                self.MapData.x = 1586;
-                self.MapData.y = 1566;
-                // self.MapData.direction = System.MathF.PI / 2;
+                self.MapData.x = 230;
+                self.MapData.y = 100;
+                self.MapData.direction = System.MathF.PI / 2;
                 self.MapData.hp = PLAYER.initHp;
                 self.MapData.mp = PLAYER.initMp;
 

+ 30 - 18
DotNet/Hotfix/Scenes/Game/Session/SessionPlayerComponentSystem.cs

@@ -1,4 +1,5 @@
-using System.Collections.Generic;
+using System;
+using System.Collections.Generic;
 using System.Linq;
 
 namespace ET.Server
@@ -26,27 +27,38 @@ namespace ET.Server
                     return;
                 }
 
-                Log.Info($"玩家断线了, playerId={self.PlayerId}, name={player.GetName()}");
+                Log.Info($"处理玩家下线逻辑, playerId={self.PlayerId}, name={player.GetName()}, mapId={player.Map.MapId}");
+
+                // todo 玩家各组件下线相关处理
 
                 Map map = player.Map;
                 if (map != null)
                 {
-                    // 玩家离开
-                    player.GetComponent<PlayerTempDataComponent>().MapData.ready = false;
-                    // 记录玩家历史
-                    map.SyncPlayerHistoryData(player);
-                    // 战斗服场景玩家离开
-                    map.PlayerLeaveRequest(player, false);
-                    // 本地场景移除玩家
-                    map.RemovePlayer(player, false);
-                    // 移除本地玩家数据
-                    self.DomainScene().GetComponent<GamePlayerComponent>().Remove(player.GetId());
-                    // 战斗服结束场景
-                    map.DestroyZoneRequest();
-                    // 移除本地场景数据
-                    map.DomainScene().GetComponent<GameMapComponent>().Remove(map.Id);
-
-                    map.Dispose();
+                    try
+                    {
+                        // 玩家离开
+                        if (map.Actors.TryGetValue(player.GetId(), out Struct.Actor actor))
+                        {
+                            actor.Ready = false;
+                        }
+                        // 记录玩家历史
+                        map.SyncPlayerHistoryData(player);
+                    }
+                    catch (Exception e)
+                    {
+                        Log.Error($"处理玩家下线逻辑, 出错: catch 1 - {e}");
+                    }
+                    finally
+                    {
+                        try
+                        {
+                            map.OnPlayerLogout(player);
+                        }
+                        catch (Exception e)
+                        {
+                            Log.Error($"处理玩家下线逻辑, 出错: catch 2 - {e}");
+                        }
+                    }
                 }
 
                 player.Dispose();

+ 5 - 64
DotNet/Model/Const/Struct.cs

@@ -217,72 +217,13 @@
         }
 
         /// <summary>
-        /// 玩家单位数据
+        /// 场景中的角色
         /// </summary>
-        public class UnitPlayerData
+        public class Actor
         {
-            /** 玩家单位的openId **/
-            public string OpenId { get; set; }
-
-            /** 玩家单位模板id **/
-            public int TemplateId { get; set; }
-
-            /** 战斗服objId **/
-            public int ObjId { get; set; }
-
-            /** 昵称 **/
-            public string Name { get; set; }
-
-            /** 头像url **/
-            public string Url { get; set; }
-
-            /** 等级 (最大为3) **/
-            public long Level { get; set; }
-
-            /** 点赞数 **/
-            public long Likes { get; set; }
-
-            /** 贡献值 **/
-            public long ContributeValue { get; set; }
-
-            /** 死亡状态 0:活着 1:死亡 **/
-            public int DeadState { get; set; }
-
-            /** 复活时间 **/
-            public long ReliveTime { get; set; }
-
-            /** 复活位置x **/
-            public int x { get; set; }
-
-            /** 复活位置y **/
-            public int y { get; set; }
-
-            /** 场景 **/
-            public Map Map { get; set; }
-
-            //礼物用钱总数,单位:分
-            public int GiftMoney = 0;
-
-            public UnitPlayerData()
-            {
-            }
-
-            public UnitPlayerData(string openId, int objId, Map map)
-            {
-                this.OpenId = openId;
-                this.ObjId = objId;
-                this.Map = map;
-            }
-
-            public UnitPlayerData(string openId, int templateId, long time, int x, int y, Map map)
-            {
-                this.OpenId = openId;
-                this.TemplateId = templateId;
-                this.ReliveTime = time;
-                this.x = x;
-                this.y = y;
-                this.Map = map;
-            }
+            public bool Ready { get; set; }
+            public bool Leave { get; set; }
+            public bool Alive = true;
         }
 
         /// <summary>

+ 0 - 3
DotNet/Model/Scenes/Game/DBEntity/PlayerMapInfo.cs

@@ -5,9 +5,6 @@ namespace ET.Server
     /// </summary>
     public class PlayerMapInfo: Entity, IAwake
     {
-        public bool ready { get; set; }
-        public bool leave { get; set; }
-        public bool alive { get; set; }
         public int historyMapId { get; set; }
         public long historyMapInstanceId { get; set; }
         public float historyX { get; set; }

+ 7 - 9
DotNet/Model/Scenes/Game/Map/Map.cs

@@ -20,19 +20,17 @@ namespace ET.Server
         public string BattleServerId { get; set; }
         /** 游戏服id **/
         public int LogicServerId { get; set; }
-        /** 副本创建时间 **/
-        public long createTime { get; set; }
-        /** 场景里的角色(主播) **/
-        public WNPlayer Player { get; set; }
+        /** 场景是否有玩家进入 **/
+        public bool HasPlayerEntered { get; set; }
+        /** 地图场景创建时间 **/
+        public long CreateTime { get; set; }
         /** 场景里的单位玩家 [key:openId, value:单位玩家数据] **/
-        public Dictionary<string, Struct.UnitPlayerData> UnitPlayers { get; set; }
-        /** 总点赞数 **/
-        public long TotalLikeNum { get; set; }
-        /** 配置数量达到次数 **/
-        public long ConfigNum { get; set; }
+        public Dictionary<long, Struct.Actor> Actors { get; set; }
         /** 死亡的单位 **/
         public List<int> DeadUnits { get; set; }
         /** 死亡的单位玩家 **/
         public List<int> DeadUnitPlayer { get; set; }
+        /** 是否是一个保持玩家场景模型的场景, 如果需要单独在此列出 **/
+        public bool IsLeaveKeepObject { get; set; }
     }
 }

+ 0 - 3
DotNet/Model/Share/ConstGame.cs

@@ -10,9 +10,6 @@ namespace ET.Server
 
         [StaticField]
         public static string GameServerUUID = System.Guid.NewGuid().ToString();
-
-        [StaticField]
-        public static int[] TowerTemplateIDs = { 1001, 1002, 1003 };
     }
 
 }