public static void Target096AttackSound(ReferenceHub target, ReferenceHub player)
        {
            NetworkWriter writer = NetworkWriterPool.GetWriter();

            player.SendRpcWriter(target.GetComponent <Scp096PlayerScript>(), typeof(Scp096PlayerScript), "RpcSyncAudio", writer, 0);
            NetworkWriterPool.Recycle(writer);
        }
        /// <summary>
        /// Sends discovery request from client
        /// </summary>
        public void BroadcastDiscoveryRequest()
        {
            if (clientUdpClient == null)
            {
                return;
            }

            IPEndPoint endPoint = new IPEndPoint(IPAddress.Broadcast, serverBroadcastListenPort);

            NetworkWriter writer = NetworkWriterPool.GetWriter();

            writer.WriteInt64(secretHandshake);

            try
            {
                Request request = GetRequest();

                request.Serialize(writer);

                ArraySegment <byte> data = writer.ToArraySegment();

                clientUdpClient.SendAsync(data.Array, data.Count, endPoint);
            }
            catch (Exception)
            {
                // It is ok if we can't broadcast to one of the addresses
            }
            finally
            {
                NetworkWriterPool.Recycle(writer);
            }
        }
        /// <summary>
        /// Reply to the client to inform it of this server
        /// </summary>
        /// <remarks>
        /// Override if you wish to ignore server requests based on
        /// custom criteria such as language, full server game mode or difficulty
        /// </remarks>
        /// <param name="request">Request comming from client</param>
        /// <param name="endpoint">Address of the client that sent the request</param>
        protected virtual void ProcessClientRequest(Request request, IPEndPoint endpoint)
        {
            Response info = ProcessRequest(request, endpoint);

            if (info == null)
            {
                return;
            }

            NetworkWriter writer = NetworkWriterPool.GetWriter();

            try
            {
                writer.WriteInt64(secretHandshake);

                info.Serialize(writer);

                ArraySegment <byte> data = writer.ToArraySegment();
                // signature matches
                // send response
                serverUdpClient.Send(data.Array, data.Count, endpoint);
            }
            catch (Exception ex)
            {
                Debug.LogException(ex, this);
            }
            finally
            {
                NetworkWriterPool.Recycle(writer);
            }
        }
Beispiel #4
0
    public void CmdDealCards()
    {
        PooledNetworkWriter writer = NetworkWriterPool.GetWriter();

        this.SendCommandInternal(typeof(PlayerManager), nameof(CmdDealCards), (NetworkWriter)writer, 0);
        NetworkWriterPool.Recycle(writer);
    }
Beispiel #5
0
        public void GrowCapacity()
        {
            NetworkWriterPool.Capacity = 1;

            // create and recycle one
            PooledNetworkWriter a = NetworkWriterPool.GetWriter();

            NetworkWriterPool.Recycle(a);

            // grow capacity
            NetworkWriterPool.Capacity = 2;

            // get two
            PooledNetworkWriter b = NetworkWriterPool.GetWriter();
            PooledNetworkWriter c = NetworkWriterPool.GetWriter();

            Assert.That(b, !Is.Null);
            Assert.That(c, !Is.Null);

            // exactly one should be reused, one should be new
            bool bReused = b == a;
            bool cReused = c == a;

            Assert.That((bReused && !cReused) ||
                        (!bReused && cReused));
        }
Beispiel #6
0
        public void PoolReUsesWritersUpToSizeLimit()
        {
            NetworkWriterPool.Capacity = 1;

            // get 2 writers
            PooledNetworkWriter a = NetworkWriterPool.GetWriter();
            PooledNetworkWriter b = NetworkWriterPool.GetWriter();

            // recycle all
            NetworkWriterPool.Recycle(a);
            ExpectWarn("NetworkWriterPool.Recycle, Pool was full leaving extra writer for GC", () =>
            {
                NetworkWriterPool.Recycle(b);
            });

            // get 2 new ones
            PooledNetworkWriter c = NetworkWriterPool.GetWriter();
            PooledNetworkWriter d = NetworkWriterPool.GetWriter();

            // exactly one should be reused, one should be new
            bool cReused = c == a || c == b;
            bool dReused = d == a || d == b;

            Assert.That((cReused && !dReused) ||
                        (!cReused && dReused));
        }
