📄 sv_user.java
字号:
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 + -