From cee06f041a5d05361bc9d03fa1fe1328d572fbea Mon Sep 17 00:00:00 2001 From: havoc Date: Fri, 1 Jul 2005 07:04:40 +0000 Subject: [PATCH] forbid world writes after precache stage (without using sv.state, instead prog->allowworldwrites was added) git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@5476 d7cf8633-e32d-0410-b094-e92efae38249 --- progsvm.h | 4 ++++ prvm_execprogram.h | 8 ++++---- sv_main.c | 2 ++ 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/progsvm.h b/progsvm.h index 08849458..d86b0b64 100644 --- a/progsvm.h +++ b/progsvm.h @@ -328,6 +328,10 @@ typedef struct prvm_prog_s float *time; float _time; + // allow writing to world entity fields, this is set by server init and + // cleared before first server frame + qboolean allowworldwrites; + // name of the prog, e.g. "Server", "Client" or "Menu" (used for text output) char *name; // [INIT] diff --git a/prvm_execprogram.h b/prvm_execprogram.h index 07ca7a16..fd50149a 100644 --- a/prvm_execprogram.h +++ b/prvm_execprogram.h @@ -189,14 +189,14 @@ return; } #endif - /*if (OPA->edict == 0 && sv.state == ss_active) + if (OPA->edict == 0 && !prog->allowworldwrites) { prog->xfunction->profile += profile - startprofile; startprofile = profile; prog->xstatement = st - prog->statements; Host_Error("assignment to world entity in %s", PRVM_NAME); return; - }*/ + } ed = PRVM_PROG_TO_EDICT(OPA->edict); OPC->_int = (qbyte *)((int *)ed->fields.vp + OPB->_int) - (qbyte *)prog->edictsfields; break; @@ -304,7 +304,7 @@ break; case OP_STATE: - if(prog->flag & PRVM_OP_STATE) + if(prog->flag & PRVM_OP_STATE) { prog->xfunction->profile += profile - startprofile; startprofile = profile; @@ -317,7 +317,7 @@ else PRVM_ERROR("OP_STATE not supported by %s\n", PRVM_NAME); break; - + // LordHavoc: to be enabled when Progs version 7 (or whatever it will be numbered) is finalized /* case OP_ADD_I: diff --git a/sv_main.c b/sv_main.c index f811ee66..019ad9d4 100644 --- a/sv_main.c +++ b/sv_main.c @@ -1736,6 +1736,7 @@ void SV_SpawnServer (const char *server) //prog->num_edicts = svs.maxclients+1; sv.state = ss_loading; + prog->allowworldwrites = true; sv.paused = false; *prog->time = sv.time = 1.0; @@ -1806,6 +1807,7 @@ void SV_SpawnServer (const char *server) // all setup is completed, any further precache statements are errors sv.state = ss_active; + prog->allowworldwrites = false; // run two frames to allow everything to settle for (i = 0;i < 2;i++) -- 2.39.2