X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=prvm_cmds.c;h=6b390e7b59198a58c56122f9401a27f731668004;hb=511c0afa8e95fb7dca7017db29b91ff37b72f4be;hp=fb68eea4cfd7ee1e1dff36590f3f0f2d3984ed41;hpb=3f570282ad9a4e7f53622026143e1be41619989b;p=xonotic%2Fdarkplaces.git diff --git a/prvm_cmds.c b/prvm_cmds.c index fb68eea4..6b390e7b 100644 --- a/prvm_cmds.c +++ b/prvm_cmds.c @@ -57,7 +57,7 @@ float sin(float) float cos(float) float sqrt(float) vector randomvec() -float registercvar (string name, string value) +float registercvar (string name, string value, float flags) float min(float a, float b, ...[float]) float max(float a, float b, ...[float]) float bound(float min, float value, float max) @@ -94,6 +94,8 @@ float search_begin(string pattern, float caseinsensitive, float quiet) void search_end(float handle) float search_getsize(float handle) string search_getfilename(float handle, float num) + +string chr(float ascii) perhaps only : Menu : WriteMsg =============================== @@ -127,7 +129,7 @@ menu cmd list: =============== setkeydest(float dest) -float getkeydest +float getkeydest() setmousetarget(float target) float getmousetarget(void) @@ -136,6 +138,10 @@ float getmousetarget(void) float isfunction(string function_name) vector getresolution(float number) string keynumtostring(float keynum) +string findkeysforcommand(string command) +float gethostcachevalue(float type) +string gethostcachestring(float type, float hostnr) + */ @@ -174,11 +180,6 @@ mempool_t *vm_strings_mempool[PRVM_MAXPROGS]; static char vm_string_temp[VM_STRINGTEMP_BUFFERS][VM_STRINGTEMP_LENGTH]; static int vm_string_tempindex = 0; -// qc cvar -#define MAX_QC_CVARS 128 * PRVM_MAXPROGS -cvar_t vm_qc_cvar[MAX_QC_CVARS]; -int vm_currentqc_cvar; - // qc file handling #define MAX_VMFILES 256 #define MAX_PRVMFILES MAX_VMFILES * PRVM_MAXPROGS @@ -284,11 +285,11 @@ void VM_error (void) char string[VM_STRINGTEMP_LENGTH]; VM_VarString(0, string, sizeof(string)); - Con_Printf ("======%S ERROR in %s:\n%s\n", PRVM_NAME, PRVM_GetString(prog->xfunction->s_name), string); + Con_Printf("======%S ERROR in %s:\n%s\n", PRVM_NAME, PRVM_GetString(prog->xfunction->s_name), string); if(prog->self) { ed = PRVM_G_EDICT(prog->self->ofs); - PRVM_ED_Print (ed); + PRVM_ED_Print(ed); } PRVM_ERROR ("%s: Program error", PRVM_NAME); @@ -310,11 +311,11 @@ void VM_objerror (void) char string[VM_STRINGTEMP_LENGTH]; VM_VarString(0, string, sizeof(string)); - Con_Printf ("======%s OBJECT ERROR in %s:\n%s\n", PRVM_NAME, PRVM_GetString(prog->xfunction->s_name), string); + Con_Printf("======%s OBJECT ERROR in %s:\n%s\n", PRVM_NAME, PRVM_GetString(prog->xfunction->s_name), string); if(prog->self) { ed = PRVM_G_EDICT (prog->self->ofs); - PRVM_ED_Print (ed); + PRVM_ED_Print(ed); PRVM_ED_Free (ed); } @@ -337,7 +338,7 @@ void VM_print (void) char string[VM_STRINGTEMP_LENGTH]; VM_VarString(0, string, sizeof(string)); - Con_Printf(string); + Con_Print(string); } /* @@ -355,12 +356,12 @@ void VM_bprint (void) if(!sv.active) { - Con_Printf("VM_bprint: game is not server(%s) !", PRVM_NAME); + Con_Printf("VM_bprint: game is not server(%s) !\n", PRVM_NAME); return; } VM_VarString(0, string, sizeof(string)); - SV_BroadcastPrintf("%s", string); + SV_BroadcastPrint(string); } /* @@ -382,7 +383,7 @@ void VM_sprint (void) clientnum = PRVM_G_FLOAT(OFS_PARM0); if (!sv.active || clientnum < 0 || clientnum >= svs.maxclients || !svs.clients[clientnum].active) { - Con_Printf("VM_sprint: %s: invalid client or server is not active !", PRVM_NAME); + Con_Printf("VM_sprint: %s: invalid client or server is not active !\n", PRVM_NAME); return; } @@ -623,14 +624,13 @@ void VM_localsound(void) s = PRVM_G_STRING(OFS_PARM0); - if(!S_GetCached(s)) + if(!S_LocalSound(s, true)) { - Con_Printf("VM_localsound: %s : %s not cached !\n", PRVM_NAME, s); + Con_Printf("VM_localsound: Failed to play %s for %s !\n", s, PRVM_NAME); PRVM_G_FLOAT(OFS_RETURN) = -4; return; } - S_LocalSound(s); PRVM_G_FLOAT(OFS_RETURN) = 1; } @@ -705,7 +705,7 @@ void VM_str_cvar(void) strcpy(out, cvar_string); - PRVM_G_INT(OFS_PARM0) = PRVM_SetString(out); + PRVM_G_INT(OFS_RETURN) = PRVM_SetString(out); } /* @@ -854,7 +854,7 @@ void VM_spawn (void) ========= VM_remove -entity remove() +remove(entity e) ========= */ @@ -905,7 +905,7 @@ void VM_find (void) { prog->xfunction->builtinsprofile++; ed = PRVM_EDICT_NUM(e); - if (ed->e->free) + if (ed->p.e->free) continue; t = PRVM_E_STRING(ed,f); if (!t) @@ -946,7 +946,7 @@ void VM_findfloat (void) { prog->xfunction->builtinsprofile++; ed = PRVM_EDICT_NUM(e); - if (ed->e->free) + if (ed->p.e->free) continue; if (PRVM_E_FLOAT(ed,f) == s) { @@ -998,7 +998,7 @@ void VM_findchain (void) for (i = 1;i < prog->num_edicts;i++, ent = PRVM_NEXT_EDICT(ent)) { prog->xfunction->builtinsprofile++; - if (ent->e->free) + if (ent->p.e->free) continue; t = PRVM_E_STRING(ent,f); if (!t) @@ -1047,7 +1047,7 @@ void VM_findchainfloat (void) for (i = 1;i < prog->num_edicts;i++, ent = PRVM_NEXT_EDICT(ent)) { prog->xfunction->builtinsprofile++; - if (ent->e->free) + if (ent->p.e->free) continue; if (E_FLOAT(ent,f) != s) continue; @@ -1103,14 +1103,8 @@ void VM_precache_sound (void) PRVM_G_INT(OFS_RETURN) = PRVM_G_INT(OFS_PARM0); VM_CheckEmptyString (s); - if(S_GetCached(s)) - { - Con_Printf("VM_precache_sound: %s already cached (%s)\n", s, PRVM_NAME); - return; - } - - if(!S_PrecacheSound(s,true)) - Con_Printf("VM_prache_sound: Failed to load %s for %s\n", s, PRVM_NAME); + if(!S_PrecacheSound(s,true, true, true)) + Con_Printf("VM_precache_sound: Failed to load %s for %s\n", s, PRVM_NAME); } /* @@ -1273,7 +1267,7 @@ void VM_nextent (void) return; } ent = PRVM_EDICT_NUM(i); - if (!ent->e->free) + if (!ent->p.e->free) { VM_RETURN_EDICT(ent); return; @@ -1355,12 +1349,12 @@ void VM_WriteLong (void) void VM_WriteAngle (void) { - MSG_WriteAngle (VM_WriteDest(), PRVM_G_FLOAT(OFS_PARM0)); + MSG_WriteAngle (VM_WriteDest(), PRVM_G_FLOAT(OFS_PARM0), sv.protocol); } void VM_WriteCoord (void) { - MSG_WriteDPCoord (VM_WriteDest(), PRVM_G_FLOAT(OFS_PARM0)); + MSG_WriteCoord (VM_WriteDest(), PRVM_G_FLOAT(OFS_PARM0), sv.protocol); } void VM_WriteString (void) @@ -1484,19 +1478,24 @@ void VM_randomvec (void) ========= VM_registercvar -float registercvar (string name, string value) +float registercvar (string name, string value, float flags) ========= */ void VM_registercvar (void) { char *name, *value; - cvar_t *variable; + int flags; - VM_SAFEPARMCOUNT(2,VM_registercvar); + VM_SAFEPARMCOUNT(3,VM_registercvar); name = PRVM_G_STRING(OFS_PARM0); value = PRVM_G_STRING(OFS_PARM1); + flags = PRVM_G_FLOAT(OFS_PARM2); PRVM_G_FLOAT(OFS_RETURN) = 0; + + if(flags > CVAR_MAXFLAGSVAL) + return; + // first check to see if it has already been defined if (Cvar_FindVar (name)) return; @@ -1504,22 +1503,12 @@ void VM_registercvar (void) // check for overlap with a command if (Cmd_Exists (name)) { - Con_Printf ("VM_registercvar: %s is a command\n", name); + Con_Printf("VM_registercvar: %s is a command\n", name); return; } - if (vm_currentqc_cvar >= MAX_QC_CVARS) - PRVM_ERROR ("VM_registercvar: ran out of cvar slots (%i)\n", MAX_QC_CVARS); + Cvar_Get(name, value, 0); -// copy the name and value - variable = &vm_qc_cvar[vm_currentqc_cvar++]; - variable->name = Z_Malloc (strlen(name)+1); - strcpy (variable->name, name); - variable->string = Z_Malloc (strlen(value)+1); - strcpy (variable->string, value); - variable->value = atof (value); - - Cvar_RegisterVariable(variable); PRVM_G_FLOAT(OFS_RETURN) = 1; // success } @@ -1645,7 +1634,7 @@ setcolor(clientent, value) if (entnum < 1 || entnum > svs.maxclients || !svs.clients[entnum-1].active) { - Con_Printf ("tried to setcolor a non-client\n"); + Con_Print("tried to setcolor a non-client\n"); return; } @@ -1717,7 +1706,7 @@ void VM_fopen(void) modestring = "wb"; break; default: - Con_Printf ("VM_fopen: %s no such mode %i (valid: 0 = read, 1 = append, 2 = write)\n", PRVM_NAME, mode); + Con_Printf("VM_fopen: %s no such mode %i (valid: 0 = read, 1 = append, 2 = write)\n", PRVM_NAME, mode); PRVM_G_FLOAT(OFS_RETURN) = -3; return; } @@ -1733,6 +1722,9 @@ void VM_fopen(void) return; } VM_FILES[filenum] = FS_Open(va("data/%s", filename), modestring, false); + if (VM_FILES[filenum] == NULL && mode == 0) + VM_FILES[filenum] = FS_Open(va("%s", filename), modestring, false); + if (VM_FILES[filenum] == NULL) PRVM_G_FLOAT(OFS_RETURN) = -1; else @@ -1810,7 +1802,7 @@ void VM_fgets(void) c = FS_Getc(VM_FILES[filenum]); if (developer.integer) Con_Printf("fgets: %s: %s\n", PRVM_NAME, string); - if (c >= 0) + if (c >= 0 || end) PRVM_G_INT(OFS_RETURN) = PRVM_SetString(string); else PRVM_G_INT(OFS_RETURN) = 0; @@ -1994,7 +1986,7 @@ void VM_clcommand (void) i = PRVM_G_FLOAT(OFS_PARM0); if (!sv.active || i < 0 || i >= svs.maxclients || !svs.clients[i].active) { - Con_Printf("VM_clientcommand: %s: invalid client/server is not active !", PRVM_NAME); + Con_Printf("VM_clientcommand: %s: invalid client/server is not active !\n", PRVM_NAME); return; } @@ -2101,6 +2093,7 @@ void PF_setattachment (void) for (i = 0;i < model->data_overridetagnamesforskin[(unsigned int)tagentity->v->skin].num_overridetagnames;i++) if (!strcmp(tagname, model->data_overridetagnamesforskin[(unsigned int)tagentity->v->skin].data_overridetagnames[i].name)) v->_float = i + 1; + // FIXME: use a model function to get tag info (need to handle skeletal) if (v->_float == 0 && model->alias.aliasnum_tags) for (i = 0;i < model->alias.aliasnum_tags;i++) if (!strcmp(tagname, model->alias.aliasdata_tags[i].name)) @@ -2253,7 +2246,7 @@ void VM_loadfromfile(void) } // not conform with VM_fopen - data = FS_LoadFile(filename, false); + data = FS_LoadFile(filename, tempmempool, false); if (data == NULL) PRVM_G_FLOAT(OFS_RETURN) = -1; @@ -2431,6 +2424,25 @@ void VM_search_getfilename(void) PRVM_G_INT(OFS_RETURN) = PRVM_SetString(tmp); } +/* +========= +VM_chr + +string chr(float ascii) +========= +*/ +void VM_chr(void) +{ + char *tmp; + VM_SAFEPARMCOUNT(1, VM_chr); + + tmp = VM_GetTempString(); + tmp[0] = (unsigned char) PRVM_G_FLOAT(OFS_PARM0); + tmp[1] = 0; + + PRVM_G_INT(OFS_RETURN) = PRVM_SetString(tmp); +} + //============================================================================= // Draw builtins (client & menu) @@ -2532,7 +2544,7 @@ void VM_drawcharacter(void) } if(pos[2] || scale[2]) - Con_Printf("VM_drawcharacter: z value%c from %s discarded",(pos[2] && scale[2]) ? 's' : 0,((pos[2] && scale[2]) ? "pos and scale" : (pos[2] ? "pos" : "scale"))); + Con_Printf("VM_drawcharacter: z value%c from %s discarded\n",(pos[2] && scale[2]) ? 's' : 0,((pos[2] && scale[2]) ? "pos and scale" : (pos[2] ? "pos" : "scale"))); if(!scale[0] || !scale[1]) { @@ -2589,7 +2601,7 @@ void VM_drawstring(void) } if(pos[2] || scale[2]) - Con_Printf("VM_drawstring: z value%c from %s discarded",(pos[2] && scale[2]) ? 's' : 0,((pos[2] && scale[2]) ? "pos and scale" : (pos[2] ? "pos" : "scale"))); + Con_Printf("VM_drawstring: z value%c from %s discarded\n",(pos[2] && scale[2]) ? 's' : 0,((pos[2] && scale[2]) ? "pos and scale" : (pos[2] ? "pos" : "scale"))); DrawQ_String (pos[0], pos[1], string, 0, scale[0], scale[1], rgb[0], rgb[1], rgb[2], PRVM_G_FLOAT(OFS_PARM4), flag); PRVM_G_FLOAT(OFS_RETURN) = 1; @@ -2641,7 +2653,7 @@ void VM_drawpic(void) } if(pos[2] || size[2]) - Con_Printf("VM_drawstring: z value%c from %s discarded",(pos[2] && size[2]) ? 's' : 0,((pos[2] && size[2]) ? "pos and size" : (pos[2] ? "pos" : "size"))); + Con_Printf("VM_drawstring: z value%c from %s discarded\n",(pos[2] && size[2]) ? 's' : 0,((pos[2] && size[2]) ? "pos and size" : (pos[2] ? "pos" : "size"))); DrawQ_Pic(pos[0], pos[1], pic, size[0], size[1], rgb[0], rgb[1], rgb[2], PRVM_G_FLOAT(OFS_PARM4), flag); PRVM_G_FLOAT(OFS_RETURN) = 1; @@ -2675,7 +2687,7 @@ void VM_drawfill(void) } if(pos[2] || size[2]) - Con_Printf("VM_drawstring: z value%c from %s discarded",(pos[2] && size[2]) ? 's' : 0,((pos[2] && size[2]) ? "pos and size" : (pos[2] ? "pos" : "size"))); + Con_Printf("VM_drawstring: z value%c from %s discarded\n",(pos[2] && size[2]) ? 's' : 0,((pos[2] && size[2]) ? "pos and size" : (pos[2] ? "pos" : "size"))); DrawQ_Pic(pos[0], pos[1], 0, size[0], size[1], rgb[0], rgb[1], rgb[2], PRVM_G_FLOAT(OFS_PARM3), flag); PRVM_G_FLOAT(OFS_RETURN) = 1; @@ -2746,7 +2758,7 @@ void VM_getimagesize(void) void VM_Cmd_Init(void) { // only init the stuff for the current prog - VM_STRINGS_MEMPOOL = Mem_AllocPool(va("vm_stringsmempool[%s]",PRVM_NAME)); + VM_STRINGS_MEMPOOL = Mem_AllocPool(va("vm_stringsmempool[%s]",PRVM_NAME), 0, NULL); VM_Files_Init(); VM_Search_Init(); } @@ -3009,7 +3021,7 @@ void VM_M_writetofile(void) } ent = PRVM_G_EDICT(OFS_PARM1); - if(ent->e->free) + if(ent->p.e->free) { Con_Printf("VM_M_writetofile: %s: entity %i is free !\n", PRVM_NAME, PRVM_EDICT_NUM(OFS_PARM1)); return; @@ -3061,6 +3073,130 @@ void VM_M_keynumtostring(void) PRVM_G_INT(OFS_RETURN) = PRVM_SetString(tmp); } +/* +========= +VM_M_findkeysforcommand + +string findkeysforcommand(string command) + +the returned string is an altstring +========= +*/ +#define NUMKEYS 5 // TODO: merge the constant in keys.c with this one somewhen + +void M_FindKeysForCommand(char *command, int *keys); +void VM_M_findkeysforcommand(void) +{ + char *cmd, *ret; + int keys[NUMKEYS]; + int i; + + VM_SAFEPARMCOUNT(1, VM_M_findkeysforcommand); + + cmd = PRVM_G_STRING(OFS_PARM0); + + VM_CheckEmptyString(cmd); + + (ret = VM_GetTempString())[0] = 0; + + M_FindKeysForCommand(cmd, keys); + + for(i = 0; i < NUMKEYS; i++) + ret = strcat(ret, va(" \'%i\'", keys[i])); + + PRVM_G_INT(OFS_RETURN) = PRVM_SetString(ret); +} + +/* +========= +VM_M_gethostcachecount + +float gethostcachevalue(float type) +========= +*/ +/* + type: +0 hostcachecount +1 masterquerycount +2 masterreplycount +3 serverquerycount +4 serverreplycount +*/ +void VM_M_gethostcachevalue( void ) +{ + int type; + VM_SAFEPARMCOUNT ( 1, VM_M_gethostcachevalue ); + + PRVM_G_FLOAT( OFS_RETURN ) = 0; + + type = PRVM_G_FLOAT( OFS_PARM0 ); + if( type < 0 || type > 4 ) + Con_Printf( "VM_M_gethostcachevalue: bad type %i!\n", type ); + else switch(type) + { + case 0: + PRVM_G_FLOAT ( OFS_RETURN ) = hostCacheCount; + return; + case 1: + PRVM_G_FLOAT ( OFS_RETURN ) = masterquerycount; + return; + case 2: + PRVM_G_FLOAT ( OFS_RETURN ) = masterreplycount; + return; + case 3: + PRVM_G_FLOAT ( OFS_RETURN ) = serverquerycount; + return; + case 4: + PRVM_G_FLOAT ( OFS_RETURN ) = serverreplycount; + return; + } +} + +/* +========= +VM_M_gethostcachestring + +string gethostcachestring(float type, float hostnr) +========= +*/ +/* +0 Get CName +1 Get line1 +2 Get line2 +*/ +void VM_M_gethostcachestring(void) +{ + int type; + int hostnr; + + VM_SAFEPARMCOUNT(2, VM_M_gethostcachestring); + + PRVM_G_INT(OFS_RETURN) = 0; + + type = PRVM_G_FLOAT(OFS_PARM0); + + if(type < 0 || type > 2) + { + Con_Print("VM_M_gethostcachestring: bad string type requested!\n"); + return; + } + + hostnr = PRVM_G_FLOAT(OFS_PARM1); + + if(hostnr < 0 || hostnr >= hostCacheCount) + { + Con_Print("VM_M_gethostcachestring: bad hostnr passed!\n"); + return; + } + + if( type == 0 ) + PRVM_G_INT( OFS_RETURN ) = PRVM_SetString( hostcache[hostnr].cname ); + else if( type == 1 ) + PRVM_G_INT( OFS_RETURN ) = PRVM_SetString( hostcache[hostnr].line1 ); + else + PRVM_G_INT( OFS_RETURN ) = PRVM_SetString( hostcache[hostnr].line2 ); +} + prvm_builtin_t vm_m_builtins[] = { 0, // to be consistent with the old vm // common builtings (mostly) @@ -3141,7 +3277,8 @@ prvm_builtin_t vm_m_builtins[] = { VM_search_end, VM_search_getsize, VM_search_getfilename, // 77 - 0,0,0,// 80 + VM_chr, //78 + 0,0,// 80 e10, // 90 e10, // 100 e100, // 200 @@ -3187,7 +3324,10 @@ prvm_builtin_t vm_m_builtins[] = { VM_M_writetofile, VM_M_isfunction, VM_M_getresolution, - VM_M_keynumtostring // 609 + VM_M_keynumtostring, + VM_M_findkeysforcommand,// 610 + VM_M_gethostcachevalue, + VM_M_gethostcachestring // 612 }; const int vm_m_numbuiltins = sizeof(vm_m_builtins) / sizeof(prvm_builtin_t); @@ -3201,4 +3341,4 @@ void VM_M_Cmd_Reset(void) { //VM_Cmd_Init(); VM_Cmd_Reset(); -} \ No newline at end of file +}