Beispiel #1
0
        public void Handle(PacketType packetType, IBitStream stream)
        {
            lock (this)
            {
                switch (packetType)
                {
                case PacketType.ConnectionAcknowledge:
                    break;    //now we can receive and send packets

                case PacketType.PingRequest:
                    uint type1 = 0;
                    uint Type2 = 0;
                    uint type3 = 0;
                    stream.ReadExtendedHeader(ref type1, ref Type2, ref type3);
                    uint i  = stream.ReadBits(1);
                    uint v4 = 0;
                    if (i == 1)
                    {
                        if (type1 != ClientPacketId && (v4 = (type1 - ClientPacketId) & 0x3F) <= 0x1F)
                        {
                            if (v4 > 1)
                            {
                                v28  += (int)v4 - 1;
                                v54 <<= (int)v4 - 1;
                            }
                            v54 *= 2;
                            ++v28;
                            ClientPacketId = type1;
                        }
                    }
                    uint token = stream.ReadBits(32);
                    SendPingResponse(token);
                    break;

                case PacketType.PingResponse:
                    break;

                case PacketType.Data:
                    uint t1 = 0;
                    uint clientPacketCounter = 0;    //a3 & 0x3F
                    uint t3 = 0;
                    stream.ReadExtendedHeader(ref clientPacketCounter, ref t1, ref t3);
                    int v11 = (int)(clientPacketCounter - ClientPacketId) & 0x3F;
                    if (v11 > 1)
                    {
                        v28  += v11 - 1;
                        v54 <<= v11 - 1;
                    }
                    v54            = 2 * v54 | 1;
                    ClientPacketId = clientPacketCounter;
                    var packetLength = stream.ReadBits(16);    //payload length in bytes
                    new PlayerActionManager().ProcessReceivedPacket(stream);
                    GameEventManager.ProcessReceivedPacket(stream);
                    new GhostManager().ProcessReceivedPacket(stream);
                    if (!IsAuthenticated && Config.LoadedMod.RequiresChallenge)    //create and send a challenge
                    {
                        var challenge = (IGameEvent)Activator.CreateInstance(Config.LoadedMod.ChallengeEvent);
                        challenge.Transmit(this);
                    }
                    Send();    //call send to send all queued events
                    break;

                case PacketType.Disconnect:
                    var err = stream.ReadBits(0x20);
                    //var msgLength = stream.ReadBits(0x10);
                    //var msg = stream.ReadString(msgLength);
                    break;
                }
            }
        }