Example #1
0
    /// <summary>
    /// This function processes a packet and decides what to do next.
    /// </summary>
    /// <param name="packet">The packet to process</param>
    private void ProcessPacket(UdpReceiveResult res)
    {
        Buffer packet = Buffer.From(res.Buffer);

        if (packet.Length < 4)
        {
            return;                    // do nothing
        }
        string id = packet.ReadString(0, 4);

        switch (id)
        {
        case "REPL":
            ProcessPacketREPL(packet);
            break;

        case "PAWN":
            if (packet.Length < 5)
            {
                return;
            }

            ushort networkID = packet.ReadUInt16BE(4);
            controlledPawnNetID = networkID;
            var obj = NetworkObject.GetObjectByNetworkID(networkID);
            if (obj != null)
            {
                Pawn p = (Pawn)obj;

                if (p != null)
                {
                    p.canPlayerControl = true;
                }
                cam.orthographicSize = 6;
            }

            break;

        case "HOST":
            if (packet.Length < 7)
            {
                return;
            }

            ushort port       = packet.ReadUInt16BE(4);
            int    nameLength = packet.ReadUInt8(6);

            if (packet.Length < 7 + nameLength)
            {
                return;
            }

            string name = packet.ReadString(7, nameLength);

            AddToServerList(new RemoteServer(res.RemoteEndPoint, name));

            break;

        case "CHAT":
            if (packet.Length < 6)
            {
                return;
            }
            int    usernameLength = packet.ReadUInt8(4);
            ushort messageLength  = packet.ReadUInt16BE(5);
            string username       = packet.ReadString(7, usernameLength);
            string message        = packet.ReadString(7 + usernameLength, messageLength);
            chatController.AddMessageToChatDisplay($"{username}: {message}");
            print(message);
            break;

        case "STRT":
            if (ready)
            {
                chatController.gameObject.SetActive(false);
            }
            //PawnScores.singleton.gameObject.SetActive(true);
            break;
        }
    }