Beispiel #7
0
    private void CmdTapCard(GameObject card)
    {
        PooledNetworkWriter writer = NetworkWriterPool.GetWriter();

        writer.WriteGameObject(card);
        this.SendCommandInternal(typeof(PlayerManager), nameof(CmdTapCard), (NetworkWriter)writer, 0);
        NetworkWriterPool.Recycle(writer);
    }
Beispiel #8
0
    private void RpcShowCard(GameObject card, string type, GameObject destination)
    {
        PooledNetworkWriter writer = NetworkWriterPool.GetWriter();

        writer.WriteGameObject(card);
        writer.WriteString(type);
        writer.WriteGameObject(destination);
        this.SendRPCInternal(typeof(PlayerManager), nameof(RpcShowCard), (NetworkWriter)writer, 0, false);
        NetworkWriterPool.Recycle(writer);
    }
Beispiel #9
0
        /// <summary>
        /// Send fake values to client's <see cref="Mirror.SyncObject"/>.
        /// </summary>
        /// <param name="target">Target to send.</param>
        /// <param name="behaviorOwner"><see cref="Mirror.NetworkIdentity"/> of object that owns <see cref="Mirror.NetworkBehaviour"/>.</param>
        /// <param name="targetType"><see cref="Mirror.NetworkBehaviour"/>'s type.</param>
        /// <param name="customAction">Custom writing action.</param>
        public static void SendFakeSyncObject(Player target, NetworkIdentity behaviorOwner, Type targetType, Action <NetworkWriter> customAction)
        {
            NetworkWriter writer  = NetworkWriterPool.GetWriter();
            NetworkWriter writer2 = NetworkWriterPool.GetWriter();

            MakeCustomSyncWriter(behaviorOwner, targetType, customAction, null, writer, writer2);
            NetworkServer.SendToClientOfPlayer(target.ReferenceHub.networkIdentity, new UpdateVarsMessage()
            {
                netId = behaviorOwner.netId, payload = writer.ToArraySegment()
            });
            NetworkWriterPool.Recycle(writer);
            NetworkWriterPool.Recycle(writer2);
        }
Beispiel #10
0
        public void DimScreen()
        {
            var component = RoundSummary.singleton;
            var writer    = NetworkWriterPool.GetWriter();
            var msg       = new RpcMessage
            {
                netId          = component.netId,
                componentIndex = component.ComponentIndex,
                functionHash   = typeof(RoundSummary).FullName.GetStableHashCode() * 503 + "RpcDimScreen".GetStableHashCode(),
                payload        = writer.ToArraySegment()
            };

            Connection.Send(msg);
            NetworkWriterPool.Recycle(writer);
        }
Beispiel #11
0
        public void ShakeScreen(bool achieve = false)
        {
            var component = AlphaWarheadController.Host;
            var writer    = NetworkWriterPool.GetWriter();

            writer.WriteBoolean(achieve);
            var msg = new RpcMessage
            {
                netId          = component.netId,
                componentIndex = component.ComponentIndex,
                functionHash   = typeof(AlphaWarheadController).FullName.GetStableHashCode() * 503 + "RpcShake".GetStableHashCode(),
                payload        = writer.ToArraySegment()
            };

            Connection.Send(msg);
            NetworkWriterPool.Recycle(writer);
        }
 public override bool ServerSend(int connectionId, int channelId, NetworkWriter data)
 {
     try
     {
         ArraySegment <byte> bytes = data.ToArraySegment();
         // ReSharper disable once ConvertIfStatementToReturnStatement
         if (channelId < channels.Length)
         {
             return(LiteNetLib4MirrorServer.Send(connectionId, channels[channelId], bytes.Array, bytes.Offset, bytes.Count, (byte)channelId));
         }
         return(LiteNetLib4MirrorServer.Send(connectionId, channels[0], bytes.Array, bytes.Offset, bytes.Count, 0));
     }
     finally
     {
         NetworkWriterPool.Recycle(data);
     }
 }
Beispiel #13
0
        public void SendToServer(ushort port)
        {
            var component = SynapseController.Server.Host.PlayerStats;
            var writer    = NetworkWriterPool.GetWriter();

            writer.WriteSingle(1f);
            writer.WriteUInt16(port);
            var msg = new RpcMessage
            {
                netId          = component.netId,
                componentIndex = component.ComponentIndex,
                functionHash   = typeof(PlayerStats).FullName.GetStableHashCode() * 503 + "RpcRoundrestartRedirect".GetStableHashCode(),
                payload        = writer.ToArraySegment()
            };

            Connection.Send(msg);
            NetworkWriterPool.Recycle(writer);
        }
