]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - prvm_edict.c
increase r_framedatasize in increments instead of by a percentage
[xonotic/darkplaces.git] / prvm_edict.c
index 5ac8db89643ba091159dd626f08065a530e0464c..8b4ddf0a5bd6073d8c72064d5c3ba63c9b284780 100644 (file)
@@ -2059,6 +2059,98 @@ void PRVM_LoadProgs (const char * filename, int numrequiredfunc, char **required
 
        PRVM_Init_Exec();
 
+       for (i=0 ; i<prog->progs->numglobaldefs ; i++)
+       {
+               const char *name;
+               name = PRVM_GetString(prog->globaldefs[i].s_name);
+               //Con_Printf("found var %s\n", name);
+               if(name
+                       && !strncmp(name, "autocvar_", 9)
+                       && !(strlen(name) > 1 && name[strlen(name)-2] == '_' && (name[strlen(name)-1] == 'x' || name[strlen(name)-1] == 'y' || name[strlen(name)-1] == 'z'))
+               )
+               {
+                       prvm_eval_t *val = (prvm_eval_t *)(prog->globals.generic + prog->globaldefs[i].ofs);
+                       cvar_t *cvar = Cvar_FindVar(name + 9);
+                       //Con_Printf("PRVM_LoadProgs: autocvar global %s in %s, processing...\n", name, PRVM_NAME);
+                       if(!cvar)
+                       {
+                               const char *value;
+                               char buf[64];
+                               Con_Printf("PRVM_LoadProgs: no cvar for autocvar global %s in %s, creating...\n", name, PRVM_NAME);
+                               switch(prog->globaldefs[i].type & ~DEF_SAVEGLOBAL)
+                               {
+                                       case ev_float:
+                                               if((float)((int)(val->_float)) == val->_float)
+                                                       dpsnprintf(buf, sizeof(buf), "%i", (int)(val->_float));
+                                               else
+                                                       dpsnprintf(buf, sizeof(buf), "%f", val->_float);
+                                               value = buf;
+                                               break;
+                                       case ev_vector:
+                                               dpsnprintf(buf, sizeof(buf), "%f %f %f", val->vector[0], val->vector[1], val->vector[2]); value = buf;
+                                               break;
+                                       case ev_string:
+                                               value = PRVM_GetString(val->string);
+                                               break;
+                                       default:
+                                               Con_Printf("PRVM_LoadProgs: invalid type of autocvar global %s in %s\n", name, PRVM_NAME);
+                                               goto fail;
+                               }
+                               cvar = Cvar_Get(name + 9, value, 0, NULL);
+                               if((prog->globaldefs[i].type & ~DEF_SAVEGLOBAL) == ev_string)
+                               {
+                                       val->string = PRVM_SetEngineString(cvar->string);
+                                       cvar->globaldefindex_stringno[prog - prog_list] = val->string;
+                               }
+                               if(!cvar)
+                                       PRVM_ERROR("PRVM_LoadProgs: could not create cvar for autocvar global %s in %s", name, PRVM_NAME);
+                               cvar->globaldefindex_progid[prog - prog_list] = prog->id;
+                               cvar->globaldefindex[prog - prog_list] = i;
+                       }
+                       else if((cvar->flags & CVAR_PRIVATE) == 0)
+                       {
+                               // MUST BE SYNCED WITH cvar.c Cvar_Set
+                               int j;
+                               const char *s;
+                               switch(prog->globaldefs[i].type & ~DEF_SAVEGLOBAL)
+                               {
+                                       case ev_float:
+                                               val->_float = cvar->value;
+                                               break;
+                                       case ev_vector:
+                                               s = cvar->string;
+                                               VectorClear(val->vector);
+                                               for (j = 0;j < 3;j++)
+                                               {
+                                                       while (*s && ISWHITESPACE(*s))
+                                                               s++;
+                                                       if (!*s)
+                                                               break;
+                                                       val->vector[j] = atof(s);
+                                                       while (!ISWHITESPACE(*s))
+                                                               s++;
+                                                       if (!*s)
+                                                               break;
+                                               }
+                                               break;
+                                       case ev_string:
+                                               val->string = PRVM_SetEngineString(cvar->string);
+                                               cvar->globaldefindex_stringno[prog - prog_list] = val->string;
+                                               break;
+                                       default:
+                                               Con_Printf("PRVM_LoadProgs: invalid type of autocvar global %s in %s\n", name, PRVM_NAME);
+                                               goto fail;
+                               }
+                               cvar->globaldefindex_progid[prog - prog_list] = prog->id;
+                               cvar->globaldefindex[prog - prog_list] = i;
+                       }
+                       else
+                               Con_Printf("PRVM_LoadProgs: private cvar for autocvar global %s in %s\n", name, PRVM_NAME);
+               }
+fail:
+               ;
+       }
+
        prog->loaded = TRUE;
 
        // set flags & ddef_ts in prog
@@ -2341,6 +2433,8 @@ PRVM_InitProg
 */
 void PRVM_InitProg(int prognr)
 {
+       static unsigned int progid = 0;
+
        if(prognr < 0 || prognr >= PRVM_MAXPROGS)
                Sys_Error("PRVM_InitProg: Invalid program number %i",prognr);
 
@@ -2351,6 +2445,7 @@ void PRVM_InitProg(int prognr)
 
        memset(prog, 0, sizeof(prvm_prog_t));
        prog->starttime = Sys_DoubleTime();
+       prog->id = ++progid;
 
        prog->error_cmd = Host_Error;
        prog->leaktest_active = prvm_leaktest.integer != 0;
@@ -2449,6 +2544,17 @@ const char *PRVM_GetString(int num)
        }
 }
 
+const char *PRVM_ChangeEngineString(int i, const char *s)
+{
+       const char *old;
+       i = -1 - i;
+       if(i < 0 || i >= prog->numknownstrings)
+               PRVM_ERROR("PRVM_ChangeEngineString: s is not an engine string");
+       old = prog->knownstrings[i];
+       prog->knownstrings[i] = s;
+       return old;
+}
+
 int PRVM_SetEngineString(const char *s)
 {
        int i;