This commit is contained in:
wuyanchen 2025-12-31 19:43:10 +08:00
parent 6fa9e619c5
commit 33a3657e2b
3 changed files with 26 additions and 18 deletions

View File

@ -82,16 +82,19 @@ namespace XNet.Business.Net
{ {
if (InstanceSubscribers.TryGetValue(roomId, out var room)) if (InstanceSubscribers.TryGetValue(roomId, out var room))
{ {
bool isHasUser = false;
if (room.TryRemove(connId, out var playerRoom)) if (room.TryRemove(connId, out var playerRoom))
{ {
if (player.Agent != null) if (player.Agent != null)
{ {
playerRoom?.Crowd?.RemoveAgent(player.Agent);//移除寻路索引 playerRoom?.Crowd?.RemoveAgent(player.Agent);//移除寻路索引
} }
isHasUser = playerRoom?.Players.Count(s => !s.Value.IsAI) > 0;
} }
//房间没有人了,把房间信息从相关集合移除 //房间除了AI没有人了,把房间信息从相关集合移除
if (room.IsEmpty) if (!isHasUser || room.IsEmpty)
{ {
_sceneAgent.RemoveInstance(roomId); _sceneAgent.RemoveInstance(roomId);
InstanceSubscribers.TryRemove(roomId, out _); InstanceSubscribers.TryRemove(roomId, out _);

View File

@ -280,8 +280,8 @@ namespace XNet.Business.PathNavigation
if (agent != null && agent.state != DtCrowdAgentState.DT_CROWDAGENT_STATE_INVALID) if (agent != null && agent.state != DtCrowdAgentState.DT_CROWDAGENT_STATE_INVALID)
{ {
agent.npos = realPos; agent.npos = realPos;
//agent.targetRef = targetRef; // ✅ 修正绑定导航网格用nref agent.targetRef = targetRef; // ✅ 修正绑定导航网格用nref
agent.targetRef = 0; // ✅ 清空寻路目标,避免瞬移后继续寻路 //agent.targetRef = 0; // ✅ 清空寻路目标,避免瞬移后继续寻路
agent.vel = agent.dvel = RcVec3f.Zero; agent.vel = agent.dvel = RcVec3f.Zero;
ci.Crowd.ResetMoveTarget(agent); ci.Crowd.ResetMoveTarget(agent);
return true; return true;

View File

@ -475,6 +475,8 @@ namespace XNet.Business.Tank.Manager
IsEnterMap = false IsEnterMap = false
}; };
room.Players[aiPlayer.PlayerId] = aiPlayer;
await this.RequestInitPlayer(room, mapKey, aiPlayer, message); 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.Agent = _sceneAgent.AddAgent(room.RoomId, loginPlayer.CurrentPos, loginPlayer.Radius, loginPlayer.Radius, loginPlayer.PlayerId, loginPlayer.Speed * speedScale * 2, loginPlayer.Speed * speedScale);
} }
loginPlayer.TmpPos = loginPlayer.CurrentPos; if (loginPlayer.Agent != null)
_sceneAgent.AgentTeleport(room.RoomId, loginPlayer.Agent.idx, loginPlayer.CurrentPos); {
//loginPlayer.TmpPos = loginPlayer.CurrentPos;
_sceneAgent.AgentTeleport(room.RoomId, loginPlayer.Agent.idx, loginPlayer.CurrentPos);
}
loginPlayer.IsEnterMap = true; loginPlayer.IsEnterMap = true;
if (!loginPlayer.IsAI) if (!loginPlayer.IsAI)
@ -620,7 +625,7 @@ namespace XNet.Business.Tank.Manager
foreach (var playerKv in room.Players) foreach (var playerKv in room.Players)
{ {
var player = playerKv.Value; 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 pos = client.CurrentPos * Global.LocationMultiply;
var convertPos = new Vec3((int)pos.X, (int)pos.Y, (int)pos.Z); 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; var player = playerKv.Value;
if (player.IsAI && player.IsEnterMap) 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 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); 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, Type = WsMsgType.ADD_OR_UPDATE_PLAYER,
PlayerId = client.PlayerId, PlayerId = player.PlayerId,
IsAI = false, IsAI = false,
NickName = client.NickName, NickName = player.NickName,
Blood = client.MaxBlood, Blood = player.MaxBlood,
BodyIdx = client.BodyIdx, BodyIdx = player.BodyIdx,
ArmorIdx = client.ArmorIdx, ArmorIdx = player.ArmorIdx,
ChassisIdx = client.ChassisIdx, ChassisIdx = player.ChassisIdx,
DeviceColor = client.DeviceColor, DeviceColor = player.DeviceColor,
HeadImageUrl = client.HeadImageUrl, HeadImageUrl = player.HeadImageUrl,
Position = convertPos, Position = convertPos,
EulerAngles = convertEuler, EulerAngles = convertEuler,
}); });