예제 #1
0
        void MyMultiplayerLobby_ClientLeft(ulong userId, ChatMemberStateChangeEnum stateChange)
        {
            if (userId == ServerId)
            {
                Peer2Peer.CloseSession(userId);
            }

            MySandboxGame.Log.WriteLineAndConsole("Player left: " + GetMemberName(userId) + " (" + userId + ")");
            MyTrace.Send(TraceWindow.Multiplayer, "Player left: " + stateChange.ToString());
        }
 void LogPlayers()
 {
     MyMwcLog.WriteLine("PLAYER LOG:");
     foreach (var player in Peers.Players)
     {
         string message = String.Format("User: {0,4} - {1,15}, GameId: {2,3}, EP: {3}, {4}", player.UserId, player.GetDisplayName(), player.PlayerId, player.Connection.RemoteEndpoint, player.Faction);
         MyTrace.Send(TraceWindow.MultiplayerAlerts, message);
         MyMwcLog.WriteLine(message);
     }
 }
예제 #3
0
        public override MyDownloadWorldResult DownloadWorld()
        {
            MyTrace.Send(TraceWindow.Multiplayer, "World request sent");
            MyDownloadWorldResult ret = new MyDownloadWorldResult(MyMultiplayer.WorldDownloadChannel, Lobby.GetOwner(), this);

            MyControlWorldRequestMsg msg = new MyControlWorldRequestMsg();

            SendControlMessage(ServerId, ref msg);
            return(ret);
        }
예제 #4
0
        public virtual void Dispose()
        {
            MyTrace.Send(TraceWindow.Multiplayer, "Multiplayer closed");
            m_voxelMapData = null;
            MyNetworkReader.ClearHandler(MyMultiplayer.ControlChannel);
            SyncLayer.TransportLayer.Clear();
            MyNetworkReader.Clear();

            MyMultiplayer.Static = null;
        }
예제 #5
0
        void MyDownloadWorldResult_Received(byte[] data, int dataSize, ulong sender, TimeSpan timestamp)
        {
            ProfilerShort.Begin("DownloadWorldChunk");

            Debug.Assert(State == MyDownloadWorldStateEnum.Established || State == MyDownloadWorldStateEnum.InProgress, "This should not be called, find why it's called");
            if (m_sender == sender)
            {
                var status = m_receiveMsg.Compose(data, dataSize);
                switch (status)
                {
                case MyMultipartMessage.Status.InProgress:
                    break;

                case MyMultipartMessage.Status.Finished:
                    Deregister();

                    m_receiveMsg.Stream.Position = 0;
                    if (m_receiveMsg.Stream.Length > 0)
                    {
                        MyObjectBuilder_World worldData;
                        if (Sandbox.Common.ObjectBuilders.Serializer.MyObjectBuilderSerializer.DeserializeGZippedXML(m_receiveMsg.Stream, out worldData))
                        {
                            WorldData = worldData;
                            State     = MyDownloadWorldStateEnum.Success;

                            MySandboxGame.Log.WriteLineAndConsole(String.Format("World download progress status: {0}, {1}", State.ToString(), this.Progress));
                        }
                        else
                        {
                            MySandboxGame.Log.WriteLine("Deserialization failed during world download.");
                            State = MyDownloadWorldStateEnum.DeserializationFailed;
                        }
                    }
                    else
                    {
                        State = MyDownloadWorldStateEnum.WorldNotAvailable;
                    }
                    break;

                case MyMultipartMessage.Status.Error:
                    Deregister();
                    MySandboxGame.Log.WriteLine("Invalid packet header.");
                    State = MyDownloadWorldStateEnum.InvalidMessage;
                    break;
                }

                m_mp.SendAck(sender);

                MyTrace.Send(TraceWindow.Multiplayer, String.Format("World download progress status: {0}, {1}", State.ToString(), this.Progress));
                RaiseProgressChanged();
            }

            ProfilerShort.End();
        }
        public void WriteTrace()
        {
            var smallShips = SectorObjects.OfType <MyMwcObjectBuilder_SmallShip>();

            MyTrace.Indent(TraceWindow.Saving, "SmallShips");
            foreach (var smallShip in smallShips)
            {
                MyTrace.Send(TraceWindow.Saving, smallShip.DisplayName);
            }
            MyTrace.UnIndent(TraceWindow.Saving);
        }
