// this happens after approval (96% sure :p) private void ML_OnClientConnected(ulong _clientId) { if (!NetworkingManager.Singleton.IsHost && !NetworkingManager.Singleton.IsServer) { return; } Debug.Log("Client " + _clientId + " connected"); NetworkedClient client = NetworkingManager.Singleton.ConnectedClients[_clientId]; Player player = client.GetPlayer(); player.ClientId.Value = _clientId; player.Name.Value = connectionDataCache[_clientId].playerName; connectionDataCache.Remove(_clientId); using (PooledBitStream stream = PooledBitStream.Get()) { using (PooledBitWriter w = PooledBitWriter.Get(stream)) { w.WriteUInt64(player.NetworkedObject.NetworkId); CustomMessagingManager.SendNamedMessage("ClientConnected", AllClientIDs(), stream); } } }
public void Write(Stream stream) { using (PooledBitWriter writer = PooledBitWriter.Get(stream)) { writer.WriteUInt64(ID); writer.WriteString(Name); } }
internal void Tick(uint tick) { if (IsServer) { using (PooledBitStream stream = PooledBitStream.Get()) { using (PooledBitWriter writer = PooledBitWriter.Get(stream)) { writer.WriteUInt32(tick); Dictionary <ulong, IEntityState> states = new Dictionary <ulong, IEntityState>(entities.Count); foreach (Entity entity in entities.Values) { IEntityState state = entity.DoStateTick(tick); if (state != null) { states.Add(entity.NetworkId, state); } } writer.WriteInt32(states.Count); foreach (var state in states) { writer.WriteUInt64(state.Key); state.Value.Serialize(writer); } CustomMessagingManager.SendNamedMessage("NetworkState", null, stream); } } } else { foreach (Entity entity in entities.Values) { entity.DoStateTick(tick); } uint predictTicks = (uint)Math.Ceiling(RTT / FixedStep) + 2 * Deviation; for (uint i = 0; i < predictTicks; i++) { if (tick + i > LastPredictedTick) { using (PooledBitStream stream = PooledBitStream.Get()) { using (PooledBitWriter writer = PooledBitWriter.Get(stream)) { LastPredictedTick = tick + i; var authEntities = entities.Values.Where(e => e.IsOwner); int count = authEntities.Count(); Dictionary <ulong, IEntityInput> inputs = new Dictionary <ulong, IEntityInput>(count); foreach (Entity entity in authEntities) { IEntityInput input = entity.DoInputTick(tick + i); if (input != null) { inputs.Add(entity.NetworkId, input); } } writer.WriteUInt32(tick + i); writer.WriteInt32(inputs.Count); foreach (var input in inputs) { writer.WriteUInt64(input.Key); input.Value.Serialize(writer); } CustomMessagingManager.SendNamedMessage("NetworkInput", NetworkingManager.Singleton.ServerClientId, stream); } } } foreach (Entity entity in entities.Values.Where(e => e.extrapolate || e.IsOwner)) { entity.DoStateTick(tick + i); } } foreach (Entity entity in entities.Values) { entity.Present(); } } }