Beispiel #14
0
        //Source: https://gist.github.com/sanyae2439/dbb0b4b439ad4a2a0f6c42d68e2c82dc

        /// <summary>
        /// Send custom values to client's <see cref="Mirror.SyncVarAttribute"/>.
        /// </summary>
        /// <param name="target">Target to send.</param>
        /// <param name="behaviorOwner"><see cref="Mirror.NetworkIdentity"/> of object that owns <see cref="Mirror.NetworkBehaviour"/>.</param>
        /// <param name="targetType"><see cref="Mirror.NetworkBehaviour"/>'s type.</param>
        /// <param name="propertyName">Property name starting with Network.</param>
        /// <param name="value">Value of send to target.</param>
        public static void SendCustomSyncVar(this Player target, NetworkIdentity behaviorOwner, Type targetType, string propertyName, object value)
        {
            Action <NetworkWriter> customSyncVarGenerator = (targetWriter) => {
                targetWriter.WritePackedUInt64(GetDirtyBit(targetType, propertyName));
                GetWriteExtension(value)?.Invoke(null, new object[] { targetWriter, value });
            };

            NetworkWriter writer  = NetworkWriterPool.GetWriter();
            NetworkWriter writer2 = NetworkWriterPool.GetWriter();

            MakeCustomSyncWriter(behaviorOwner, targetType, null, customSyncVarGenerator, writer, writer2);
            NetworkServer.SendToClientOfPlayer(target.ReferenceHub.networkIdentity, new UpdateVarsMessage()
            {
                netId = behaviorOwner.netId, payload = writer.ToArraySegment()
            });
            NetworkWriterPool.Recycle(writer);
            NetworkWriterPool.Recycle(writer2);
        }
        public void SendClientToServer(Player hub, ushort port)
        {
            var           serverPS = PlayerManager.localPlayer.GetComponent <PlayerStats>();
            NetworkWriter writer   = NetworkWriterPool.GetWriter();

            writer.WriteSingle(1f);
            writer.WriteUInt16(port);
            RpcMessage msg = new RpcMessage
            {
                netId          = serverPS.netId,
                componentIndex = serverPS.ComponentIndex,
                functionHash   = GetMethodHash(typeof(PlayerStats), "RpcRoundrestartRedirect"),
                payload        = writer.ToArraySegment()
            };

            hub.Connection.Send <RpcMessage>(msg, 0);
            NetworkWriterPool.Recycle(writer);
        }
Beispiel #16
0
        public void PlaceBlood(Vector3 pos, int type = 1, float size = 2f)
        {
            var component = ClassManager;
            var writer    = NetworkWriterPool.GetWriter();

            writer.WriteVector3(pos);
            writer.WritePackedInt32(type);
            writer.WriteSingle(size);
            var msg = new RpcMessage
            {
                netId          = component.netId,
                componentIndex = component.ComponentIndex,
                functionHash   = typeof(CharacterClassManager).FullName.GetStableHashCode() * 503 + "RpcPlaceBlood".GetStableHashCode(),
                payload        = writer.ToArraySegment()
            };

            Connection.Send(msg);
            NetworkWriterPool.Recycle(writer);
        }
Beispiel #17
0
        /// <summary>
        /// Send fake values to client's <see cref="Mirror.SyncVarAttribute"/>.
        /// </summary>
        /// <param name="target">Target to send.</param>
        /// <param name="behaviorOwner"><see cref="Mirror.NetworkIdentity"/> of object that owns <see cref="Mirror.NetworkBehaviour"/>.</param>
        /// <param name="targetType"><see cref="Mirror.NetworkBehaviour"/>'s type.</param>
        /// <param name="propertyName">Property name starting with Network.</param>
        /// <param name="value">Value of send to target.</param>
        public static void SendFakeSyncVar(this Player target, NetworkIdentity behaviorOwner, Type targetType, string propertyName, object value)
        {
            void CustomSyncVarGenerator(NetworkWriter targetWriter)
            {
                targetWriter.WriteUInt64(SyncVarDirtyBits[$"{propertyName}"]);
                WriterExtensions[value.GetType()]?.Invoke(null, new object[] { targetWriter, value });
            }

            PooledNetworkWriter writer  = NetworkWriterPool.GetWriter();
            PooledNetworkWriter writer2 = NetworkWriterPool.GetWriter();

            MakeCustomSyncWriter(behaviorOwner, targetType, null, CustomSyncVarGenerator, writer, writer2);
            target.ReferenceHub.networkIdentity.connectionToClient.Send(new UpdateVarsMessage()
            {
                netId = behaviorOwner.netId, payload = writer.ToArraySegment()
            });
            NetworkWriterPool.Recycle(writer);
            NetworkWriterPool.Recycle(writer2);
        }