예제 #7
0
 private void DeactivatePhantom()
 {
     if (ENABLE_AABB_PHANTOM)
     {
         MyTrace.Send(TraceWindow.Analytics, "RemovePhantom-before");
         HavokWorld.RemovePhantom(m_aabbPhantom);
         MyTrace.Send(TraceWindow.Analytics, "RemovePhantom-after");
         Debug.Assert(m_nearbyEntities.Count == 0, "Inconsistent entities management");
         m_nearbyEntities.Clear();
     }
 }
예제 #8
0
        public void Receive()
        {
            NetIncomingMessage msg;

            while ((msg = this.ReadMessage()) != null)
            {
                if (msg.MessageType == NetIncomingMessageType.StatusChanged)
                {
                    var status = (NetConnectionStatus)msg.PeekByte();
                    if (status == NetConnectionStatus.Connected)
                    {
                        RaisePeerConnected(msg.SenderConnection);
                        if (msg.SenderConnection.RemoteHailMessage != null)
                        {
                            var hailMsg = msg.SenderConnection.RemoteHailMessage;
                            hailMsg.m_senderConnection = msg.SenderConnection;
                            hailMsg.m_senderEndpoint   = msg.SenderEndpoint;
                            // Recycle hail msg inside
                            OnMessageReceived(hailMsg);
                        }
                        // Process send queue
                        ProcessQueue();
                    }
                    else if (status == NetConnectionStatus.Disconnected)
                    {
                        RaisePeerDisconnected(msg.SenderConnection);
                    }
                    Recycle(msg);
                }
                else if (msg.MessageType == NetIncomingMessageType.NatIntroductionSuccess)
                {
                    RaiseNatIntroductionSuccess(msg.SenderEndpoint, msg.ReadString());
                    Recycle(msg);
                }
                else if (msg.MessageType == NetIncomingMessageType.Data)
                {
                    // Recycle inside
                    OnMessageReceived(msg);
                }
                else if (
                    //msg.MessageType == NetIncomingMessageType.DebugMessage ||
                    msg.MessageType == NetIncomingMessageType.WarningMessage ||
                    msg.MessageType == NetIncomingMessageType.ErrorMessage)
                {
                    var text = msg.ReadString();
                    MyTrace.Send(TraceWindow.MultiplayerAlerts, text);
                    Recycle(msg);
                }
                else
                {
                    Recycle(msg);
                }
            }
        }
예제 #9
0
 public void WriteTrace()
 {
     if (SectorObjectBuilder != null)
     {
         SectorObjectBuilder.WriteTrace();
     }
     else
     {
         MyTrace.Send(TraceWindow.Saving, "No sector object builder");
     }
     InventoryObjectBuilder.WriteTrace();
 }
