X-Git-Url: http://git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=blobdiff_plain;f=svvm_cmds.c;h=672ff70d1f8e7116237d6f81737fe2b8012a014b;hp=3692bc2f42c588d099bdca2fdc12f3788fe50120;hb=HEAD;hpb=751ef20097daaab8c62db4d7657c8273fa3a96b9 diff --git a/svvm_cmds.c b/svvm_cmds.c index 3692bc2f..770f1abe 100644 --- a/svvm_cmds.c +++ b/svvm_cmds.c @@ -375,7 +375,7 @@ static void VM_SV_sprint(prvm_prog_t *prog) { client_t *client; int entnum; - char string[VM_STRINGTEMP_LENGTH]; + char string[VM_TEMPSTRING_MAXSIZE]; VM_SAFEPARMCOUNTRANGE(2, 8, VM_SV_sprint); @@ -417,7 +417,7 @@ static void VM_SV_centerprint(prvm_prog_t *prog) { client_t *client; int entnum; - char string[VM_STRINGTEMP_LENGTH]; + char string[VM_TEMPSTRING_MAXSIZE]; VM_SAFEPARMCOUNTRANGE(2, 8, VM_SV_centerprint); @@ -662,7 +662,7 @@ static void VM_SV_traceline(prvm_prog_t *prog) move = (int)PRVM_G_FLOAT(OFS_PARM2); ent = PRVM_G_EDICT(OFS_PARM3); - if (VEC_IS_NAN(v1[0]) || VEC_IS_NAN(v1[1]) || VEC_IS_NAN(v1[2]) || VEC_IS_NAN(v2[0]) || VEC_IS_NAN(v2[1]) || VEC_IS_NAN(v2[2])) + if (isnan(v1[0]) || isnan(v1[1]) || isnan(v1[2]) || isnan(v2[0]) || isnan(v2[1]) || isnan(v2[2])) prog->error_cmd("%s: NAN errors detected in traceline('%f %f %f', '%f %f %f', %i, entity %i)\n", prog->name, v1[0], v1[1], v1[2], v2[0], v2[1], v2[2], move, PRVM_EDICT_TO_PROG(ent)); trace = SV_TraceLine(v1, v2, move, ent, SV_GenericHitSuperContentsMask(ent), 0, 0, collision_extendtracelinelength.value); @@ -701,7 +701,7 @@ static void VM_SV_tracebox(prvm_prog_t *prog) move = (int)PRVM_G_FLOAT(OFS_PARM4); ent = PRVM_G_EDICT(OFS_PARM5); - if (VEC_IS_NAN(v1[0]) || VEC_IS_NAN(v1[1]) || VEC_IS_NAN(v1[2]) || VEC_IS_NAN(v2[0]) || VEC_IS_NAN(v2[1]) || VEC_IS_NAN(v2[2])) + if (isnan(v1[0]) || isnan(v1[1]) || isnan(v1[2]) || isnan(v2[0]) || isnan(v2[1]) || isnan(v2[2])) prog->error_cmd("%s: NAN errors detected in tracebox('%f %f %f', '%f %f %f', '%f %f %f', '%f %f %f', %i, entity %i)\n", prog->name, v1[0], v1[1], v1[2], m1[0], m1[1], m1[2], m2[0], m2[1], m2[2], v2[0], v2[1], v2[2], move, PRVM_EDICT_TO_PROG(ent)); trace = SV_TraceBox(v1, m1, m2, v2, move, ent, SV_GenericHitSuperContentsMask(ent), 0, 0, collision_extendtraceboxlength.value); @@ -781,8 +781,7 @@ static void VM_SV_tracetoss(prvm_prog_t *prog) //============================================================================ -static int checkpvsbytes; -static unsigned char checkpvs[MAX_MAP_LEAFS/8]; +static unsigned char *checkpvs; static int VM_SV_newcheckclient(prvm_prog_t *prog, int check) { @@ -816,9 +815,10 @@ static int VM_SV_newcheckclient(prvm_prog_t *prog, int check) // get the PVS for the entity VectorAdd(PRVM_serveredictvector(ent, origin), PRVM_serveredictvector(ent, view_ofs), org); - checkpvsbytes = 0; if (sv.worldmodel && sv.worldmodel->brush.FatPVS) - checkpvsbytes = sv.worldmodel->brush.FatPVS(sv.worldmodel, org, 0, checkpvs, sizeof(checkpvs), false); + sv.worldmodel->brush.FatPVS(sv.worldmodel, org, 0, &checkpvs, sv_mempool, false); + else + checkpvs = NULL; return i; } @@ -864,7 +864,7 @@ static void VM_SV_checkclient(prvm_prog_t *prog) // if current entity can't possibly see the check entity, return 0 self = PRVM_PROG_TO_EDICT(PRVM_serverglobaledict(self)); VectorAdd(PRVM_serveredictvector(self, origin), PRVM_serveredictvector(self, view_ofs), view); - if (sv.worldmodel && checkpvsbytes && !sv.worldmodel->brush.BoxTouchingPVS(sv.worldmodel, checkpvs, view, view)) + if (sv.worldmodel && checkpvs && !sv.worldmodel->brush.BoxTouchingPVS(sv.worldmodel, checkpvs, view, view)) { c_notvis++; VM_RETURN_EDICT(prog->edicts); @@ -895,8 +895,7 @@ static void VM_SV_checkpvs(prvm_prog_t *prog) #if 1 unsigned char *pvs; #else - int fatpvsbytes; - unsigned char fatpvs[MAX_MAP_LEAFS/8]; + unsigned char *fatpvs = NULL; #endif VM_SAFEPARMCOUNT(2, VM_SV_checkpvs); @@ -935,8 +934,8 @@ static void VM_SV_checkpvs(prvm_prog_t *prog) PRVM_G_FLOAT(OFS_RETURN) = 3; return; } - fatpvsbytes = sv.worldmodel->brush.FatPVS(sv.worldmodel, viewpos, 8, fatpvs, sizeof(fatpvs), false); - if(!fatpvsbytes) + sv.worldmodel->brush.FatPVS(sv.worldmodel, viewpos, 8, &fatpvs, sv_mempool, false); + if(!fatpvs) { // viewpos isn't in any PVS... darn PRVM_G_FLOAT(OFS_RETURN) = 2; @@ -962,7 +961,7 @@ static void VM_SV_stuffcmd(prvm_prog_t *prog) { int entnum; client_t *old; - char string[VM_STRINGTEMP_LENGTH]; + char string[VM_TEMPSTRING_MAXSIZE]; VM_SAFEPARMCOUNTRANGE(2, 8, VM_SV_stuffcmd); @@ -1300,7 +1299,7 @@ static void VM_SV_lightstyle(prvm_prog_t *prog) } // change the string in sv - strlcpy(sv.lightstyles[style], val, sizeof(sv.lightstyles[style])); + dp_strlcpy(sv.lightstyles[style], val, sizeof(sv.lightstyles[style])); // send message to all clients on this server if (sv.state != ss_active) @@ -1740,7 +1739,7 @@ void VM_SV_UpdateCustomStats (client_t *client, prvm_edict_t *ent, sizebuf_t *ms //string as 16 bytes case 1: memset(s, 0, 17); - strlcpy(s, PRVM_E_STRING(ent, vm_customstats[i].fieldoffset), 16); + dp_strlcpy(s, PRVM_E_STRING(ent, vm_customstats[i].fieldoffset), 16); stats[i] = s[ 0] + s[ 1] * 256 + s[ 2] * 65536 + s[ 3] * 16777216; stats[i+1] = s[ 4] + s[ 5] * 256 + s[ 6] * 65536 + s[ 7] * 16777216; stats[i+2] = s[ 8] + s[ 9] * 256 + s[10] * 65536 + s[11] * 16777216; @@ -1762,7 +1761,7 @@ void VM_SV_UpdateCustomStats (client_t *client, prvm_edict_t *ent, sizebuf_t *ms } } -extern cvar_t sv_gameplayfix_customstats; +extern cvar_t sv_qcstats; // void(float index, float type, .void field) SV_AddStat = #232; // Set up an auto-sent player stat. @@ -1813,9 +1812,9 @@ static void VM_SV_AddStat(prvm_prog_t *prog) // these are hazardous to override but sort of allowed if one wants to be adventurous... and enjoys warnings. if (i < MIN_VM_STAT) VM_Warning(prog, "PF_SV_AddStat: index (%i) < MIN_VM_STAT (%i) may conflict with engine stats - allowed, but this may break things\n", i, MIN_VM_STAT); - else if (i >= MAX_VM_STAT && !sv_gameplayfix_customstats.integer) + else if (i >= MAX_VM_STAT && !sv_qcstats.integer) VM_Warning(prog, "PF_SV_AddStat: index (%i) >= MAX_VM_STAT (%i) conflicts with engine stats - allowed, but this may break slowmo and stuff\n", i, MAX_VM_STAT); - else if (i > (MAX_VM_STAT - 4) && type == 1 && !sv_gameplayfix_customstats.integer) + else if (i > (MAX_VM_STAT - 4) && type == 1 && !sv_qcstats.integer) VM_Warning(prog, "PF_SV_AddStat: index (%i) >= MAX_VM_STAT (%i) - 4 with string type won't fit within MAX_VM_STAT, thus conflicting with engine stats - allowed, but this may break slowmo and stuff\n", i, MAX_VM_STAT); vm_customstats[i].type = type; @@ -2433,7 +2432,7 @@ static void VM_SV_clientcommand(prvm_prog_t *prog) temp_client = host_client; host_client = svs.clients + i; - Cmd_ExecuteString(cmd_serverfromclient, PRVM_G_STRING(OFS_PARM1), src_client, true); + Cmd_ExecuteString(cmd_serverfromclient, PRVM_G_STRING(OFS_PARM1), strlen(PRVM_G_STRING(OFS_PARM1)), src_client, true); host_client = temp_client; } @@ -2686,7 +2685,7 @@ static void VM_SV_gettaginfo(prvm_prog_t *prog) Matrix4x4_ToVectors(&tag_localmatrix, forward, left, up, origin); PRVM_serverglobalfloat(gettaginfo_parent) = parentindex; - PRVM_serverglobalstring(gettaginfo_name) = tagname ? PRVM_SetTempString(prog, tagname) : 0; + PRVM_serverglobalstring(gettaginfo_name) = tagname ? PRVM_SetTempString(prog, tagname, strlen(tagname)) : 0; VectorCopy(forward, PRVM_serverglobalvector(gettaginfo_forward)); VectorNegate(left, PRVM_serverglobalvector(gettaginfo_right)); VectorCopy(up, PRVM_serverglobalvector(gettaginfo_up)); @@ -2784,10 +2783,11 @@ string(string key) serverkey */ static void VM_SV_serverkey(prvm_prog_t *prog) { - char string[VM_STRINGTEMP_LENGTH]; + char string[VM_TEMPSTRING_MAXSIZE]; + VM_SAFEPARMCOUNT(1, VM_SV_serverkey); InfoString_GetValue(svs.serverinfo, PRVM_G_STRING(OFS_PARM0), string, sizeof(string)); - PRVM_G_INT(OFS_RETURN) = PRVM_SetTempString(prog, string); + PRVM_G_INT(OFS_RETURN) = PRVM_SetTempString(prog, string, strlen(string)); } //#333 void(entity e, float mdlindex) setmodelindex (EXT_CSQC) @@ -2924,10 +2924,10 @@ static void VM_SV_pointparticles(prvm_prog_t *prog) SV_FlushBroadcastMessages(); } -qbool SV_VM_ConsoleCommand (const char *text) +qbool SV_VM_ConsoleCommand(const char *text, size_t textlen) { prvm_prog_t *prog = SVVM_prog; - return PRVM_ConsoleCommand(prog, text, &prog->funcoffsets.ConsoleCmd, true, PRVM_EDICT_TO_PROG(sv.world.prog->edicts), sv.time, !(!sv.active || !prog || !prog->loaded), "QC function ConsoleCmd is missing"); + return PRVM_ConsoleCommand(prog, text, textlen, &prog->funcoffsets.ConsoleCmd, true, PRVM_EDICT_TO_PROG(sv.world.prog->edicts), sv.time, "QC function ConsoleCmd is missing"); } // #352 void(string cmdname) registercommand (EXT_CSQC) @@ -3043,7 +3043,7 @@ static void VM_SV_skel_get_bonename(prvm_prog_t *prog) return; if (bonenum < 0 || bonenum >= skeleton->model->num_bones) return; - PRVM_G_INT(OFS_RETURN) = PRVM_SetTempString(prog, skeleton->model->data_bones[bonenum].name); + PRVM_G_INT(OFS_RETURN) = PRVM_SetTempString(prog, skeleton->model->data_bones[bonenum].name, strlen(skeleton->model->data_bones[bonenum].name)); } // #267 float(float skel, float bonenum) skel_get_boneparent = #267; // (FTE_CSQC_SKELETONOBJECTS) returns parent num for supplied bonenum, 0 if bonenum has no parent or bone does not exist (returned value is always less than bonenum, you can loop on this) @@ -3309,7 +3309,7 @@ NULL, // #42 (QUAKE) VM_fabs, // #43 float(float f) fabs (QUAKE) VM_SV_aim, // #44 vector(entity e, float speed) aim (QUAKE) VM_cvar, // #45 float(string s) cvar (QUAKE) -VM_localcmd_server, // #46 void(string s) localcmd (QUAKE) +VM_localcmd, // #46 void(string s) localcmd (QUAKE) VM_nextent, // #47 entity(entity e) nextent (QUAKE) VM_SV_particle, // #48 void(vector o, vector d, float color, float count) particle (QUAKE) VM_changeyaw, // #49 void() ChangeYaw (QUAKE) @@ -3379,7 +3379,7 @@ VM_fclose, // #111 void(float fhandle) fclose (FRIK_FILE) VM_fgets, // #112 string(float fhandle) fgets (FRIK_FILE) VM_fputs, // #113 void(float fhandle, string s) fputs (FRIK_FILE) VM_strlen, // #114 float(string s) strlen (FRIK_FILE) -VM_strcat, // #115 string(string s1, string s2, ...) strcat (FRIK_FILE) +VM_strcat, // #115 string(string s, string...) strcat (FRIK_FILE) VM_substring, // #116 string(string s, float start, float length) substring (FRIK_FILE) VM_stov, // #117 vector(string) stov (FRIK_FILE) VM_strzone, // #118 string(string s) strzone (FRIK_FILE) @@ -3923,14 +3923,5 @@ void SVVM_init_cmd(prvm_prog_t *prog) void SVVM_reset_cmd(prvm_prog_t *prog) { World_End(&sv.world); - - if(prog->loaded && PRVM_serverfunction(SV_Shutdown)) - { - func_t s = PRVM_serverfunction(SV_Shutdown); - PRVM_serverglobalfloat(time) = sv.time; - PRVM_serverfunction(SV_Shutdown) = 0; // prevent it from getting called again - prog->ExecuteProgram(prog, s,"SV_Shutdown() required"); - } - VM_Cmd_Reset(prog); }