예제 #1
0
        internal MyMultiplayerBase(MySyncLayer syncLayer)
        {
            SyncLayer              = syncLayer;
            m_controlSendStream    = new ByteStream(64 * 1024, true);
            m_controlReceiveStream = new ByteStream();

            m_kickedClients = new Dictionary <ulong, int>();
            m_bannedClients = new HashSet <ulong>();

            m_lastKickUpdate = MySandboxGame.TotalTimeInMilliseconds;

            MyNetworkReader.SetHandler(MyMultiplayer.ControlChannel, ControlMessageReceived, DisconnectClient);

            RegisterControlMessage <MyControlWorldRequestMsg>(MyControlMessageEnum.WorldRequest, OnWorldRequest, MyMessagePermissions.ToServer);
            RegisterControlMessage <MyControlAckMessageMsg>(MyControlMessageEnum.Ack, OnAck, MyMessagePermissions.ToServer);
            RegisterControlMessage <MyControlAckHeaderMessageMsg>(MyControlMessageEnum.HeaderAck, OnHeaderAck, MyMessagePermissions.ToServer);
            RegisterControlMessage <MyControlKickClientMsg>(MyControlMessageEnum.Kick, OnClientKick, MyMessagePermissions.FromServer | MyMessagePermissions.ToServer);
            RegisterControlMessage <MyControlDisconnectedMsg>(MyControlMessageEnum.Disconnected, OnDisconnectedClient, MyMessagePermissions.FromServer | MyMessagePermissions.ToServer);
            RegisterControlMessage <MyControlBanClientMsg>(MyControlMessageEnum.Ban, OnClientBan, MyMessagePermissions.FromServer | MyMessagePermissions.ToServer);
            RegisterControlMessage <MyControlProfilerMsg>(MyControlMessageEnum.ProfilerRequest, OnProfilerRequest, MyMessagePermissions.ToServer);
            //m_serializers[typeof(MyControlMessageData)] = new XmlSerializer(typeof(MyControlMessageData));

            syncLayer.TransportLayer.DisconnectPeerOnError = DisconnectClient;

            // TODO: Remove
            //SyncLayer.TransportLayer.Register(MyMessageId.SERVER_UPDATE, OnServerPhysicsUpdate);
        }
예제 #2
0
        public void UnloadDataComponents(bool beforeLoadWorld = false)
        {
            // Unload in reverse so dependencies can be relied on.
            for (int i = m_loadOrder.Count - 1; i >= 0; --i)
            {
                m_loadOrder[i].UnloadDataConditional();
            }

            //foreach (var component in m_sessionComponents)
            //{
            //    component.UnloadDataConditional();
            //}

            MySessionComponentMapping.Clear();

            m_sessionComponents.Clear();
            m_loadOrder.Clear();

            foreach (var compList in m_sessionComponentsForUpdate.Values)
            {
                compList.Clear();
            }

            if (!beforeLoadWorld)
            {
                Sync.Players.UnregisterEvents();
                Sync.Clients.Clear();
                MyNetworkReader.Clear();
            }

            m_lasers.Clear();

            Ready = false;
        }
        protected override void UnloadData()
        {
            base.UnloadData();

            if (m_recording)
            {
                StopRecording();
            }

            MyNetworkReader.ClearHandler(MyMultiplayer.VoiceChatChannel);

            foreach (var pair in m_voices)
            {
                m_voices[pair.Key].StopSound(true, true);
                m_voices[pair.Key].Cleanup();
            }

            m_compressedVoiceBuffer   = null;
            m_uncompressedVoiceBuffer = null;
            m_voiceChatLogic          = null;
            m_VoIP = null;
            Static = null;
            m_receivedVoiceData = null;
            m_voices            = null;
            m_keys = null;

            Sync.Players.PlayerRemoved        -= Players_PlayerRemoved;
            MyAudio.Static.VoiceChatEnabled   -= Static_VoiceChatEnabled;
            MyHud.VoiceChat.VisibilityChanged -= VoiceChat_VisibilityChanged;
        }
예제 #4
0
        public MyTransportLayer(int channel)
        {
            m_channel       = channel;
            m_sendStream    = new ByteStream(64 * 1024, true);
            m_receiveStream = new ByteStream();

            m_loopback = MyNetworkReader.SetHandler(channel, HandleMessage, MyReceiveQueue.Mode.Timer, Timer);
        }