예제 #10
0
        public void TravelLeave(MyMwcTravelTypeEnum travelType)
        {
            MyTrace.Send(TraceWindow.Saving, "Player.TravelLeave()");
            var handler = TravelLeaving;

            if (handler != null)
            {
                handler(travelType);
            }

            PackBeforeLeave(travelType);
        }
        private void RecreateWeldedShape(HkShape thisShape)
        {
            if (RigidBody == null || RigidBody.IsDisposed)
            {
                Debug.Fail("Missing rigid body");
                MyTrace.Send(TraceWindow.Analytics, "Recreating welded shape without RB", string.Format("{0},{1}", Entity.MarkedForClose, WeldInfo.Children.Count));
                return;
            }

            ProfilerShort.Begin("RecreateWeldedShape");
            //me.Tranform.Translation = Entity.PositionComp.LocalAABB.Center;

            if (WeldInfo.Children.Count == 0)
            {
                RigidBody.SetShape(thisShape);
                if (RigidBody2 != null)
                    RigidBody2.SetShape(thisShape);
            }
            else
            {
                ProfilerShort.Begin("Create shapes");
                //m_tmpElements.Add(WeldInfo.MassElement);
                m_tmpShapeList.Add(thisShape);
                foreach (var child in WeldInfo.Children)
                {
                    var transformShape = new HkTransformShape(child.WeldedRigidBody.GetShape(), ref child.WeldInfo.Transform);
                    HkShape.SetUserData(transformShape, child.WeldedRigidBody);
                    m_tmpShapeList.Add(transformShape);
                    //m_tmpElements.Add(child.WeldInfo.MassElement);
                }
                //var list = new HkListShape(m_tmpShapeList.ToArray(), HkReferencePolicy.None);
                var list = new HkSmartListShape(0);
                foreach (var shape in m_tmpShapeList)
                    list.AddShape(shape);
                RigidBody.SetShape(list);
                if (RigidBody2 != null)
                    RigidBody2.SetShape(list);
                list.Base.RemoveReference();

                WeldedMarkBreakable();

                for (int i = 1; i < m_tmpShapeList.Count; i++)
                    m_tmpShapeList[i].RemoveReference();
                m_tmpShapeList.Clear();
                ProfilerShort.End();

                ProfilerShort.Begin("CalcMassProps");
                UpdateMassProps();
                //m_tmpElements.Clear();
                ProfilerShort.End();
            }
            ProfilerShort.End();
        }
예제 #12
0
        void Matchmaking_LobbyChatUpdate(Lobby lobby, ulong changedUser, ulong makingChangeUser, ChatMemberStateChangeEnum stateChange)
        {
            //System.Diagnostics.Debug.Assert(MySession.Static != null);

            if (lobby.LobbyId == Lobby.LobbyId)
            {
                if (stateChange == ChatMemberStateChangeEnum.Entered)
                {
                    MySandboxGame.Log.WriteLineAndConsole("Player entered: " + MySteam.API.Friends.GetPersonaName(changedUser) + " (" + changedUser + ")");
                    MyTrace.Send(TraceWindow.Multiplayer, "Player entered");
                    Peer2Peer.AcceptSession(changedUser);

                    RaiseClientJoined(changedUser);

                    if (MySandboxGame.IsGameReady && changedUser != ServerId)
                    {
                        var playerJoined = new MyHudNotification(MySpaceTexts.NotificationClientConnected, 5000, level: MyNotificationLevel.Important);
                        playerJoined.SetTextFormatArguments(MySteam.API.Friends.GetPersonaName(changedUser));
                        MyHud.Notifications.Add(playerJoined);
                    }
                }
                else
                {
                    RaiseClientLeft(changedUser, stateChange);

                    if (changedUser == ServerId)
                    {
                        MyTrace.Send(TraceWindow.Multiplayer, "Host left: " + stateChange.ToString());
                        RaiseHostLeft();

                        MyGuiScreenMainMenu.UnloadAndExitToMenu();
                        MyGuiSandbox.AddScreen(MyGuiSandbox.CreateMessageBox(
                                                   messageCaption: MyTexts.Get(MySpaceTexts.MessageBoxCaptionError),
                                                   messageText: MyTexts.Get(MySpaceTexts.MultiplayerErrorServerHasLeft)));

                        // Set new server
                        //ServerId = Lobby.GetOwner();

                        //if (ServerId == Sync.MyId)
                        //{
                        //    Lobby.SetLobbyData(HostNameTag, Sync.MyName);
                        //}
                    }
                    else if (MySandboxGame.IsGameReady)
                    {
                        var playerLeft = new MyHudNotification(MySpaceTexts.NotificationClientDisconnected, 5000, level: MyNotificationLevel.Important);
                        playerLeft.SetTextFormatArguments(MySteam.API.Friends.GetPersonaName(changedUser));
                        MyHud.Notifications.Add(playerLeft);
                    }
                }
            }
        }
예제 #13
0
        public MyObjectBuilder_World ProcessWorldDownloadResult(MyDownloadWorldResult result)
        {
            MyTrace.Send(TraceWindow.Multiplayer, "World data processed");
            m_voxelMapData = result.WorldData.VoxelMaps.Dictionary;

            MyLog.Default.WriteLine("ProcessWorldDownloadResult voxel maps:");
            foreach (var voxelmap in m_voxelMapData)
            {
                MyLog.Default.WriteLine(voxelmap.Key);
            }

            return(result.WorldData);
        }
        void phantom_Leave(HkPhantomCallbackShape sender, HkRigidBody body)
        {
            var entity = body.GetEntity();

            lock (m_locker)
            {
                if (entity != null)
                {
                    m_containedEntities.Remove(entity);
                    MyTrace.Send(TraceWindow.EntityId, string.Format("Entity left gravity field, entity: {0}", entity));
                }
            }
        }
예제 #15
0
 private void DeactivatePhantom()
 {
     if (ENABLE_AABB_PHANTOM)
     {
         MyTrace.Send(TraceWindow.Analytics, "RemovePhantom-before");
         Debug.Assert(m_aabbPhantom != null);
         HavokWorld.RemovePhantom(m_aabbPhantom);
         MyTrace.Send(TraceWindow.Analytics, "RemovePhantom-after");
         // TODO(DI): Check if this assert is really not valid anymore
         //Debug.Assert(m_nearbyEntities.Count == 0, "Inconsistent entities management");
         m_nearbyEntities.Clear();
     }
 }
예제 #16
0
 public void WriteTrace()
 {
     MyTrace.Indent(TraceWindow.Saving, "Inventory SmallShips");
     foreach (var item in this.InventoryItems)
     {
         var smallShip = item.ItemObjectBuilder as MyMwcObjectBuilder_SmallShip;
         if (smallShip != null)
         {
             MyTrace.Send(TraceWindow.Saving, smallShip.DisplayName);
         }
     }
     MyTrace.UnIndent(TraceWindow.Saving);
 }
예제 #17
0
 private void ActivatePhantom()
 {
     if (ENABLE_AABB_PHANTOM)
     {
         var center = GetRigidBodyMatrix().Translation + m_voxelMap.SizeInMetresHalf;
         var size   = m_voxelMap.SizeInMetres;
         size *= m_phantomExtend;
         m_aabbPhantom.Aabb = new BoundingBox(center - 0.5f * size, center + 0.5f * size);
         MyTrace.Send(TraceWindow.Analytics, "AddPhantom-before");
         HavokWorld.AddPhantom(m_aabbPhantom);
         MyTrace.Send(TraceWindow.Analytics, "AddPhantom-after");
     }
 }
예제 #18
0
        public void SendMessage <TMessage>(ref TMessage msg, List <ulong> recipients, MyTransportMessageEnum messageType, bool includeSelf)
            where TMessage : struct
        {
            if (recipients.Count == 0 && !includeSelf)
            {
                return;
            }

            var msgId = GetId <TMessage>(messageType);
            ITransportCallback <TMessage> c = (ITransportCallback <TMessage>)m_callbacks[msgId.Item1].Callback;
            P2PMessageEnum sendType         = msgId.Item2;

            m_sendStream.Position = 0;
            m_sendStream.WriteByte((byte)MyMessageId.OLD_GAME_EVENT);
            m_sendStream.WriteUShort(msgId.Item1);
            c.Write(m_sendStream, ref msg);

            const int mtu = 1200;

            if ((sendType == P2PMessageEnum.Unreliable || sendType == P2PMessageEnum.UnreliableNoDelay) && m_sendStream.Position > mtu)
            {
                Debug.Fail("Sending unreliable message as reliable, because it's bigger than MTU, message type: " + FindDebugName(msgId.Item1));
                sendType = P2PMessageEnum.ReliableWithBuffering;
            }

            if (sendType == P2PMessageEnum.Reliable) // Always with buffering
            {
                sendType = P2PMessageEnum.ReliableWithBuffering;
            }

            Stats.Network.WriteFormat(StatName <TMessage> .Name, (int)m_sendStream.Position, VRage.Stats.MyStatTypeEnum.CounterSum, 1000, 0);

            if (!MySandboxGame.IsDedicated)
            {
                LogStats(SendStats, TypeNameHelper <TMessage> .Name, (int)m_sendStream.Position, recipients.Count, msgId.Item2);
            }

            if (includeSelf)
            {
                MyTrace.Send(TraceWindow.Multiplayer, "Loopback: " + typeof(TMessage).Name);
                m_loopback(m_sendStream.Data, (int)m_sendStream.Position, Sync.MyId);
            }

            foreach (var sendTo in recipients)
            {
                Debug.Assert(Sync.MultiplayerActive);
                TraceMessage("Sending: ", msg.ToString(), sendTo, m_sendStream.Position, sendType);
                SendMessage(m_sendStream, sendType, sendTo, m_channel);
            }
        }
예제 #19
0
        public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel)
        {
            var action = request.Headers.Action;

            action = action.Replace("http://tempuri.org/", "");
            action = action.Replace("IMySectorService", "");
            action = action.Replace("/", "");
            string message = "SERVER CALL: " + action;

            MyMwcLog.WriteLine(message);
            MyTrace.Send(TraceWindow.Server, message);
            // Not sure what return
            //return new System.Guid();
            return(null);
        }
        void phantom_Leave(HkPhantomCallbackShape sender, HkRigidBody body)
        {
            ProfilerShort.Begin("GravityLeave");
            var entity = MyPhysicsExtensions.GetEntity(body, 0);// jn: TODO we should collect bodies not entities

            lock (m_locker)
            {
                if (entity != null)
                {
                    m_containedEntities.Remove(entity);
                    MyTrace.Send(TraceWindow.EntityId, string.Format("Entity left gravity field, entity: {0}", entity));
                }
            }
            ProfilerShort.End();
        }
예제 #21
0
        public override void Dispose()
        {
            MyTrace.Send(TraceWindow.Multiplayer, "Multiplayer closed");
            MySteam.API.Matchmaking.LobbyChatUpdate -= Matchmaking_LobbyChatUpdate;
            //MySteam.API.Matchmaking.LobbyDataUpdate -= Matchmaking_LobbyDataUpdate;
            MySteam.API.Matchmaking.LobbyChatMsg -= Matchmaking_LobbyChatMsg;

            if (Lobby.IsValid)
            {
                MyTrace.Send(TraceWindow.Multiplayer, "Leaving lobby");
                CloseMemberSessions();
                Lobby.Leave();
            }

            base.Dispose();
        }
        private void CloseClient()
        {
            MyTrace.Send(TraceWindow.Multiplayer, "Multiplayer client closed");

            MyControlDisconnectedMsg msg = new MyControlDisconnectedMsg();

            msg.Client = Sync.MyId;

            SendControlMessage(ServerId, ref msg);
            OnJoin = null;

            //TODO: Any better way? P2P needs to be closed from both sides. If closed right after Send, message
            //can stay not sent.
            Thread.Sleep(200);

            CloseSession();
        }
예제 #23
0
        public void TravelEnter()
        {
            MyMwcLog.WriteLine("MyPlayer::TravelEnter - START");
            MyMwcLog.IncreaseIndent();

            MyTrace.Send(TraceWindow.Saving, "Player.TravelEnter()");
            UnpackAfterEnter();

            var handler = TravelEntered;

            if (handler != null)
            {
                handler();
            }

            MyMwcLog.DecreaseIndent();
            MyMwcLog.WriteLine("MyPlayer::TravelEnter - END");
        }
