/// <summary> /// Initializes a new instance of the MyMultiplayerServerBase class. /// </summary> /// <param name="localClientEndpoint">Local client endpoint (for single player or lobby host) or null (for dedicated server)</param> public MyMultiplayerServerBase(MySyncLayer syncLayer, EndpointId? localClientEndpoint) : base(syncLayer) { Debug.Assert(MyEntities.GetEntities().Count == 0, "Multiplayer server must be created before any entities are loaded!"); var replication = new MyReplicationServer(this, () => MySandboxGame.Static.UpdateTime, localClientEndpoint); if (MyFakes.MULTIPLAYER_REPLICATION_TEST) { replication.MaxSleepTime = MyTimeSpan.FromSeconds(30); } SetReplicationLayer(replication); ClientLeft += (steamId, e) => ReplicationLayer.OnClientLeft(new EndpointId(steamId)); MyEntities.OnEntityCreate += CreateReplicableForObject; MyEntityComponentBase.OnAfterAddedToContainer += CreateReplicableForObject; MyExternalReplicable.Destroyed += DestroyReplicable; foreach (var entity in MyEntities.GetEntities()) { CreateReplicableForObject(entity); var components = entity.Components; if (components != null) { foreach (var comp in components) CreateReplicableForObject(comp); } } syncLayer.TransportLayer.Register(MyMessageId.RPC, ReplicationLayer.ProcessEvent); syncLayer.TransportLayer.Register(MyMessageId.REPLICATION_READY, ReplicationLayer.ReplicableReady); syncLayer.TransportLayer.Register(MyMessageId.CLIENT_UPDATE, ReplicationLayer.OnClientUpdate); syncLayer.TransportLayer.Register(MyMessageId.CLIENT_READY, (p) => ClientReady(p)); }
public MyMultiplayerServerBase(MySyncLayer syncLayer) : base(syncLayer) { var replication = new MyReplicationServer(this, () => MySandboxGame.Static.UpdateTime); if (MyFakes.MULTIPLAYER_REPLICATION_TEST) { replication.MaxSleepTime = MyTimeSpan.FromSeconds(30); } SetReplicationLayer(replication); ClientLeft += (steamId, e) => ReplicationLayer.OnClientLeft(new EndpointId(steamId)); MyEntities.OnEntityCreate += CreateReplicableForObject; MyInventory.OnCreated += CreateReplicableForObject; MyExternalReplicable.Destroyed += DestroyReplicable; foreach (var entity in MyEntities.GetEntities()) { CreateReplicableForObject(entity); } syncLayer.TransportLayer.Register(MyMessageId.RPC, ReplicationLayer.ProcessEvent); syncLayer.TransportLayer.Register(MyMessageId.REPLICATION_READY, ReplicationLayer.ReplicableReady); syncLayer.TransportLayer.Register(MyMessageId.CLIENT_UPDATE, ReplicationLayer.OnClientUpdate); syncLayer.TransportLayer.Register(MyMessageId.CLIENT_READY, (p) => ReplicationLayer.OnClientReady(p.Sender, new MyClientState())); }
public void Dispose() { if (m_server != null) { m_server.m_replicationPaused = m_oldValue; if (!m_server.m_replicationPaused) m_server.ResumeReplication(); m_server = null; } }
public PauseToken(MyReplicationServer server) { m_server = server; m_oldValue = server.m_replicationPaused; server.m_replicationPaused = true; }