예제 #5
0
 public MyDownloadProfilerResult(int channel, ulong sender, MyMultiplayerBase mp)
 {
     m_mp         = mp;
     m_sender     = sender;
     m_channel    = channel;
     m_receiveMsg = new MyMultipartMessage(channel);
     MyNetworkReader.SetHandler(m_channel, MyDownloadProfilerResult_Received, mp.DisconnectClient);
 }
 public void Clear()
 {
     MyNetworkReader.ClearHandler(MyMultiplayer.GameEventChannel);
     if (m_buffer != null)
     {
         m_buffer.Clear();
     }
 }
예제 #7
0
 public MyDownloadWorldResult(int channel, ulong sender, MyMultiplayerBase mp)
 {
     m_mp      = mp;
     m_sender  = sender;
     m_channel = channel;
     MyNetworkReader.SetHandler(m_channel, MyDownloadWorldResult_Received);
     SteamSDK.Peer2Peer.ConnectionFailed += Peer2Peer_ConnectionFailed;
 }
예제 #8
0
 public MyDownloadWorldResult(int channel, ulong sender, MyMultiplayerBase mp)
 {
     m_mp         = mp;
     m_sender     = sender;
     m_channel    = channel;
     m_receiveMsg = new MyMultipartMessage(channel);
     MyNetworkReader.SetHandler(m_channel, MyDownloadWorldResult_Received, mp.DisconnectClient);
     SteamSDK.Peer2Peer.ConnectionFailed += Peer2Peer_ConnectionFailed;
 }
예제 #9
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;
        }
예제 #10
0
        public MyTransportLayer(int channel)
        {
            m_handlers.Add(MyMessageId.OLD_GAME_EVENT, HandleOldGameEvent);

            m_channel       = channel;
            m_sendStream    = new ByteStream(64 * 1024, true);
            m_receiveStream = new ByteStream();

            m_loopback = MyNetworkReader.SetHandler(channel, HandleMessage, MyReceiveQueue.Mode.Timer, Timer);
        }
예제 #11
0
 public virtual void Dispose()
 {
     MyNetworkMonitor.Dispose();
     this.m_voxelMapData = null;
     MyNetworkReader.ClearHandler(0);
     this.SyncLayer.TransportLayer.Clear();
     MyNetworkReader.Clear();
     this.m_sendPhysicsStream.Dispose();
     this.ReplicationLayer.Dispose();
     this.ClientKicked -= new Action <ulong>(this.KickClient);
     Sandbox.Engine.Multiplayer.MyMultiplayer.Static = null;
 }
예제 #12
0
 internal MyMultiplayerBase(MySyncLayer syncLayer)
 {
     this.SyncLayer              = syncLayer;
     this.IsConnectionDirect     = true;
     this.IsConnectionAlive      = true;
     this.m_kickedClients        = new ConcurrentDictionary <ulong, int>();
     this.m_bannedClients        = new MyConcurrentHashSet <ulong>();
     this.m_wrongPasswordClients = new Dictionary <ulong, int>();
     this.m_lastKickUpdate       = MySandboxGame.TotalTimeInMilliseconds;
     MyNetworkMonitor.Init();
     MyNetworkReader.SetHandler(0, new NetworkMessageDelegate(this.ControlMessageReceived), new Action <ulong>(this.DisconnectClient));
     this.RegisterControlMessage <MyControlKickClientMsg>(MyControlMessageEnum.Kick, new ControlMessageHandler <MyControlKickClientMsg>(this.OnClientKick), MyMessagePermissions.ToServer | MyMessagePermissions.FromServer);
     this.RegisterControlMessage <MyControlDisconnectedMsg>(MyControlMessageEnum.Disconnected, new ControlMessageHandler <MyControlDisconnectedMsg>(this.OnDisconnectedClient), MyMessagePermissions.ToServer | MyMessagePermissions.FromServer);
     this.RegisterControlMessage <MyControlBanClientMsg>(MyControlMessageEnum.Ban, new ControlMessageHandler <MyControlBanClientMsg>(this.OnClientBan), MyMessagePermissions.ToServer | MyMessagePermissions.FromServer);
     this.RegisterControlMessage <MyControlSendPasswordHashMsg>(MyControlMessageEnum.SendPasswordHash, new ControlMessageHandler <MyControlSendPasswordHashMsg>(this.OnPasswordHash), MyMessagePermissions.ToServer);
     syncLayer.TransportLayer.DisconnectPeerOnError = new Action <ulong>(this.DisconnectClient);
     this.ClientKicked += new Action <ulong>(this.KickClient);
 }
예제 #13
0
        internal MyMultiplayerBase(MySyncLayer syncLayer)
        {
            SyncLayer              = syncLayer;
            m_controlSendStream    = new ByteStream(64 * 1024, true);
            m_controlReceiveStream = new ByteStream();

            m_kickedClients = new Dictionary <ulong, int>();
            m_bannedClients = new HashSet <ulong>();

            m_lastKickUpdate = MySandboxGame.TotalTimeInMilliseconds;

            MyNetworkReader.SetHandler(MyMultiplayer.ControlChannel, ControlMessageReceived);

            RegisterControlMessage <MyControlWorldRequestMsg>(MyControlMessageEnum.WorldRequest, OnWorldRequest);
            RegisterControlMessage <MyControlAckMessageMsg>(MyControlMessageEnum.Ack, OnAck);
            RegisterControlMessage <MyControlKickClientMsg>(MyControlMessageEnum.Kick, OnClientKick);
            RegisterControlMessage <MyControlDisconnectedMsg>(MyControlMessageEnum.Disconnected, OnDisconnectedClient);
            RegisterControlMessage <MyControlBanClientMsg>(MyControlMessageEnum.Ban, OnClientBan);
            RegisterControlMessage <MyControlPingMsg>(MyControlMessageEnum.Ping, OnPing);
            //m_serializers[typeof(MyControlMessageData)] = new XmlSerializer(typeof(MyControlMessageData));
        }
예제 #14
0
        public override void LoadData()
        {
            base.LoadData();

            Static                    = this;
            m_VoIP                    = new VoIP();
            m_voiceChatLogic          = Activator.CreateInstance(MyPerGameSettings.VoiceChatLogic) as IMyVoiceChatLogic;
            m_recording               = false;
            m_compressedVoiceBuffer   = new byte[COMPRESSED_SIZE];
            m_uncompressedVoiceBuffer = new byte[UNCOMPRESSED_SIZE];
            m_voices                  = new Dictionary <ulong, MyEntity3DSoundEmitter>();
            m_receivedVoiceData       = new Dictionary <ulong, ReceivedData>();
            m_keys                    = new List <ulong>();

            Sync.Players.PlayerRemoved += Players_PlayerRemoved;

            m_enabled = MyAudio.Static.EnableVoiceChat;
            MyAudio.Static.VoiceChatEnabled   += Static_VoiceChatEnabled;
            MyHud.VoiceChat.VisibilityChanged += VoiceChat_VisibilityChanged;

            MyNetworkReader.SetHandler(MyMultiplayer.VoiceChatChannel, VoiceMessageReceived);
        }
예제 #15
0
        void MyDownloadProfilerResult_Received(byte[] data, int dataSize, ulong sender, MyTimeSpan timestamp, MyTimeSpan receivedTime)
        {
            if (m_finished)
            {
                m_mp.SendAck(sender, m_channel, m_receiveMsg.BlockCount - 1, m_receiveMsg.BlockCount);
                return;
            }

            if (m_sender == sender)
            {
                var status = m_receiveMsg.Compose(data, dataSize, sender);
                switch (status)
                {
                case MyMultipartMessage.Status.InProgress:
                    break;

                case MyMultipartMessage.Status.Finished:
                    MyNetworkReader.ClearHandler(m_channel);

                    m_receiveMsg.Stream.Position = 0;
                    if (m_receiveMsg.Stream.Length > 0)
                    {
                        MyObjectBuilder_Profiler profilerBuilder;
                        MyObjectBuilderSerializer.DeserializeGZippedXML(m_receiveMsg.Stream, out profilerBuilder);
                        VRage.Profiler.MyRenderProfiler.SelectedProfiler     = MyObjectBuilder_Profiler.Init(profilerBuilder);
                        VRage.Profiler.MyRenderProfiler.IsProfilerFromServer = true;
                    }
                    m_finished = true;
                    break;

                case MyMultipartMessage.Status.Error:
                    MyNetworkReader.ClearHandler(m_channel);
                    break;
                }
            }
        }
예제 #16
0
 private void Deregister()
 {
     MyNetworkReader.ClearHandler(m_channel);
     Peer2Peer.ConnectionFailed -= Peer2Peer_ConnectionFailed;
 }
예제 #17
0
 public void Clear()
 {
     MyNetworkReader.ClearHandler(MyMultiplayer.GameEventChannel);
 }
예제 #18
0
 public MyTransportLayer(int channel)
 {
     this.m_channel             = channel;
     this.DisconnectPeerOnError = null;
     MyNetworkReader.SetHandler(channel, new NetworkMessageDelegate(this.HandleMessage), x => this.DisconnectPeerOnError(x));
 }
예제 #19
0
 public void Clear()
 {
     MyNetworkReader.ClearHandler(2);
     this.ClearBuffer();
 }