⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sv_user.java

📁 JAKE2用JAVA写的queck2的3D游戏开发引擎
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
        if (SV_MAIN.sv_client.download == null)            return;        r = SV_MAIN.sv_client.downloadsize - SV_MAIN.sv_client.downloadcount;        if (r > 1024)            r = 1024;        MSG.WriteByte(SV_MAIN.sv_client.netchan.message, Defines.svc_download);        MSG.WriteShort(SV_MAIN.sv_client.netchan.message, r);        SV_MAIN.sv_client.downloadcount += r;        size = SV_MAIN.sv_client.downloadsize;        if (size == 0)            size = 1;        percent = SV_MAIN.sv_client.downloadcount * 100 / size;        MSG.WriteByte(SV_MAIN.sv_client.netchan.message, percent);        SZ.Write(SV_MAIN.sv_client.netchan.message, SV_MAIN.sv_client.download,                SV_MAIN.sv_client.downloadcount - r, r);        if (SV_MAIN.sv_client.downloadcount != SV_MAIN.sv_client.downloadsize)            return;        FS.FreeFile(SV_MAIN.sv_client.download);        SV_MAIN.sv_client.download = null;    }    /*     * ================== SV_BeginDownload_f ==================     */    public static void SV_BeginDownload_f() {        String name;        int offset = 0;        name = Cmd.Argv(1);        if (Cmd.Argc() > 2)            offset = Lib.atoi(Cmd.Argv(2)); // downloaded offset        // hacked by zoid to allow more conrol over download        // first off, no .. or global allow check        if (name.indexOf("..") != -1                || SV_MAIN.allow_download.value == 0 // leading dot is no good                || name.charAt(0) == '.' // leading slash bad as well, must be                                         // in subdir                || name.charAt(0) == '/' // next up, skin check                || (name.startsWith("players/") && 0 == SV_MAIN.allow_download_players.value) // now                                                                                              // models                || (name.startsWith("models/") && 0 == SV_MAIN.allow_download_models.value) // now                                                                                            // sounds                || (name.startsWith("sound/") && 0 == SV_MAIN.allow_download_sounds.value)                // now maps (note special case for maps, must not be in pak)                || (name.startsWith("maps/") && 0 == SV_MAIN.allow_download_maps.value) // MUST                                                                                        // be                                                                                        // in a                                                                                        // subdirectory                || name.indexOf('/') == -1) { // don't allow anything with ..                                              // path            MSG.WriteByte(SV_MAIN.sv_client.netchan.message,                    Defines.svc_download);            MSG.WriteShort(SV_MAIN.sv_client.netchan.message, -1);            MSG.WriteByte(SV_MAIN.sv_client.netchan.message, 0);            return;        }        if (SV_MAIN.sv_client.download != null)            FS.FreeFile(SV_MAIN.sv_client.download);        SV_MAIN.sv_client.download = FS.LoadFile(name);                // rst: this handles loading errors, no message yet visible         if (SV_MAIN.sv_client.download == null)        {        	        	return;        }                SV_MAIN.sv_client.downloadsize = SV_MAIN.sv_client.download.length;        SV_MAIN.sv_client.downloadcount = offset;        if (offset > SV_MAIN.sv_client.downloadsize)            SV_MAIN.sv_client.downloadcount = SV_MAIN.sv_client.downloadsize;        if (SV_MAIN.sv_client.download == null // special check for maps, if it                                               // came from a pak file, don't                                               // allow                							   // download ZOID                || (name.startsWith("maps/") && FS.file_from_pak != 0)) {            Com.DPrintf("Couldn't download " + name + " to "                    + SV_MAIN.sv_client.name + "\n");            if (SV_MAIN.sv_client.download != null) {                FS.FreeFile(SV_MAIN.sv_client.download);                SV_MAIN.sv_client.download = null;            }            MSG.WriteByte(SV_MAIN.sv_client.netchan.message,                    Defines.svc_download);            MSG.WriteShort(SV_MAIN.sv_client.netchan.message, -1);            MSG.WriteByte(SV_MAIN.sv_client.netchan.message, 0);            return;        }        SV_NextDownload_f();        Com.DPrintf("Downloading " + name + " to " + SV_MAIN.sv_client.name                + "\n");    }    //============================================================================    /*     * ================= SV_Disconnect_f     *      * The client is going to disconnect, so remove the connection immediately     * =================     */    public static void SV_Disconnect_f() {        //	SV_EndRedirect ();        SV_MAIN.SV_DropClient(SV_MAIN.sv_client);    }    /*     * ================== SV_ShowServerinfo_f     *      * Dumps the serverinfo info string ==================     */    public static void SV_ShowServerinfo_f() {        Info.Print(Cvar.Serverinfo());    }    public static void SV_Nextserver() {        String v;        //ZOID, ss_pic can be nextserver'd in coop mode        if (SV_INIT.sv.state == Defines.ss_game                || (SV_INIT.sv.state == Defines.ss_pic &&                         0 == Cvar.VariableValue("coop")))            return; // can't nextserver while playing a normal game        SV_INIT.svs.spawncount++; // make sure another doesn't sneak in        v = Cvar.VariableString("nextserver");        //if (!v[0])        if (v.length() == 0)            Cbuf.AddText("killserver\n");        else {            Cbuf.AddText(v);            Cbuf.AddText("\n");        }        Cvar.Set("nextserver", "");    }    /*     * ================== SV_Nextserver_f     *      * A cinematic has completed or been aborted by a client, so move to the     * next server, ==================     */    public static void SV_Nextserver_f() {        if (Lib.atoi(Cmd.Argv(1)) != SV_INIT.svs.spawncount) {            Com.DPrintf("Nextserver() from wrong level, from "                    + SV_MAIN.sv_client.name + "\n");            return; // leftover from last server        }        Com.DPrintf("Nextserver() from " + SV_MAIN.sv_client.name + "\n");        SV_Nextserver();    }    /*     * ================== SV_ExecuteUserCommand ==================     */    public static void SV_ExecuteUserCommand(String s) {                Com.dprintln("SV_ExecuteUserCommand:" + s );        SV_USER.ucmd_t u = null;        Cmd.TokenizeString(s.toCharArray(), true);        SV_USER.sv_player = SV_MAIN.sv_client.edict;        //	SV_BeginRedirect (RD_CLIENT);        int i = 0;        for (; i < SV_USER.ucmds.length; i++) {            u = SV_USER.ucmds[i];            if (Cmd.Argv(0).equals(u.name)) {                u.r.run();                break;            }        }        if (i == SV_USER.ucmds.length && SV_INIT.sv.state == Defines.ss_game)            Cmd.ClientCommand(SV_USER.sv_player);        //	SV_EndRedirect ();    }    /*     * ===========================================================================     *      * USER CMD EXECUTION     *      * ===========================================================================     */    public static void SV_ClientThink(client_t cl, usercmd_t cmd) {        cl.commandMsec -= cmd.msec & 0xFF;        if (cl.commandMsec < 0 && SV_MAIN.sv_enforcetime.value != 0) {            Com.DPrintf("commandMsec underflow from " + cl.name + "\n");            return;        }        PlayerClient.ClientThink(cl.edict, cmd);    }    /*     * =================== SV_ExecuteClientMessage     *      * The current net_message is parsed for the given client     * ===================     */    public static void SV_ExecuteClientMessage(client_t cl) {        int c;        String s;        usercmd_t nullcmd = new usercmd_t();        usercmd_t oldest = new usercmd_t(), oldcmd = new usercmd_t(), newcmd = new usercmd_t();        int net_drop;        int stringCmdCount;        int checksum, calculatedChecksum;        int checksumIndex;        boolean move_issued;        int lastframe;        SV_MAIN.sv_client = cl;        SV_USER.sv_player = SV_MAIN.sv_client.edict;        // only allow one move command        move_issued = false;        stringCmdCount = 0;        while (true) {            if (Globals.net_message.readcount > Globals.net_message.cursize) {                Com.Printf("SV_ReadClientMessage: bad read:\n");                Com.Printf(Lib.hexDump(Globals.net_message.data, 32, false));                SV_MAIN.SV_DropClient(cl);                return;            }            c = MSG.ReadByte(Globals.net_message);            if (c == -1)                break;            switch (c) {            default:                Com.Printf("SV_ReadClientMessage: unknown command char\n");                SV_MAIN.SV_DropClient(cl);                return;            case Defines.clc_nop:                break;            case Defines.clc_userinfo:                cl.userinfo = MSG.ReadString(Globals.net_message);                SV_MAIN.SV_UserinfoChanged(cl);                break;            case Defines.clc_move:                if (move_issued)                    return; // someone is trying to cheat...                move_issued = true;                checksumIndex = Globals.net_message.readcount;                checksum = MSG.ReadByte(Globals.net_message);                lastframe = MSG.ReadLong(Globals.net_message);                if (lastframe != cl.lastframe) {                    cl.lastframe = lastframe;                    if (cl.lastframe > 0) {                        cl.frame_latency[cl.lastframe                                & (Defines.LATENCY_COUNTS - 1)] = SV_INIT.svs.realtime                                - cl.frames[cl.lastframe & Defines.UPDATE_MASK].senttime;                    }                }                //memset (nullcmd, 0, sizeof(nullcmd));                nullcmd = new usercmd_t();                MSG.ReadDeltaUsercmd(Globals.net_message, nullcmd, oldest);                MSG.ReadDeltaUsercmd(Globals.net_message, oldest, oldcmd);                MSG.ReadDeltaUsercmd(Globals.net_message, oldcmd, newcmd);                if (cl.state != Defines.cs_spawned) {                    cl.lastframe = -1;                    break;                }                // if the checksum fails, ignore the rest of the packet                calculatedChecksum = Com.BlockSequenceCRCByte(                        Globals.net_message.data, checksumIndex + 1,                        Globals.net_message.readcount - checksumIndex - 1,                        cl.netchan.incoming_sequence);                if ((calculatedChecksum & 0xff) != checksum) {                    Com.DPrintf("Failed command checksum for " + cl.name + " ("                            + calculatedChecksum + " != " + checksum + ")/"                            + cl.netchan.incoming_sequence + "\n");                    return;                }                if (0 == SV_MAIN.sv_paused.value) {                    net_drop = cl.netchan.dropped;                    if (net_drop < 20) {                        //if (net_drop > 2)                        //	Com.Printf ("drop %i\n", net_drop);                        while (net_drop > 2) {                            SV_ClientThink(cl, cl.lastcmd);                            net_drop--;                        }                        if (net_drop > 1)                            SV_ClientThink(cl, oldest);                        if (net_drop > 0)                            SV_ClientThink(cl, oldcmd);                    }                    SV_ClientThink(cl, newcmd);                }                // copy.                cl.lastcmd.set(newcmd);                break;            case Defines.clc_stringcmd:                s = MSG.ReadString(Globals.net_message);                // malicious users may try using too many string commands                if (++stringCmdCount < SV_USER.MAX_STRINGCMDS)                    SV_ExecuteUserCommand(s);                if (cl.state == Defines.cs_zombie)                    return; // disconnect command                break;            }        }    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -