static void Prefix(object __instance, MyPacketDataBitStreamBase data, CallSite site, object obj, IMyNetObject sendAs, Vector3D?position, EndpointId source, ref ProfilerToken?__localProfilerHandle) { if (!MethodIndices.TryGetValue(site.Id, out var methodIndex)) { var methodName = $"{Type.FullName}#OnEvent_{site.MethodInfo.Name}"; methodIndex = StringIndexer.Instance.IndexOf(methodName); MethodIndices.Add(site.Id, methodIndex); } __localProfilerHandle = ProfilerPatch.StartToken(__instance, methodIndex, Category); }
/// <summary> /// Replaces some truly awful Keencode that involves a handful of branches and callvirt /// for *each byte* in the byte array. This is at least a 5x improvement in tests. /// </summary> /// <param name="worldData"></param> /// <param name="sendTo"></param> private static void SendWorld(byte[] worldData, EndpointId sendTo) { IReplicationServerCallback callback = _getCallback((MyReplicationServer)MyMultiplayer.Static.ReplicationLayer); MyPacketDataBitStreamBase data = callback.GetBitStreamPacketData(); data.Stream.WriteVariant((uint)worldData.Length); for (var i = 0; i < worldData.Length; i++) { data.Stream.WriteByte(worldData[i]); } callback.SendWorld(data, sendTo); }
private void OnReplicationCreate(MyPacket packet) { packet.BitStream.ReadTypeId(); NetworkId networkId = packet.BitStream.ReadNetworkId(); MyPacketDataBitStreamBase bitStreamPacketData = MyNetworkWriter.GetBitStreamPacketData(); bitStreamPacketData.Stream.WriteNetworkId(networkId); bitStreamPacketData.Stream.WriteBool(true); bitStreamPacketData.Stream.Terminate(); this.SendReplicableReady(bitStreamPacketData); packet.Return(); }
private void SendUpdate() { MyPacketDataBitStreamBase bitStreamPacketData = MyNetworkWriter.GetBitStreamPacketData(); BitStream stream = bitStreamPacketData.Stream; stream.WriteByte(this.m_lastStateSyncPacketId, 8); stream.WriteByte((byte)this.m_acks.Count, 8); foreach (byte num2 in this.m_acks) { stream.WriteByte(num2, 8); } stream.Terminate(); this.m_acks.Clear(); this.SendClientAcks(bitStreamPacketData); bitStreamPacketData = MyNetworkWriter.GetBitStreamPacketData(); stream = bitStreamPacketData.Stream; this.m_clientPacketId = (byte)(this.m_clientPacketId + 1); stream.WriteByte(this.m_clientPacketId, 8); stream.WriteDouble(MyTimeSpan.FromTicks(Stopwatch.GetTimestamp()).Milliseconds); stream.WriteDouble(0.0); this.m_clientState.Serialize(stream, false); stream.Terminate(); this.SendClientUpdate(bitStreamPacketData); }
void IReplicationClientCallback.SendClientReady(MyPacketDataBitStreamBase data) { Sync.Layer.TransportLayer.SendMessage(MyMessageId.CLIENT_READY, data, true, new EndpointId(Sync.ServerId), 0); }