X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=prvm_cmds.c;h=07adabf396246c2a6ec3b0e140ff3d389b1813c7;hb=415f1e0e46791994cfa2f6dd3a29f793e3bb9cd9;hp=c83598b6479280bccfe204c90a7030a76c81e30b;hpb=81428659a4156981ed76f6167ef3be82d35a4bf8;p=xonotic%2Fdarkplaces.git diff --git a/prvm_cmds.c b/prvm_cmds.c index c83598b6..07adabf3 100644 --- a/prvm_cmds.c +++ b/prvm_cmds.c @@ -58,6 +58,34 @@ void VM_CheckEmptyString(prvm_prog_t *prog, const char *s) prog->error_cmd("%s: Bad string", prog->name); } +qbool PRVM_ConsoleCommand (prvm_prog_t *prog, const char *text, int *func, qbool preserve_self, int curself, double ptime, qbool prog_loaded, const char *error_message) +{ + int restorevm_tempstringsbuf_cursize; + int save_self = 0; // hush compiler warning + qbool r = false; + + if(!prog_loaded) + return false; + + if(func) + { + if(preserve_self) + save_self = PRVM_gameglobaledict(self); + if(ptime) + PRVM_gameglobalfloat(time) = ptime; + PRVM_gameglobaledict(self) = curself; + restorevm_tempstringsbuf_cursize = prog->tempstringsbuf.cursize; + PRVM_G_INT(OFS_PARM0) = PRVM_SetTempString(prog, text); + prog->ExecuteProgram(prog, *func, error_message); + prog->tempstringsbuf.cursize = restorevm_tempstringsbuf_cursize; + if(preserve_self) + PRVM_gameglobaledict(self) = save_self; + r = (int) PRVM_G_FLOAT(OFS_RETURN) != 0; + } + + return r; +} + void VM_GenerateFrameGroupBlend(prvm_prog_t *prog, framegroupblend_t *framegroupblend, const prvm_edict_t *ed) { // self.frame is the interpolation target (new frame) @@ -595,7 +623,7 @@ void VM_break(prvm_prog_t *prog) /* ================= -VM_localcmd_client +VM_localcmd_local Sends text over to the client's execution buffer @@ -603,12 +631,12 @@ Sends text over to the client's execution buffer cmd (string, ...) ================= */ -void VM_localcmd_client(prvm_prog_t *prog) +void VM_localcmd_local(prvm_prog_t *prog) { char string[VM_STRINGTEMP_LENGTH]; - VM_SAFEPARMCOUNTRANGE(1, 8, VM_localcmd_client); + VM_SAFEPARMCOUNTRANGE(1, 8, VM_localcmd_local); VM_VarString(prog, 0, string, sizeof(string)); - Cbuf_AddText(&cmd_client, string); + Cbuf_AddText(cmd_local, string); } /* @@ -626,7 +654,7 @@ void VM_localcmd_server(prvm_prog_t *prog) char string[VM_STRINGTEMP_LENGTH]; VM_SAFEPARMCOUNTRANGE(1, 8, VM_localcmd_server); VM_VarString(prog, 0, string, sizeof(string)); - Cbuf_AddText(&cmd_server, string); + Cbuf_AddText(cmd_local, string); } static qbool PRVM_Cvar_ReadOk(prvm_prog_t *prog, const char *string) @@ -1335,12 +1363,11 @@ coredump() */ void VM_coredump(prvm_prog_t *prog) { - cmd_state_t *cmd = !host_isclient.integer ? &cmd_server : &cmd_client; VM_SAFEPARMCOUNT(0,VM_coredump); - Cbuf_AddText(cmd, "prvm_edicts "); - Cbuf_AddText(cmd, prog->name); - Cbuf_AddText(cmd, "\n"); + Cbuf_AddText(cmd_local, "prvm_edicts "); + Cbuf_AddText(cmd_local, prog->name); + Cbuf_AddText(cmd_local, "\n"); } /* @@ -1521,7 +1548,7 @@ void VM_changelevel(prvm_prog_t *prog) return; svs.changelevel_issued = true; - Cbuf_AddText(&cmd_server, va(vabuf, sizeof(vabuf), "changelevel %s\n", PRVM_G_STRING(OFS_PARM0))); + Cbuf_AddText(cmd_local, va(vabuf, sizeof(vabuf), "changelevel %s\n", PRVM_G_STRING(OFS_PARM0))); } /* @@ -1669,7 +1696,7 @@ void VM_registercvar(prvm_prog_t *prog) return; // check for overlap with a command - if (Cmd_Exists(&cmd_client, name) || Cmd_Exists(&cmd_server, name)) + if (Cmd_Exists(cmd_local, name)) { VM_Warning(prog, "VM_registercvar: %s is a command\n", name); return;