public void Enter(MapUnit mapUnit, double position) { if (!IsOnSameRoom(mapUnit)) { return; } mapUnit.SendChannel = this; var obj = OtherHelper.Search(PositionMambers, e => e.Uid == mapUnit.Uid); if (obj == null) { PositionMambers.Add(mapUnit); } m2C_MapUnitCreate.MapUnitInfo = mapUnit.Info; SendMessage(m2C_MapUnitCreate); var lookAtSources = mapUnit.GetLookAtSources(); for (int i = 0; i < lookAtSources.Count; i++) { Look(lookAtSources[i]); } }
public void ModifyPosition(MapUnit mapUnit, double position) { position %= _roadDistance_m; bool IsInside = mapUnit.Block != null && mapUnit.Block.IsInside(position); if (!IsInside) { BlockChannel oldBlockChannel = null; BlockChannel newBlockChannel = null; //離開舊的Block if (mapUnit.Block != null) { oldBlockChannel = mapUnit.SendChannel; mapUnit.Block.Leave(mapUnit, false); } //加入新的Block for (int i = 0; i < _blocks.Count; i++) { if (_blocks[i].IsInside(position)) { _blocks[i].Enter(mapUnit, position, false); break; } } newBlockChannel = mapUnit.SendChannel; //清空舊的資料 _m2C_MapUnitCreateAndDestroy.CreateMapUnitInfos.Clear(); _m2C_MapUnitCreateAndDestroy.DestroyMapUnitIds.Clear(); //取得觀看的BlockChannel資訊 for (int i = 0; i < newBlockChannel.PositionMambers.Count; i++) { var rev = newBlockChannel.PositionMambers[i]; var info = rev.Info; //info.DebugId = IdGenerater.GenerateId(); //var list = mapUnit.GetLookAtSources(); //BsonDocument doc = new BsonDocument //{ // { "rev.Id" , rev?.Id }, // { "rev.MapAppId" , IdGenerater.GetAppId(rev == null ? 0 : rev.Id) }, // { "rev.Uid" , rev?.Uid }, // { "rev.RoomId" , rev?.RoomId }, // { "rev.Room.Id" , rev?.Room?.Id }, // { "rev.Block.room.Id" , rev?.Block?.room?.Id }, // { "rev.Block.roomId" , rev?.Block?.roomId }, // { "rev.Block.blockId" , rev?.Block?.blockId }, // { "sendToList", list.Select(e => $"MapUnitId:{e.Id}, Uid:{e.Uid}, BlockId:{e.Block?.blockId}").ToJson() } //}; //Log.Trace($"DebugId[{info.DebugId}]> {doc.ToJson()}"); _m2C_MapUnitCreateAndDestroy.CreateMapUnitInfos.Add(info); } //移除取消觀看的BlockChannel資訊 for (int i = 0; i < oldBlockChannel?.PositionMambers?.Count; i++) { if (_m2C_MapUnitCreateAndDestroy.CreateMapUnitInfos.Contains(oldBlockChannel.PositionMambers[i].Info)) { continue; } _m2C_MapUnitCreateAndDestroy.DestroyMapUnitIds.Add(oldBlockChannel.PositionMambers[i].Id); } MapMessageHelper.BroadcastTarget(_m2C_MapUnitCreateAndDestroy, mapUnit.GetLookAtSources()); } //更新MapUnit _m2C_MapUnitUpdate.MapUnitId = mapUnit.Id; _m2C_MapUnitUpdate.DistanceTravelledTarget = mapUnit.Info.DistanceTravelled; _m2C_MapUnitUpdate.SpeedMS = mapUnit.Info.SpeedMS; _m2C_MapUnitUpdate.DistanceTravelledUpdateUTCTick = System.DateTime.UtcNow.Ticks; SendMessage(mapUnit, _m2C_MapUnitUpdate); }