void ParseServerData(IProxy sender, MessageEventArgs e) { RawData incomingData = new RawData(e.Data); int sequence = incomingData.ReadInt(); int inId = sequence & ~(1 << 31); if (inId <= _lastReceivedMessageId || sequence == -1) return; _lastReceivedMessageId = inId; int ack = incomingData.ReadInt(); Package<IServerCommand> package = incomingData.ReadServerPackage(); Package<IServerCommand> okPackage = new Package<IServerCommand>(); lock (_fakeServerCommands) { while (_fakeServerCommands.Count > 0) okPackage.Commands.Enqueue(_fakeServerCommands.Dequeue()); } if (OnServerPackage.Check(this, package)) { foreach (IServerCommand cmd in package.Commands) { switch (cmd.Type) { case ServerCommand.Disconnect: _lastReceivedMessageId = 0; _lastSentMessageId = 0; if (OnServerDisconnect.Check(this, (Disconnect)cmd)) okPackage.Commands.Enqueue(cmd); break; case ServerCommand.Layout: if(OnServerLayout.Check(this, (Layout)cmd)) okPackage.Commands.Enqueue(cmd); break; case ServerCommand.ServerData: if(OnServerData.Check(this, (ServerData)cmd)) okPackage.Commands.Enqueue(cmd); break; case ServerCommand.CenterPrint: if(OnServerCenterPrint.Check(this, (CenterPrint)cmd) && OnServerStringPackage.Check(this, (IServerStringPackage)cmd)) okPackage.Commands.Enqueue(cmd); break; case ServerCommand.Print: if(OnServerPrint.Check(this, (Print)cmd) && OnServerStringPackage.Check(this, (IServerStringPackage)cmd)) okPackage.Commands.Enqueue(cmd); break; case ServerCommand.StuffText: if(OnServerStuffText.Check(this, (StuffText)cmd) && OnServerStringPackage.Check(this, (IServerStringPackage)cmd)) okPackage.Commands.Enqueue(cmd); break; case ServerCommand.ConfigString: switch (((ConfigString)cmd).ConfigType) { case ConfigStringType.PlayerInfo: if(OnServerPlayerInfo.Check(this, (PlayerInfo)cmd) && OnServerConfigString.Check(this, (PlayerInfo)cmd) && OnServerStringPackage.Check(this, (PlayerInfo)cmd)) okPackage.Commands.Enqueue(cmd); break; default: if(OnServerConfigString.Check(this, (ConfigString)cmd) && OnServerStringPackage.Check(this, (ConfigString)cmd)) okPackage.Commands.Enqueue(cmd); break; } break; } } } okPackage.RemainingData = package.RemainingData; var finalServerPackage = new RawData(8 + okPackage.Size()); finalServerPackage.WriteInt(sequence); finalServerPackage.WriteInt(ack); okPackage.WriteTo(finalServerPackage); e.Data = finalServerPackage.Data; }