예제 #24
0
        void ITransportCallback.Receive(ByteStream source, ulong sender, TimeSpan timestamp)
        {
            TMsg msg;

            try
            {
                Serializer.Deserialize(source, out msg);
                MyTrace.Send(TraceWindow.Multiplayer, "Received control message: " + msg.ToString(), sender + ", " + source.Position + " B");
            }
            catch (Exception e)
            {
                // Catch, add more info (what message) and write to log
                MySandboxGame.Log.WriteLine(new Exception(String.Format("Error deserializing '{0}', message size '{1}'", typeof(TMsg).Name, source.Length), e));
                return;
            }

            Callback(ref msg, sender);
        }
        public override void Dispose()
        {
            MyTrace.Send(TraceWindow.Multiplayer, "Multiplayer closed");

            foreach (var member in m_members)
            {
                MyControlDisconnectedMsg msg = new MyControlDisconnectedMsg();
                msg.Client = ServerId;

                if (member != ServerId)
                {
                    SendControlMessage(member, ref msg);
                }
            }


            //TODO: Any better way? P2P needs to be closed from both sides. If closed right after Send, message
            //can stay not sent.
            Thread.Sleep(200);

            try
            {
                CloseMemberSessions();

                SteamSDK.SteamServerAPI.Instance.GameServer.EnableHeartbeats(false);

                base.Dispose();

                MyLog.Default.WriteLineAndConsole("Logging off Steam...");
                SteamSDK.SteamServerAPI.Instance.GameServer.LogOff();

                MyLog.Default.WriteLineAndConsole("Shutting down server...");
                SteamSDK.SteamServerAPI.Instance.GameServer.Shutdown();
                MyLog.Default.WriteLineAndConsole("Done");

                SteamSDK.Peer2Peer.SessionRequest   -= Peer2Peer_SessionRequest;
                SteamSDK.Peer2Peer.ConnectionFailed -= Peer2Peer_ConnectionFailed;
                ClientLeft -= MyDedicatedServer_ClientLeft;
            }
            catch (Exception ex)
            {
                MyLog.Default.WriteLineAndConsole("catch exception : " + ex.ToString());
            }
        }
        void phantom_Enter(HkPhantomCallbackShape sender, HkRigidBody body)
        {
            var entity = body.GetEntity();

            // HACK: disabled gravity for ships (there may be more changes so I won't add Entity.RespectsGravity now)
            lock (m_locker)
            {
                if (entity != null && !(entity is MyCubeGrid))
                {
                    MyTrace.Send(TraceWindow.EntityId, string.Format("Entity entered gravity field, entity: {0}", entity));
                    m_containedEntities.Add(entity);

                    if (entity.Physics.HasRigidBody)
                    {
                        ((MyPhysicsBody)entity.Physics).RigidBody.Activate();
                    }
                }
            }
        }
예제 #27
0
        private void PackDrones()
        {
            MyTrace.Send(TraceWindow.Saving, "Player packing drones");
            var drones = MySession.PlayerShip.Drones;

            if (drones != null && drones.Count > 0)
            {
                for (int index = drones.Count - 1; index >= 0; index--)
                {
                    var drone         = drones[index];
                    var inventoryItem = MyInventory.CreateInventoryItemFromObjectBuilder(drone.GetObjectBuilder(true));
                    MySession.Static.Inventory.AddInventoryItem(inventoryItem);

                    drone.MarkForClose();
                }

                MyTrace.Send(TraceWindow.Saving, "Drones found and packed");
            }
        }
