X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=svvm_cmds.c;h=54776d5653b78ed7aed89053b3e953aeb1d987af;hb=734f6d7e47a806d4f57e535979b1f71f986cf48b;hp=343a7fd5434cc0a557d6ba104446ff364b5ee2f1;hpb=48669036b4be979d997c27227942ed9c430277d5;p=xonotic%2Fdarkplaces.git diff --git a/svvm_cmds.c b/svvm_cmds.c index 343a7fd5..54776d56 100644 --- a/svvm_cmds.c +++ b/svvm_cmds.c @@ -8,227 +8,229 @@ -const char *vm_sv_extensions = -"BX_WAL_SUPPORT " -"DP_BUTTONCHAT " -"DP_BUTTONUSE " -"DP_CL_LOADSKY " -"DP_CON_ALIASPARAMETERS " -"DP_CON_BESTWEAPON " -"DP_CON_EXPANDCVAR " -"DP_CON_SET " -"DP_CON_SETA " -"DP_CON_STARTMAP " -"DP_COVERAGE " -"DP_CRYPTO " -"DP_CSQC_BINDMAPS " -"DP_CSQC_ENTITYWORLDOBJECT " -"DP_CSQC_ENTITYMODELLIGHT " -"DP_CSQC_ENTITYTRANSPARENTSORTING_OFFSET " -"DP_CSQC_MAINVIEW " -"DP_CSQC_MINFPS_QUALITY " -"DP_CSQC_MULTIFRAME_INTERPOLATION " -"DP_CSQC_BOXPARTICLES " -"DP_CSQC_SPAWNPARTICLE " -"DP_CSQC_QUERYRENDERENTITY " -"DP_CSQC_ROTATEMOVES " -"DP_CSQC_SETPAUSE " -"DP_CSQC_V_CALCREFDEF_WIP1 " -"DP_CSQC_V_CALCREFDEF_WIP2 " -"DP_EF_ADDITIVE " -"DP_EF_BLUE " -"DP_EF_DOUBLESIDED " -"DP_EF_DYNAMICMODELLIGHT " -"DP_EF_FLAME " -"DP_EF_FULLBRIGHT " -"DP_EF_NODEPTHTEST " -"DP_EF_NODRAW " -"DP_EF_NOGUNBOB " -"DP_EF_NOSELFSHADOW " -"DP_EF_NOSHADOW " -"DP_EF_RED " -"DP_EF_RESTARTANIM_BIT " -"DP_EF_STARDUST " -"DP_EF_TELEPORT_BIT " -"DP_ENT_ALPHA " -"DP_ENT_COLORMOD " -"DP_ENT_CUSTOMCOLORMAP " -"DP_ENT_EXTERIORMODELTOCLIENT " -"DP_ENT_GLOW " -"DP_ENT_GLOWMOD " -"DP_ENT_LOWPRECISION " -"DP_ENT_SCALE " -"DP_ENT_TRAILEFFECTNUM " -"DP_ENT_VIEWMODEL " -"DP_GFX_EXTERNALTEXTURES " -"DP_GFX_EXTERNALTEXTURES_PERMAP " -"DP_GFX_FOG " -"DP_GFX_MODEL_INTERPOLATION " -"DP_GFX_QUAKE3MODELTAGS " -"DP_GFX_SKINFILES " -"DP_GFX_SKYBOX " -"DP_GFX_FONTS " -"DP_GFX_FONTS_FREETYPE " -"DP_UTF8 " -"DP_FONT_VARIABLEWIDTH " -"DP_HALFLIFE_MAP " -"DP_HALFLIFE_MAP_CVAR " -"DP_HALFLIFE_SPRITE " -"DP_INPUTBUTTONS " -"DP_LIGHTSTYLE_STATICVALUE " -"DP_LITSPRITES " -"DP_LITSUPPORT " -"DP_MONSTERWALK " -"DP_MOVETYPEBOUNCEMISSILE " -"DP_MOVETYPEFLYWORLDONLY " -"DP_MOVETYPEFOLLOW " -"DP_NULL_MODEL " -"DP_QC_ASINACOSATANATAN2TAN " -"DP_QC_AUTOCVARS " -"DP_QC_CHANGEPITCH " -"DP_QC_CMD " -"DP_QC_COPYENTITY " -"DP_QC_CRC16 " -"DP_QC_CVAR_DEFSTRING " -"DP_QC_CVAR_DESCRIPTION " -"DP_QC_CVAR_STRING " -"DP_QC_CVAR_TYPE " -"DP_QC_DIGEST " -"DP_QC_DIGEST_SHA256 " -"DP_QC_EDICT_NUM " -"DP_QC_ENTITYDATA " -"DP_QC_ENTITYSTRING " -"DP_QC_ETOS " -"DP_QC_EXTRESPONSEPACKET " -"DP_QC_FINDCHAIN " -"DP_QC_FINDCHAINFLAGS " -"DP_QC_FINDCHAINFLOAT " -"DP_QC_FINDCHAIN_TOFIELD " -"DP_QC_FINDFLAGS " -"DP_QC_FINDFLOAT " -"DP_QC_FS_SEARCH " -"DP_QC_GETLIGHT " -"DP_QC_GETSURFACE " -"DP_QC_GETSURFACETRIANGLE " -"DP_QC_GETSURFACEPOINTATTRIBUTE " -"DP_QC_GETTAGINFO " -"DP_QC_GETTAGINFO_BONEPROPERTIES " -"DP_QC_GETTIME " -"DP_QC_GETTIME_CDTRACK " -"DP_QC_I18N " -"DP_QC_LOG " -"DP_QC_MINMAXBOUND " -"DP_QC_MULTIPLETEMPSTRINGS " -"DP_QC_NUM_FOR_EDICT " -"DP_QC_RANDOMVEC " -"DP_QC_SINCOSSQRTPOW " -"DP_QC_SPRINTF " -"DP_QC_STRFTIME " -"DP_QC_STRINGBUFFERS " -"DP_QC_STRINGBUFFERS_CVARLIST " -"DP_QC_STRINGBUFFERS_EXT_WIP " -"DP_QC_STRINGCOLORFUNCTIONS " -"DP_QC_STRING_CASE_FUNCTIONS " -"DP_QC_STRREPLACE " -"DP_QC_TOKENIZEBYSEPARATOR " -"DP_QC_TOKENIZE_CONSOLE " -"DP_QC_TRACEBOX " -"DP_QC_TRACETOSS " -"DP_QC_TRACE_MOVETYPE_HITMODEL " -"DP_QC_TRACE_MOVETYPE_WORLDONLY " -"DP_QC_UNLIMITEDTEMPSTRINGS " -"DP_QC_URI_ESCAPE " -"DP_QC_URI_GET " -"DP_QC_URI_POST " -"DP_QC_VECTOANGLES_WITH_ROLL " -"DP_QC_VECTORVECTORS " -"DP_QC_WHICHPACK " -"DP_QUAKE2_MODEL " -"DP_QUAKE2_SPRITE " -"DP_QUAKE3_MAP " -"DP_QUAKE3_MODEL " -"DP_REGISTERCVAR " -"DP_SKELETONOBJECTS " -"DP_SND_DIRECTIONLESSATTNNONE " -"DP_SND_FAKETRACKS " -"DP_SND_SOUND7_WIP1 " -"DP_SND_SOUND7_WIP2 " -"DP_SND_OGGVORBIS " -"DP_SND_SETPARAMS " -"DP_SND_STEREOWAV " -"DP_SND_GETSOUNDTIME " -"DP_VIDEO_DPV " -"DP_VIDEO_SUBTITLES " -"DP_SOLIDCORPSE " -"DP_SPRITE32 " -"DP_SV_BOTCLIENT " -"DP_SV_BOUNCEFACTOR " -"DP_SV_CLIENTCAMERA " -"DP_SV_CLIENTCOLORS " -"DP_SV_CLIENTNAME " -"DP_SV_CMD " -"DP_SV_CUSTOMIZEENTITYFORCLIENT " -"DP_SV_DISABLECLIENTPREDICTION " -"DP_SV_DISCARDABLEDEMO " -"DP_SV_DRAWONLYTOCLIENT " -"DP_SV_DROPCLIENT " -"DP_SV_EFFECT " -"DP_SV_ENTITYCONTENTSTRANSITION " -"DP_SV_MODELFLAGS_AS_EFFECTS " -"DP_SV_MOVETYPESTEP_LANDEVENT " -"DP_SV_NETADDRESS " -"DP_SV_NODRAWTOCLIENT " -"DP_SV_ONENTITYNOSPAWNFUNCTION " -"DP_SV_ONENTITYPREPOSTSPAWNFUNCTION " -"DP_SV_PING " -"DP_SV_PING_PACKETLOSS " -"DP_SV_PLAYERPHYSICS " -"DP_PHYSICS_ODE " -"DP_SV_POINTPARTICLES " -"DP_SV_POINTSOUND " -"DP_SV_PRECACHEANYTIME " -"DP_SV_PRINT " -"DP_SV_PUNCHVECTOR " -"DP_SV_QCSTATUS " -"DP_SV_ROTATINGBMODEL " -"DP_SV_SETCOLOR " -"DP_SV_SHUTDOWN " -"DP_SV_SLOWMO " -"DP_SV_SPAWNFUNC_PREFIX " -"DP_SV_WRITEPICTURE " -"DP_SV_WRITEUNTERMINATEDSTRING " -"DP_TE_BLOOD " -"DP_TE_BLOODSHOWER " -"DP_TE_CUSTOMFLASH " -"DP_TE_EXPLOSIONRGB " -"DP_TE_FLAMEJET " -"DP_TE_PARTICLECUBE " -"DP_TE_PARTICLERAIN " -"DP_TE_PARTICLESNOW " -"DP_TE_PLASMABURN " -"DP_TE_QUADEFFECTS1 " -"DP_TE_SMALLFLASH " -"DP_TE_SPARK " -"DP_TE_STANDARDEFFECTBUILTINS " -"DP_TRACE_HITCONTENTSMASK_SURFACEINFO " -"DP_USERMOVETYPES " -"DP_VIEWZOOM " -"EXT_BITSHIFT " -"FRIK_FILE " -"FTE_CSQC_SKELETONOBJECTS " -"FTE_QC_CHECKPVS " -"FTE_STRINGS " -"KRIMZON_SV_PARSECLIENTCOMMAND " -"NEH_CMD_PLAY2 " -"NEH_RESTOREGAME " -"NEXUIZ_PLAYERMODEL " -"NXQ_GFX_LETTERBOX " -"PRYDON_CLIENTCURSOR " -"TENEBRAE_GFX_DLIGHTS " -"TW_SV_STEPCONTROL " -"ZQ_PAUSE " -//"EXT_CSQC " // not ready yet -; +const char *vm_sv_extensions[] = { +"BX_WAL_SUPPORT", +"DP_BUTTONCHAT", +"DP_BUTTONUSE", +"DP_CL_LOADSKY", +"DP_CON_ALIASPARAMETERS", +"DP_CON_BESTWEAPON", +"DP_CON_EXPANDCVAR", +"DP_CON_SET", +"DP_CON_SETA", +"DP_CON_STARTMAP", +"DP_COVERAGE", +"DP_CRYPTO", +"DP_CSQC_BINDMAPS", +"DP_CSQC_ENTITYWORLDOBJECT", +"DP_CSQC_ENTITYMODELLIGHT", +"DP_CSQC_ENTITYTRANSPARENTSORTING_OFFSET", +"DP_CSQC_MAINVIEW", +"DP_CSQC_MINFPS_QUALITY", +"DP_CSQC_MULTIFRAME_INTERPOLATION", +"DP_CSQC_BOXPARTICLES", +"DP_CSQC_SPAWNPARTICLE", +"DP_CSQC_QUERYRENDERENTITY", +"DP_CSQC_ROTATEMOVES", +"DP_CSQC_SETPAUSE", +"DP_CSQC_V_CALCREFDEF_WIP1", +"DP_CSQC_V_CALCREFDEF_WIP2", +"DP_EF_ADDITIVE", +"DP_EF_BLUE", +"DP_EF_DOUBLESIDED", +"DP_EF_DYNAMICMODELLIGHT", +"DP_EF_FLAME", +"DP_EF_FULLBRIGHT", +"DP_EF_NODEPTHTEST", +"DP_EF_NODRAW", +"DP_EF_NOGUNBOB", +"DP_EF_NOSELFSHADOW", +"DP_EF_NOSHADOW", +"DP_EF_RED", +"DP_EF_RESTARTANIM_BIT", +"DP_EF_STARDUST", +"DP_EF_TELEPORT_BIT", +"DP_ENT_ALPHA", +"DP_ENT_COLORMOD", +"DP_ENT_CUSTOMCOLORMAP", +"DP_ENT_EXTERIORMODELTOCLIENT", +"DP_ENT_GLOW", +"DP_ENT_GLOWMOD", +"DP_ENT_LOWPRECISION", +"DP_ENT_SCALE", +"DP_ENT_TRAILEFFECTNUM", +"DP_ENT_VIEWMODEL", +"DP_GFX_EXTERNALTEXTURES", +"DP_GFX_EXTERNALTEXTURES_PERMAP", +"DP_GFX_FOG", +"DP_GFX_MODEL_INTERPOLATION", +"DP_GFX_QUAKE3MODELTAGS", +"DP_GFX_SKINFILES", +"DP_GFX_SKYBOX", +"DP_GFX_FONTS", +"DP_GFX_FONTS_FREETYPE", +"DP_UTF8", +"DP_FONT_VARIABLEWIDTH", +"DP_HALFLIFE_MAP", +"DP_HALFLIFE_MAP_CVAR", +"DP_HALFLIFE_SPRITE", +"DP_INPUTBUTTONS", +"DP_LIGHTSTYLE_STATICVALUE", +"DP_LITSPRITES", +"DP_LITSUPPORT", +"DP_MONSTERWALK", +"DP_MOVETYPEBOUNCEMISSILE", +"DP_MOVETYPEFLYWORLDONLY", +"DP_MOVETYPEFOLLOW", +"DP_NULL_MODEL", +"DP_QC_ASINACOSATANATAN2TAN", +"DP_QC_AUTOCVARS", +"DP_QC_CHANGEPITCH", +"DP_QC_CMD", +"DP_QC_COPYENTITY", +"DP_QC_CRC16", +"DP_QC_CVAR_DEFSTRING", +"DP_QC_CVAR_DESCRIPTION", +"DP_QC_CVAR_STRING", +"DP_QC_CVAR_TYPE", +"DP_QC_DIGEST", +"DP_QC_DIGEST_SHA256", +"DP_QC_EDICT_NUM", +"DP_QC_ENTITYDATA", +"DP_QC_ENTITYSTRING", +"DP_QC_ETOS", +"DP_QC_EXTRESPONSEPACKET", +"DP_QC_FINDCHAIN", +"DP_QC_FINDCHAINFLAGS", +"DP_QC_FINDCHAINFLOAT", +"DP_QC_FINDCHAIN_TOFIELD", +"DP_QC_FINDFLAGS", +"DP_QC_FINDFLOAT", +"DP_QC_FS_SEARCH", +"DP_QC_GETLIGHT", +"DP_QC_GETSURFACE", +"DP_QC_GETSURFACETRIANGLE", +"DP_QC_GETSURFACEPOINTATTRIBUTE", +"DP_QC_GETTAGINFO", +"DP_QC_GETTAGINFO_BONEPROPERTIES", +"DP_QC_GETTIME", +"DP_QC_GETTIME_CDTRACK", +"DP_QC_I18N", +"DP_QC_LOG", +"DP_QC_MINMAXBOUND", +"DP_QC_MULTIPLETEMPSTRINGS", +"DP_QC_NUM_FOR_EDICT", +"DP_QC_RANDOMVEC", +"DP_QC_SINCOSSQRTPOW", +"DP_QC_SPRINTF", +"DP_QC_STRFTIME", +"DP_QC_STRINGBUFFERS", +"DP_QC_STRINGBUFFERS_CVARLIST", +"DP_QC_STRINGBUFFERS_EXT_WIP", +"DP_QC_STRINGCOLORFUNCTIONS", +"DP_QC_STRING_CASE_FUNCTIONS", +"DP_QC_STRREPLACE", +"DP_QC_TOKENIZEBYSEPARATOR", +"DP_QC_TOKENIZE_CONSOLE", +"DP_QC_TRACEBOX", +"DP_QC_TRACETOSS", +"DP_QC_TRACE_MOVETYPE_HITMODEL", +"DP_QC_TRACE_MOVETYPE_WORLDONLY", +"DP_QC_UNLIMITEDTEMPSTRINGS", +"DP_QC_URI_ESCAPE", +"DP_QC_URI_GET", +"DP_QC_URI_POST", +"DP_QC_VECTOANGLES_WITH_ROLL", +"DP_QC_VECTORVECTORS", +"DP_QC_WHICHPACK", +"DP_QUAKE2_MODEL", +"DP_QUAKE2_SPRITE", +"DP_QUAKE3_MAP", +"DP_QUAKE3_MODEL", +"DP_REGISTERCVAR", +"DP_SKELETONOBJECTS", +"DP_SND_DIRECTIONLESSATTNNONE", +"DP_SND_FAKETRACKS", +"DP_SND_SOUND7_WIP1", +"DP_SND_SOUND7_WIP2", +"DP_SND_OGGVORBIS", +"DP_SND_SETPARAMS", +"DP_SND_STEREOWAV", +"DP_SND_GETSOUNDTIME", +"DP_VIDEO_DPV", +"DP_VIDEO_SUBTITLES", +"DP_SOLIDCORPSE", +"DP_SPRITE32", +"DP_SV_BOTCLIENT", +"DP_SV_BOUNCEFACTOR", +"DP_SV_CLIENTCAMERA", +"DP_SV_CLIENTCOLORS", +"DP_SV_CLIENTNAME", +"DP_SV_CMD", +"DP_SV_CUSTOMIZEENTITYFORCLIENT", +"DP_SV_DISABLECLIENTPREDICTION", +"DP_SV_DISCARDABLEDEMO", +"DP_SV_DRAWONLYTOCLIENT", +"DP_SV_DROPCLIENT", +"DP_SV_EFFECT", +"DP_SV_ENTITYCONTENTSTRANSITION", +"DP_SV_MODELFLAGS_AS_EFFECTS", +"DP_SV_MOVETYPESTEP_LANDEVENT", +"DP_SV_NETADDRESS", +"DP_SV_NODRAWTOCLIENT", +"DP_SV_ONENTITYNOSPAWNFUNCTION", +"DP_SV_ONENTITYPREPOSTSPAWNFUNCTION", +"DP_SV_PING", +"DP_SV_PING_PACKETLOSS", +"DP_SV_PLAYERPHYSICS", +"DP_PHYSICS_ODE", +"DP_SV_POINTPARTICLES", +"DP_SV_POINTSOUND", +"DP_SV_PRECACHEANYTIME", +"DP_SV_PRINT", +"DP_SV_PUNCHVECTOR", +"DP_SV_QCSTATUS", +"DP_SV_ROTATINGBMODEL", +"DP_SV_SETCOLOR", +"DP_SV_SHUTDOWN", +"DP_SV_SLOWMO", +"DP_SV_SPAWNFUNC_PREFIX", +"DP_SV_WRITEPICTURE", +"DP_SV_WRITEUNTERMINATEDSTRING", +"DP_TE_BLOOD", +"DP_TE_BLOODSHOWER", +"DP_TE_CUSTOMFLASH", +"DP_TE_EXPLOSIONRGB", +"DP_TE_FLAMEJET", +"DP_TE_PARTICLECUBE", +"DP_TE_PARTICLERAIN", +"DP_TE_PARTICLESNOW", +"DP_TE_PLASMABURN", +"DP_TE_QUADEFFECTS1", +"DP_TE_SMALLFLASH", +"DP_TE_SPARK", +"DP_TE_STANDARDEFFECTBUILTINS", +"DP_TRACE_HITCONTENTSMASK_SURFACEINFO" +"DP_USERMOVETYPES", +"DP_VIEWZOOM", +"EXT_BITSHIFT", +"FRIK_FILE", +"FTE_CSQC_SKELETONOBJECTS", +"FTE_QC_CHECKPVS", +"FTE_STRINGS", +"KRIMZON_SV_PARSECLIENTCOMMAND", +"NEH_CMD_PLAY2", +"NEH_RESTOREGAME", +"NEXUIZ_PLAYERMODEL", +"NXQ_GFX_LETTERBOX", +"PRYDON_CLIENTCURSOR", +"TENEBRAE_GFX_DLIGHTS", +"TW_SV_STEPCONTROL", +"ZQ_PAUSE", +"DP_RM_CLIPGROUP", +NULL +//"EXT_CSQC" // not ready yet +}; /* ================= @@ -243,7 +245,7 @@ static void VM_SV_setorigin(prvm_prog_t *prog) { prvm_edict_t *e; - VM_SAFEPARMCOUNT(2, VM_setorigin); + VM_SAFEPARMCOUNT(2, VM_SV_setorigin); e = PRVM_G_EDICT(OFS_PARM0); if (e == prog->edicts) @@ -294,7 +296,7 @@ static void VM_SV_setsize(prvm_prog_t *prog) prvm_edict_t *e; vec3_t mins, maxs; - VM_SAFEPARMCOUNT(3, VM_setsize); + VM_SAFEPARMCOUNT(3, VM_SV_setsize); e = PRVM_G_EDICT(OFS_PARM0); if (e == prog->edicts) @@ -327,7 +329,7 @@ static void VM_SV_setmodel(prvm_prog_t *prog) dp_model_t *mod; int i; - VM_SAFEPARMCOUNT(2, VM_setmodel); + VM_SAFEPARMCOUNT(2, VM_SV_setmodel); e = PRVM_G_EDICT(OFS_PARM0); if (e == prog->edicts) @@ -517,6 +519,7 @@ already running on that entity/channel pair. An attenuation of 0 will play full volume everywhere in the level. Larger attenuations will drop off. +void(entity e, float chan, string samp, float volume[, float atten[, float pitchchange[, float flags]]]) sound (QUAKE) ================= */ static void VM_SV_sound(prvm_prog_t *prog) @@ -968,7 +971,7 @@ static void VM_SV_stuffcmd(prvm_prog_t *prog) old = host_client; host_client = svs.clients + entnum-1; - Host_ClientCommands ("%s", string); + SV_ClientCommands ("%s", string); host_client = old; } @@ -1626,21 +1629,17 @@ static void VM_SV_getlight(prvm_prog_t *prog) typedef struct { - unsigned char type; // 1/2/8 or other value if isn't used + unsigned char type; // 1/2/8 or 0 to indicate unused int fieldoffset; }customstat_t; -static customstat_t *vm_customstats = NULL; //[515]: it starts from 0, not 32 +static customstat_t vm_customstats[MAX_CL_STATS]; // matches the regular stat numbers, but only MIN_VM_STAT to MAX_VM_STAT range is used if things are working properly (can register stats from MAX_VM_STAT to MAX_CL_STATS but will warn) static int vm_customstats_last; void VM_CustomStats_Clear (void) { - if(vm_customstats) - { - Z_Free(vm_customstats); - vm_customstats = NULL; - vm_customstats_last = -1; - } + memset(vm_customstats, 0, sizeof(vm_customstats)); + vm_customstats_last = -1; } void VM_SV_UpdateCustomStats (client_t *client, prvm_edict_t *ent, sizebuf_t *msg, int *stats) @@ -1653,10 +1652,7 @@ void VM_SV_UpdateCustomStats (client_t *client, prvm_edict_t *ent, sizebuf_t *ms float f; } u; - if(!vm_customstats) - return; - - for(i=0; i= (MAX_CL_STATS-32)) + + if (i >= MAX_CL_STATS) { - VM_Warning(prog, "PF_SV_AddStat: index >= MAX_CL_STATS\n"); + VM_Warning(prog, "PF_SV_AddStat: index (%i) >= MAX_CL_STATS (%i), not supported by protocol, and AddStat beyond MAX_VM_STAT (%i) conflicts with engine MOVEVARS\n", i, MAX_CL_STATS, MAX_VM_STAT); return; } - if(i > (MAX_CL_STATS-32-4) && type == 1) + + if (i > (MAX_CL_STATS - 4) && type == 1) { - VM_Warning(prog, "PF_SV_AddStat: index > (MAX_CL_STATS-4) with string\n"); + VM_Warning(prog, "PF_SV_AddStat: index (%i) > (MAX_CL_STATS (%i) - 4) with string type won't fit in the protocol, and AddStat beyond MAX_VM_STAT conflicts with engine MOVEVARS\n", i, MAX_CL_STATS); return; } + + // 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) + 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) + 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; vm_customstats[i].fieldoffset = off; if(vm_customstats_last < i) @@ -1772,6 +1781,8 @@ static void VM_SV_copyentity(prvm_prog_t *prog) return; } memcpy(out->fields.fp, in->fields.fp, prog->entityfields * sizeof(prvm_vec_t)); + if (VectorCompare(PRVM_serveredictvector(out, absmin), PRVM_serveredictvector(out, absmax))) + return; SV_LinkEdict(out); } @@ -2344,7 +2355,7 @@ static void VM_SV_clientcommand(prvm_prog_t *prog) temp_client = host_client; host_client = svs.clients + i; - Cmd_ExecuteString (PRVM_G_STRING(OFS_PARM1), src_client, true); + Cmd_ExecuteString(&cmd_serverfromclient, PRVM_G_STRING(OFS_PARM1), src_client, true); host_client = temp_client; } @@ -2867,7 +2878,7 @@ static void VM_SV_setpause(prvm_prog_t *prog) { pauseValue = (int)PRVM_G_FLOAT(OFS_PARM0); if (pauseValue != 0) { //pause the game sv.paused = 1; - sv.pausedstart = realtime; + sv.pausedstart = host.realtime; } else { //disable pause, in case it was enabled if (sv.paused != 0) { sv.paused = 0; @@ -3195,7 +3206,7 @@ VM_SV_setsize, // #4 void(entity e, vector min, vector max) setsize (QUAKE) NULL, // #5 void(entity e, vector min, vector max) setabssize (QUAKE) VM_break, // #6 void() break (QUAKE) VM_random, // #7 float() random (QUAKE) -VM_SV_sound, // #8 void(entity e, float chan, string samp) sound (QUAKE) +VM_SV_sound, // #8 void(entity e, float chan, string samp, float volume[, float atten[, float pitchchange[, float flags]]]) sound (QUAKE) VM_normalize, // #9 vector(vector v) normalize (QUAKE) VM_error, // #10 void(string e) error (QUAKE) VM_objerror, // #11 void(string e) objerror (QUAKE) @@ -3233,7 +3244,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, // #46 void(string s) localcmd (QUAKE) +VM_localcmd_server, // #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)