Beispiel #18
0
        public void ShrinkCapacity()
        {
            NetworkWriterPool.Capacity = 2;

            // get writer and recycle so we have 2 in there, hence 'next' is at limit
            PooledNetworkWriter a = NetworkWriterPool.GetWriter();
            PooledNetworkWriter b = NetworkWriterPool.GetWriter();

            NetworkWriterPool.Recycle(a);
            NetworkWriterPool.Recycle(b);

            // shrink
            NetworkWriterPool.Capacity = 1;

            // get one. should return the only one which is still in there.
            PooledNetworkWriter c = NetworkWriterPool.GetWriter();

            Assert.That(c, !Is.Null);
            Assert.That(c == a || c == b);
        }
Beispiel #19
0
        /// <summary>
        /// Send fake values to client's <see cref="Mirror.ClientRpcAttribute"/>.
        /// </summary>
        /// <param name="target">Target to send.</param>
        /// <param name="behaviorOwner"><see cref="Mirror.NetworkIdentity"/> of object that owns <see cref="Mirror.NetworkBehaviour"/>.</param>
        /// <param name="targetType"><see cref="Mirror.NetworkBehaviour"/>'s type.</param>
        /// <param name="rpcName">Property name starting with Rpc.</param>
        /// <param name="values">Values of send to target.</param>
        public static void SendFakeTargetRpc(Player target, NetworkIdentity behaviorOwner, Type targetType, string rpcName, params object[] values)
        {
            NetworkWriter writer = NetworkWriterPool.GetWriter();

            foreach (var value in values)
            {
                WriterExtensions[value.GetType()].Invoke(null, new object[] { writer, value });
            }

            var msg = new RpcMessage
            {
                netId          = behaviorOwner.netId,
                componentIndex = GetComponentIndex(behaviorOwner, targetType),
                functionHash   = (targetType.FullName.GetStableHashCode() * 503) + rpcName.GetStableHashCode(),
                payload        = writer.ToArraySegment(),
            };

            target.Connection.Send(msg, 0);
            NetworkWriterPool.Recycle(writer);
        }
Beispiel #20
0
        /// <summary>
        /// Send custom values to client's SyncObject.
        /// </summary>
        /// <param name="target">Target to send.</param>
        /// <param name="behaviorOwner"><see cref="Mirror.NetworkIdentity"/> of object that owns <see cref="Mirror.NetworkBehaviour"/>.</param>
        /// <param name="targetType"><see cref="Mirror.NetworkBehaviour"/>'s type.</param>
        /// <param name="customAction">Custom writing action.</param>
        public static void SendCustomSyncObject(this Player target, NetworkIdentity behaviorOwner, Type targetType, Action <NetworkWriter> customAction)
        {
            /*
             * Cant be use if you dont understand(ill make more use easily soonTM)
             * Example(SyncList) [EffectOnlySCP207]:
             * player.SendCustomSync(player.ReferenceHub.networkIdentity, typeof(PlayerEffectsController), (writer) => {
             *      writer.WritePackedUInt64(1ul);								// DirtyObjectsBit
             *      writer.WritePackedUInt32((uint)1);							// DirtyIndexCount
             *      writer.WriteByte((byte)SyncList<byte>.Operation.OP_SET);	// Operations
             *      writer.WritePackedUInt32((uint)0);							// EditIndex
             *      writer.WriteByte((byte)1);									// Item
             * });
             */
            NetworkWriter writer  = NetworkWriterPool.GetWriter();
            NetworkWriter writer2 = NetworkWriterPool.GetWriter();

            MakeCustomSyncWriter(behaviorOwner, targetType, customAction, null, writer, writer2);
            NetworkServer.SendToClientOfPlayer(target.ReferenceHub.networkIdentity, new UpdateVarsMessage()
            {
                netId = behaviorOwner.netId, payload = writer.ToArraySegment()
            });
            NetworkWriterPool.Recycle(writer);
            NetworkWriterPool.Recycle(writer2);
        }