예제 #28
0
        private bool RemoveCell(Vector3I cell)
        {
            if (!MyFakes.REMOVE_VOXEL_NAVMESH_CELLS)
            {
                return(true);
            }

            Debug.Assert(m_processedCells.Contains(cell), "Removing a non-existent cell from the navmesh!");
            if (!m_processedCells.Contains(cell))
            {
                return(false);
            }

            MyTrace.Send(TraceWindow.Ai, "Removing cell " + cell);

            ProfilerShort.Begin("Removing navmesh links");
            MyVoxelPathfinding.CellId cellId = new MyVoxelPathfinding.CellId()
            {
                VoxelMap = m_voxelMap, Pos = cell
            };
            m_navmeshCoordinator.RemoveVoxelNavmeshLinks(cellId);
            ProfilerShort.End();

            ProfilerShort.Begin("Removing triangles");
            MyCellCoord    coord        = new MyCellCoord(NAVMESH_LOD, cell);
            ulong          packedCoord  = coord.PackId64();
            MyIntervalList triangleList = m_higherLevelHelper.TryGetTriangleList(packedCoord);

            if (triangleList != null)
            {
                foreach (var triangleIndex in triangleList)
                {
                    RemoveTerrainTriangle(GetTriangle(triangleIndex));
                }
                m_higherLevelHelper.ClearCachedCell(packedCoord);
            }
            ProfilerShort.End();

            Debug.Assert(m_processedCells.Contains(ref cell));
            m_processedCells.Remove(ref cell);

            return(triangleList != null);
        }
예제 #29
0
        protected void OnWorldRequest(ref MyControlWorldRequestMsg data, ulong sender)
        {
            ProfilerShort.Begin("OnWorldRequest");

            MyTrace.Send(TraceWindow.Multiplayer, "World request received");

            MySandboxGame.Log.WriteLineAndConsole("World request received: " + GetMemberName(sender));

            if (IsClientKickedOrBanned(sender) || MySandboxGame.ConfigDedicated.Banned.Contains(sender))
            {
                MySandboxGame.Log.WriteLineAndConsole("Sending no world, because client has been kicked or banned: " + GetMemberName(sender) + " (Client is probably modified.)");
                RaiseClientLeft(sender, ChatMemberStateChangeEnum.Banned);
                return;
            }

            m_worldSendStream = new MemoryStream();

            if (IsServer && MySession.Static != null)
            {
                MySandboxGame.Log.WriteLine("...responding");

                MyObjectBuilder_World worldData = MySession.Static.GetWorld(false);
                var checkpoint = worldData.Checkpoint;
                checkpoint.WorkshopId                = null;
                checkpoint.CharacterToolbar          = null;
                checkpoint.Settings.ScenarioEditMode = checkpoint.Settings.ScenarioEditMode && !MySession.Static.LoadedAsMission;

                worldData.Clusters = new List <VRageMath.BoundingBoxD>();
                Sandbox.Engine.Physics.MyPhysics.SerializeClusters(worldData.Clusters);

                ProfilerShort.Begin("SerializeXML");
                MyObjectBuilderSerializer.SerializeXML(m_worldSendStream, worldData, MyObjectBuilderSerializer.XmlCompression.Gzip);
                ProfilerShort.BeginNextBlock("SendFlush");
                SyncLayer.TransportLayer.SendFlush(sender);
                ProfilerShort.End();
            }
            var buffer = m_worldSendStream.ToArray();
            MyMultipartSender msgSender = new MyMultipartSender(buffer, buffer.Length, sender, MyMultiplayer.WorldDownloadChannel, 1150);

            m_worldSenders[sender] = msgSender;

            ProfilerShort.End();
        }
예제 #30
0
        protected void OnConnectedClient(ref ConnectedClientDataMsg msg)
        {
            MySandboxGame.Log.WriteLineAndConsole("Client connected: " + msg.Name + " (" + msg.SteamID.ToString() + ")");
            MyTrace.Send(TraceWindow.Multiplayer, "Client connected");

            if (MySandboxGame.IsGameReady && msg.SteamID != ServerId && Sync.MyId != msg.SteamID && msg.Join)
            {
                var clientConnected = new MyHudNotification(MyCommonTexts.NotificationClientConnected, 5000, level: MyNotificationLevel.Important);
                clientConnected.SetTextFormatArguments(msg.Name);
                MyHud.Notifications.Add(clientConnected);
            }

            m_memberData[msg.SteamID] = new MyConnectedClientData()
            {
                Name    = msg.Name,
                IsAdmin = msg.IsAdmin
            };

            RaiseClientJoined(msg.SteamID);
        }