예제 #1
0
        public static void ParseFrame( )
        {
            Int32   cmd;
            Int32   len;
            frame_t old;

            Globals.cl.frame.Reset();
            Globals.cl.frame.serverframe = MSG.ReadLong(Globals.net_message);
            Globals.cl.frame.deltaframe  = MSG.ReadLong(Globals.net_message);
            Globals.cl.frame.servertime  = Globals.cl.frame.serverframe * 100;
            if (Globals.cls.serverProtocol != 26)
            {
                Globals.cl.surpressCount = MSG.ReadByte(Globals.net_message);
            }
            if (Globals.cl_shownet.value == 3)
            {
                Com.Printf("   frame:" + Globals.cl.frame.serverframe + "  delta:" + Globals.cl.frame.deltaframe + "\\n");
            }
            if (Globals.cl.frame.deltaframe <= 0)
            {
                Globals.cl.frame.valid = true;
                old = null;
                Globals.cls.demowaiting = false;
            }
            else
            {
                old = Globals.cl.frames[Globals.cl.frame.deltaframe & Defines.UPDATE_MASK];
                if (!old.valid)
                {
                    Com.Printf("Delta from invalid frame (not supposed to happen!).\\n");
                }

                if (old.serverframe != Globals.cl.frame.deltaframe)
                {
                    Com.Printf("Delta frame too old.\\n");
                }
                else if (Globals.cl.parse_entities - old.parse_entities > Defines.MAX_PARSE_ENTITIES - 128)
                {
                    Com.Printf("Delta parse_entities too old.\\n");
                }
                else
                {
                    Globals.cl.frame.valid = true;
                }
            }

            if (Globals.cl.time > Globals.cl.frame.servertime)
            {
                Globals.cl.time = Globals.cl.frame.servertime;
            }
            else if (Globals.cl.time < Globals.cl.frame.servertime - 100)
            {
                Globals.cl.time = Globals.cl.frame.servertime - 100;
            }
            len = MSG.ReadByte(Globals.net_message);
            MSG.ReadData(Globals.net_message, Globals.cl.frame.areabits, len);
            cmd = MSG.ReadByte(Globals.net_message);
            CL_parse.SHOWNET(CL_parse.svc_strings[cmd]);
            if (cmd != Defines.svc_playerinfo)
            {
                Com.Error(Defines.ERR_DROP, "CL_ParseFrame: not playerinfo");
            }
            ParsePlayerstate(old, Globals.cl.frame);
            cmd = MSG.ReadByte(Globals.net_message);
            CL_parse.SHOWNET(CL_parse.svc_strings[cmd]);
            if (cmd != Defines.svc_packetentities)
            {
                Com.Error(Defines.ERR_DROP, "CL_ParseFrame: not packetentities");
            }
            ParsePacketEntities(old, Globals.cl.frame);
            Globals.cl.frames[Globals.cl.frame.serverframe & Defines.UPDATE_MASK].Set(Globals.cl.frame);
            if (Globals.cl.frame.valid)
            {
                if (Globals.cls.state != Defines.ca_active)
                {
                    Globals.cls.state              = Defines.ca_active;
                    Globals.cl.force_refdef        = true;
                    Globals.cl.predicted_origin[0] = Globals.cl.frame.playerstate.pmove.origin[0] * 0.125F;
                    Globals.cl.predicted_origin[1] = Globals.cl.frame.playerstate.pmove.origin[1] * 0.125F;
                    Globals.cl.predicted_origin[2] = Globals.cl.frame.playerstate.pmove.origin[2] * 0.125F;
                    Math3D.VectorCopy(Globals.cl.frame.playerstate.viewangles, Globals.cl.predicted_angles);
                    if (Globals.cls.disable_servercount != Globals.cl.servercount && Globals.cl.refresh_prepped)
                    {
                        SCR.EndLoadingPlaque();
                    }
                }

                Globals.cl.sound_prepped = true;
                FireEntityEvents(Globals.cl.frame);
                CL_pred.CheckPredictionError();
            }
        }