diff --git a/XNet.Business/Net/WsConnectionManager.cs b/XNet.Business/Net/WsConnectionManager.cs index c5406ca..1efe55d 100644 --- a/XNet.Business/Net/WsConnectionManager.cs +++ b/XNet.Business/Net/WsConnectionManager.cs @@ -82,16 +82,19 @@ namespace XNet.Business.Net { if (InstanceSubscribers.TryGetValue(roomId, out var room)) { + bool isHasUser = false; if (room.TryRemove(connId, out var playerRoom)) { if (player.Agent != null) { playerRoom?.Crowd?.RemoveAgent(player.Agent);//移除寻路索引 } + + isHasUser = playerRoom?.Players.Count(s => !s.Value.IsAI) > 0; } - //房间没有人了,把房间信息从相关集合移除 - if (room.IsEmpty) + //房间除了AI没有人了,把房间信息从相关集合移除 + if (!isHasUser || room.IsEmpty) { _sceneAgent.RemoveInstance(roomId); InstanceSubscribers.TryRemove(roomId, out _); diff --git a/XNet.Business/PathNavigation/SceneAgent.cs b/XNet.Business/PathNavigation/SceneAgent.cs index d36e294..55faf88 100644 --- a/XNet.Business/PathNavigation/SceneAgent.cs +++ b/XNet.Business/PathNavigation/SceneAgent.cs @@ -280,8 +280,8 @@ namespace XNet.Business.PathNavigation if (agent != null && agent.state != DtCrowdAgentState.DT_CROWDAGENT_STATE_INVALID) { agent.npos = realPos; - //agent.targetRef = targetRef; // ✅ 修正:绑定导航网格用nref - agent.targetRef = 0; // ✅ 清空寻路目标,避免瞬移后继续寻路 + agent.targetRef = targetRef; // ✅ 修正:绑定导航网格用nref + //agent.targetRef = 0; // ✅ 清空寻路目标,避免瞬移后继续寻路 agent.vel = agent.dvel = RcVec3f.Zero; ci.Crowd.ResetMoveTarget(agent); return true; diff --git a/XNet.Business/Tank/Manager/PlayerManager.cs b/XNet.Business/Tank/Manager/PlayerManager.cs index eed5726..51ef34a 100644 --- a/XNet.Business/Tank/Manager/PlayerManager.cs +++ b/XNet.Business/Tank/Manager/PlayerManager.cs @@ -475,6 +475,8 @@ namespace XNet.Business.Tank.Manager IsEnterMap = false }; + room.Players[aiPlayer.PlayerId] = aiPlayer; + await this.RequestInitPlayer(room, mapKey, aiPlayer, message); //可以移动了 @@ -549,8 +551,11 @@ namespace XNet.Business.Tank.Manager loginPlayer.Agent = _sceneAgent.AddAgent(room.RoomId, loginPlayer.CurrentPos, loginPlayer.Radius, loginPlayer.Radius, loginPlayer.PlayerId, loginPlayer.Speed * speedScale * 2, loginPlayer.Speed * speedScale); } - loginPlayer.TmpPos = loginPlayer.CurrentPos; - _sceneAgent.AgentTeleport(room.RoomId, loginPlayer.Agent.idx, loginPlayer.CurrentPos); + if (loginPlayer.Agent != null) + { + //loginPlayer.TmpPos = loginPlayer.CurrentPos; + _sceneAgent.AgentTeleport(room.RoomId, loginPlayer.Agent.idx, loginPlayer.CurrentPos); + } loginPlayer.IsEnterMap = true; if (!loginPlayer.IsAI) @@ -620,7 +625,7 @@ namespace XNet.Business.Tank.Manager foreach (var playerKv in room.Players) { var player = playerKv.Value; - if (!player.IsAI && player.IsEnterMap && player.PlayerId != client.PlayerId) + if (!player.IsAI && player.IsEnterMap)// && player.PlayerId != client.PlayerId) { var pos = client.CurrentPos * Global.LocationMultiply; var convertPos = new Vec3((int)pos.X, (int)pos.Y, (int)pos.Z); @@ -663,24 +668,24 @@ namespace XNet.Business.Tank.Manager var player = playerKv.Value; if (player.IsAI && player.IsEnterMap) { - var pos = client.CurrentPos * Global.LocationMultiply; + var pos = player.CurrentPos * Global.LocationMultiply; var convertPos = new Vec3((int)pos.X, (int)pos.Y, (int)pos.Z); - var euler = client.CurrentEuler * Global.LocationMultiply; + var euler = player.CurrentEuler * Global.LocationMultiply; var convertEuler = new Vec3((int)euler.X, (int)euler.Y, (int)euler.Z); - await _wsManager.SendBaseSingleMessage(player.PlayerId, WsMsgType.PRIVATGE, new PlayerInitSync + await _wsManager.SendBaseSingleMessage(client.PlayerId, WsMsgType.PRIVATGE, new PlayerInitSync { Type = WsMsgType.ADD_OR_UPDATE_PLAYER, - PlayerId = client.PlayerId, + PlayerId = player.PlayerId, IsAI = false, - NickName = client.NickName, - Blood = client.MaxBlood, - BodyIdx = client.BodyIdx, - ArmorIdx = client.ArmorIdx, - ChassisIdx = client.ChassisIdx, - DeviceColor = client.DeviceColor, - HeadImageUrl = client.HeadImageUrl, + NickName = player.NickName, + Blood = player.MaxBlood, + BodyIdx = player.BodyIdx, + ArmorIdx = player.ArmorIdx, + ChassisIdx = player.ChassisIdx, + DeviceColor = player.DeviceColor, + HeadImageUrl = player.HeadImageUrl, Position = convertPos, EulerAngles = convertEuler, });