X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=svvm_cmds.c;h=5700b21aca1a34d8fcf9e2b5422c4bfba0fa980e;hb=eb529936e63194bad80c9a4896a85a7a2e3610c6;hp=9be2ed7177462246757d76794166ff3ea82b7f9e;hpb=5752bb49dac8f030a85cd97f12e23c78734b8cfe;p=xonotic%2Fdarkplaces.git diff --git a/svvm_cmds.c b/svvm_cmds.c index 9be2ed71..5700b21a 100644 --- a/svvm_cmds.c +++ b/svvm_cmds.c @@ -3,7 +3,6 @@ //============================================================================ // Server -cvar_t sv_aim = {CVAR_SAVE, "sv_aim", "2", "maximum cosine angle for quake's vertical autoaim, a value above 1 completely disables the autoaim, quake used 0.93"}; //"0.93"}; // LordHavoc: disabled autoaim by default char *vm_sv_extensions = @@ -24,6 +23,7 @@ char *vm_sv_extensions = "DP_EF_NODEPTHTEST " "DP_EF_NODRAW " "DP_EF_NOSHADOW " +"DP_EF_NOGUNBOB " "DP_EF_RED " "DP_EF_STARDUST " "DP_ENT_ALPHA " @@ -52,6 +52,7 @@ char *vm_sv_extensions = "DP_QC_ASINACOSATANATAN2TAN " "DP_QC_CHANGEPITCH " "DP_QC_COPYENTITY " +"DP_QC_CVAR_DEFSTRING " "DP_QC_CVAR_STRING " "DP_QC_ETOS " "DP_QC_FINDCHAIN " @@ -68,8 +69,10 @@ char *vm_sv_extensions = "DP_QC_RANDOMVEC " "DP_QC_SINCOSSQRTPOW " "DP_QC_STRFTIME " +"DP_QC_STRING_CASE_FUNCTIONS " "DP_QC_STRINGBUFFERS " "DP_QC_STRINGCOLORFUNCTIONS " +"DP_QC_TOKENIZEBYSEPARATOR " "DP_QC_TRACEBOX " "DP_QC_TRACETOSS " "DP_QC_TRACE_MOVETYPE_HITMODEL " @@ -95,9 +98,14 @@ char *vm_sv_extensions = "DP_SV_DROPCLIENT " "DP_SV_EFFECT " "DP_SV_ENTITYCONTENTSTRANSITION " +"DP_SV_ONENTITYNOSPAWNFUNCTION " +"DP_SV_MODELFLAGS_AS_EFFECTS " +"DP_SV_NETADDRESS " "DP_SV_NODRAWTOCLIENT " "DP_SV_PING " "DP_SV_PLAYERPHYSICS " +"DP_SV_POINTPARTICLES " +"DP_SV_POINTSOUND " "DP_SV_PRECACHEANYTIME " "DP_SV_PRINT " "DP_SV_PUNCHVECTOR " @@ -131,6 +139,11 @@ char *vm_sv_extensions = "PRYDON_CLIENTCURSOR " "TENEBRAE_GFX_DLIGHTS " "TW_SV_STEPCONTROL " +"DP_SV_CMD " +"DP_QC_CMD " +"FTE_STRINGS " +"DP_CON_BESTWEAPON " +"DP_QC_STRREPLACE " ; /* @@ -275,9 +288,17 @@ static void VM_SV_sprint (void) int entnum; char string[VM_STRINGTEMP_LENGTH]; + VM_VarString(1, string, sizeof(string)); + VM_SAFEPARMCOUNTRANGE(2, 8, VM_SV_sprint); entnum = PRVM_G_EDICTNUM(OFS_PARM0); + // LordHavoc: div0 requested that sprintto world operate like print + if (entnum == 0) + { + Con_Print(string); + return; + } if (entnum < 1 || entnum > svs.maxclients || !svs.clients[entnum-1].active) { @@ -289,7 +310,6 @@ static void VM_SV_sprint (void) if (!client->netconnection) return; - VM_VarString(1, string, sizeof(string)); MSG_WriteChar(&client->netconnection->message,svc_print); MSG_WriteString(&client->netconnection->message, string); } @@ -390,7 +410,7 @@ static void VM_SV_ambientsound (void) MSG_WriteVector(&sv.signon, pos, sv.protocol); - if (large) + if (large || sv.protocol == PROTOCOL_NEHAHRABJP || sv.protocol == PROTOCOL_NEHAHRABJP2 || sv.protocol == PROTOCOL_NEHAHRABJP3) MSG_WriteShort (&sv.signon, soundnum); else MSG_WriteByte (&sv.signon, soundnum); @@ -423,13 +443,18 @@ static void VM_SV_sound (void) int volume; float attenuation; - VM_SAFEPARMCOUNT(5, VM_SV_sound); + VM_SAFEPARMCOUNTRANGE(4, 5, VM_SV_sound); entity = PRVM_G_EDICT(OFS_PARM0); channel = (int)PRVM_G_FLOAT(OFS_PARM1); sample = PRVM_G_STRING(OFS_PARM2); volume = (int)(PRVM_G_FLOAT(OFS_PARM3) * 255); attenuation = PRVM_G_FLOAT(OFS_PARM4); + if (prog->argc < 5) + { + Con_DPrintf("VM_SV_sound: given only 4 parameters, expected 5, assuming attenuation = ATTN_NORMAL\n"); + attenuation = 1; + } if (volume < 0 || volume > 255) { @@ -452,6 +477,45 @@ static void VM_SV_sound (void) SV_StartSound (entity, channel, sample, volume, attenuation); } +/* +================= +VM_SV_pointsound + +Follows the same logic as VM_SV_sound, except instead of +an entity, an origin for the sound is provided, and channel +is omitted (since no entity is being tracked). + +================= +*/ +static void VM_SV_pointsound(void) +{ + const char *sample; + int volume; + float attenuation; + vec3_t org; + + VM_SAFEPARMCOUNT(4, VM_SV_pointsound); + + VectorCopy(PRVM_G_VECTOR(OFS_PARM0), org); + sample = PRVM_G_STRING(OFS_PARM1); + volume = (int)(PRVM_G_FLOAT(OFS_PARM2) * 255); + attenuation = PRVM_G_FLOAT(OFS_PARM3); + + if (volume < 0 || volume > 255) + { + VM_Warning("SV_StartPointSound: volume must be in range 0-1\n"); + return; + } + + if (attenuation < 0 || attenuation > 4) + { + VM_Warning("SV_StartPointSound: attenuation must be in range 0-4\n"); + return; + } + + SV_StartPointSound (org, sample, volume, attenuation); +} + /* ================= VM_SV_traceline @@ -634,7 +698,7 @@ static int VM_SV_newcheckclient (int check) VectorAdd(ent->fields.server->origin, ent->fields.server->view_ofs, org); checkpvsbytes = 0; if (sv.worldmodel && sv.worldmodel->brush.FatPVS) - checkpvsbytes = sv.worldmodel->brush.FatPVS(sv.worldmodel, org, 0, checkpvs, sizeof(checkpvs)); + checkpvsbytes = sv.worldmodel->brush.FatPVS(sv.worldmodel, org, 0, checkpvs, sizeof(checkpvs), false); return i; } @@ -785,7 +849,7 @@ static void VM_SV_findradius (void) eorg[2] -= bound(ent->fields.server->mins[2], eorg[2], ent->fields.server->maxs[2]); } else - VectorMAMAM(1, eorg, 0.5f, ent->fields.server->mins, 0.5f, ent->fields.server->maxs, eorg); + VectorMAMAM(1, eorg, -0.5f, ent->fields.server->mins, -0.5f, ent->fields.server->maxs, eorg); if (DotProduct(eorg, eorg) < radius2) { ent->fields.server->chain = PRVM_EDICT_TO_PROG(chain); @@ -1096,7 +1160,6 @@ sizebuf_t *WriteDest (void) int entnum; int dest; prvm_edict_t *ent; - extern sizebuf_t *sv2csqcbuf; dest = (int)PRVM_G_FLOAT(OFS_PARM0); switch (dest) @@ -1124,7 +1187,7 @@ sizebuf_t *WriteDest (void) return &sv.signon; case MSG_ENTITY: - return sv2csqcbuf; + return sv.writeentitiestoclient_msg; } return NULL; @@ -1192,9 +1255,14 @@ static void VM_SV_makestatic (void) prvm_edict_t *ent; int i, large; - VM_SAFEPARMCOUNT(1, VM_SV_makestatic); + // allow 0 parameters due to an id1 qc bug in which this function is used + // with no parameters (but directly after setmodel with self in OFS_PARM0) + VM_SAFEPARMCOUNTRANGE(0, 1, VM_SV_makestatic); - ent = PRVM_G_EDICT(OFS_PARM0); + if (prog->argc >= 1) + ent = PRVM_G_EDICT(OFS_PARM0); + else + ent = PRVM_PROG_TO_EDICT(prog->globals.server->self); if (ent == prog->edicts) { VM_Warning("makestatic: can not modify world entity\n"); @@ -1216,6 +1284,12 @@ static void VM_SV_makestatic (void) MSG_WriteShort (&sv.signon, (int)ent->fields.server->modelindex); MSG_WriteShort (&sv.signon, (int)ent->fields.server->frame); } + else if (sv.protocol == PROTOCOL_NEHAHRABJP || sv.protocol == PROTOCOL_NEHAHRABJP2 || sv.protocol == PROTOCOL_NEHAHRABJP3) + { + MSG_WriteByte (&sv.signon,svc_spawnstatic); + MSG_WriteShort (&sv.signon, (int)ent->fields.server->modelindex); + MSG_WriteByte (&sv.signon, (int)ent->fields.server->frame); + } else { MSG_WriteByte (&sv.signon,svc_spawnstatic); @@ -1248,7 +1322,7 @@ static void VM_SV_setspawnparms (void) int i; client_t *client; - VM_SAFEPARMCOUNT(0, VM_SV_setspawnparms); + VM_SAFEPARMCOUNT(1, VM_SV_setspawnparms); ent = PRVM_G_EDICT(OFS_PARM0); i = PRVM_NUM_FOR_EDICT(ent); @@ -1294,102 +1368,51 @@ typedef struct { unsigned char type; // 1/2/8 or other value if isn't used int fieldoffset; -}autosentstat_t; +}customstat_t; -static autosentstat_t *vm_autosentstats = NULL; //[515]: it starts from 0, not 32 -static int vm_autosentstats_last; +static customstat_t *vm_customstats = NULL; //[515]: it starts from 0, not 32 +static int vm_customstats_last; -void VM_AutoSentStats_Clear (void) +void VM_CustomStats_Clear (void) { - if(vm_autosentstats) + if(vm_customstats) { - Z_Free(vm_autosentstats); - vm_autosentstats = NULL; - vm_autosentstats_last = -1; + Z_Free(vm_customstats); + vm_customstats = NULL; + vm_customstats_last = -1; } } -//[515]: add check if even bigger ? "try to use two stats, cause it's too big" ? -#define VM_SENDSTAT(a,b,c)\ -{\ -/* if((c))*/\ - if((c)==(unsigned char)(c))\ - {\ - MSG_WriteByte((a), svc_updatestatubyte);\ - MSG_WriteByte((a), (b));\ - MSG_WriteByte((a), (c));\ - }\ - else\ - {\ - MSG_WriteByte((a), svc_updatestat);\ - MSG_WriteByte((a), (b));\ - MSG_WriteLong((a), (c));\ - }\ -}\ - -void VM_SV_WriteAutoSentStats (client_t *client, prvm_edict_t *ent, sizebuf_t *msg, int *stats) +void VM_SV_UpdateCustomStats (client_t *client, prvm_edict_t *ent, sizebuf_t *msg, int *stats) { - int i, v, *si; + int i; char s[17]; - const char *t; - qboolean send; - union - { - float f; - int i; - }k; - if(!vm_autosentstats) + if(!vm_customstats) return; - send = (sv.protocol != PROTOCOL_QUAKE && sv.protocol != PROTOCOL_QUAKEDP && sv.protocol != PROTOCOL_NEHAHRAMOVIE && sv.protocol != PROTOCOL_DARKPLACES1 && sv.protocol != PROTOCOL_DARKPLACES2 && sv.protocol != PROTOCOL_DARKPLACES3 && sv.protocol != PROTOCOL_DARKPLACES4 && sv.protocol != PROTOCOL_DARKPLACES5); - - for(i=0; i (MAX_CL_STATS-4) with string\n"); return; } - vm_autosentstats[i].type = type; - vm_autosentstats[i].fieldoffset = off; - if(vm_autosentstats_last < i) - vm_autosentstats_last = i; + vm_customstats[i].type = type; + vm_customstats[i].fieldoffset = off; + if(vm_customstats_last < i) + vm_customstats_last = i; } /* @@ -1587,6 +1610,7 @@ static void VM_SV_te_blood (void) MSG_WriteByte(&sv.datagram, bound(-128, (int) PRVM_G_VECTOR(OFS_PARM1)[2], 127)); // count MSG_WriteByte(&sv.datagram, bound(0, (int) PRVM_G_FLOAT(OFS_PARM2), 255)); + SV_FlushBroadcastMessages(); } static void VM_SV_te_bloodshower (void) @@ -1608,6 +1632,7 @@ static void VM_SV_te_bloodshower (void) MSG_WriteCoord(&sv.datagram, PRVM_G_FLOAT(OFS_PARM2), sv.protocol); // count MSG_WriteShort(&sv.datagram, (int)bound(0, PRVM_G_FLOAT(OFS_PARM3), 65535)); + SV_FlushBroadcastMessages(); } static void VM_SV_te_explosionrgb (void) @@ -1623,6 +1648,7 @@ static void VM_SV_te_explosionrgb (void) MSG_WriteByte(&sv.datagram, bound(0, (int) (PRVM_G_VECTOR(OFS_PARM1)[0] * 255), 255)); MSG_WriteByte(&sv.datagram, bound(0, (int) (PRVM_G_VECTOR(OFS_PARM1)[1] * 255), 255)); MSG_WriteByte(&sv.datagram, bound(0, (int) (PRVM_G_VECTOR(OFS_PARM1)[2] * 255), 255)); + SV_FlushBroadcastMessages(); } static void VM_SV_te_particlecube (void) @@ -1652,6 +1678,7 @@ static void VM_SV_te_particlecube (void) MSG_WriteByte(&sv.datagram, ((int) PRVM_G_FLOAT(OFS_PARM5)) != 0); // randomvel MSG_WriteCoord(&sv.datagram, PRVM_G_FLOAT(OFS_PARM6), sv.protocol); + SV_FlushBroadcastMessages(); } static void VM_SV_te_particlerain (void) @@ -1677,6 +1704,7 @@ static void VM_SV_te_particlerain (void) MSG_WriteShort(&sv.datagram, (int)bound(0, PRVM_G_FLOAT(OFS_PARM3), 65535)); // color MSG_WriteByte(&sv.datagram, (int)PRVM_G_FLOAT(OFS_PARM4)); + SV_FlushBroadcastMessages(); } static void VM_SV_te_particlesnow (void) @@ -1702,6 +1730,7 @@ static void VM_SV_te_particlesnow (void) MSG_WriteShort(&sv.datagram, (int)bound(0, PRVM_G_FLOAT(OFS_PARM3), 65535)); // color MSG_WriteByte(&sv.datagram, (int)PRVM_G_FLOAT(OFS_PARM4)); + SV_FlushBroadcastMessages(); } static void VM_SV_te_spark (void) @@ -1721,6 +1750,7 @@ static void VM_SV_te_spark (void) MSG_WriteByte(&sv.datagram, bound(-128, (int) PRVM_G_VECTOR(OFS_PARM1)[2], 127)); // count MSG_WriteByte(&sv.datagram, bound(0, (int) PRVM_G_FLOAT(OFS_PARM2), 255)); + SV_FlushBroadcastMessages(); } static void VM_SV_te_gunshotquad (void) @@ -1732,6 +1762,7 @@ static void VM_SV_te_gunshotquad (void) MSG_WriteCoord(&sv.datagram, PRVM_G_VECTOR(OFS_PARM0)[0], sv.protocol); MSG_WriteCoord(&sv.datagram, PRVM_G_VECTOR(OFS_PARM0)[1], sv.protocol); MSG_WriteCoord(&sv.datagram, PRVM_G_VECTOR(OFS_PARM0)[2], sv.protocol); + SV_FlushBroadcastMessages(); } static void VM_SV_te_spikequad (void) @@ -1743,6 +1774,7 @@ static void VM_SV_te_spikequad (void) MSG_WriteCoord(&sv.datagram, PRVM_G_VECTOR(OFS_PARM0)[0], sv.protocol); MSG_WriteCoord(&sv.datagram, PRVM_G_VECTOR(OFS_PARM0)[1], sv.protocol); MSG_WriteCoord(&sv.datagram, PRVM_G_VECTOR(OFS_PARM0)[2], sv.protocol); + SV_FlushBroadcastMessages(); } static void VM_SV_te_superspikequad (void) @@ -1754,6 +1786,7 @@ static void VM_SV_te_superspikequad (void) MSG_WriteCoord(&sv.datagram, PRVM_G_VECTOR(OFS_PARM0)[0], sv.protocol); MSG_WriteCoord(&sv.datagram, PRVM_G_VECTOR(OFS_PARM0)[1], sv.protocol); MSG_WriteCoord(&sv.datagram, PRVM_G_VECTOR(OFS_PARM0)[2], sv.protocol); + SV_FlushBroadcastMessages(); } static void VM_SV_te_explosionquad (void) @@ -1765,6 +1798,7 @@ static void VM_SV_te_explosionquad (void) MSG_WriteCoord(&sv.datagram, PRVM_G_VECTOR(OFS_PARM0)[0], sv.protocol); MSG_WriteCoord(&sv.datagram, PRVM_G_VECTOR(OFS_PARM0)[1], sv.protocol); MSG_WriteCoord(&sv.datagram, PRVM_G_VECTOR(OFS_PARM0)[2], sv.protocol); + SV_FlushBroadcastMessages(); } static void VM_SV_te_smallflash (void) @@ -1776,6 +1810,7 @@ static void VM_SV_te_smallflash (void) MSG_WriteCoord(&sv.datagram, PRVM_G_VECTOR(OFS_PARM0)[0], sv.protocol); MSG_WriteCoord(&sv.datagram, PRVM_G_VECTOR(OFS_PARM0)[1], sv.protocol); MSG_WriteCoord(&sv.datagram, PRVM_G_VECTOR(OFS_PARM0)[2], sv.protocol); + SV_FlushBroadcastMessages(); } static void VM_SV_te_customflash (void) @@ -1797,6 +1832,7 @@ static void VM_SV_te_customflash (void) MSG_WriteByte(&sv.datagram, (int)bound(0, PRVM_G_VECTOR(OFS_PARM3)[0] * 255, 255)); MSG_WriteByte(&sv.datagram, (int)bound(0, PRVM_G_VECTOR(OFS_PARM3)[1] * 255, 255)); MSG_WriteByte(&sv.datagram, (int)bound(0, PRVM_G_VECTOR(OFS_PARM3)[2] * 255, 255)); + SV_FlushBroadcastMessages(); } static void VM_SV_te_gunshot (void) @@ -1808,6 +1844,7 @@ static void VM_SV_te_gunshot (void) MSG_WriteCoord(&sv.datagram, PRVM_G_VECTOR(OFS_PARM0)[0], sv.protocol); MSG_WriteCoord(&sv.datagram, PRVM_G_VECTOR(OFS_PARM0)[1], sv.protocol); MSG_WriteCoord(&sv.datagram, PRVM_G_VECTOR(OFS_PARM0)[2], sv.protocol); + SV_FlushBroadcastMessages(); } static void VM_SV_te_spike (void) @@ -1819,6 +1856,7 @@ static void VM_SV_te_spike (void) MSG_WriteCoord(&sv.datagram, PRVM_G_VECTOR(OFS_PARM0)[0], sv.protocol); MSG_WriteCoord(&sv.datagram, PRVM_G_VECTOR(OFS_PARM0)[1], sv.protocol); MSG_WriteCoord(&sv.datagram, PRVM_G_VECTOR(OFS_PARM0)[2], sv.protocol); + SV_FlushBroadcastMessages(); } static void VM_SV_te_superspike (void) @@ -1830,6 +1868,7 @@ static void VM_SV_te_superspike (void) MSG_WriteCoord(&sv.datagram, PRVM_G_VECTOR(OFS_PARM0)[0], sv.protocol); MSG_WriteCoord(&sv.datagram, PRVM_G_VECTOR(OFS_PARM0)[1], sv.protocol); MSG_WriteCoord(&sv.datagram, PRVM_G_VECTOR(OFS_PARM0)[2], sv.protocol); + SV_FlushBroadcastMessages(); } static void VM_SV_te_explosion (void) @@ -1841,6 +1880,7 @@ static void VM_SV_te_explosion (void) MSG_WriteCoord(&sv.datagram, PRVM_G_VECTOR(OFS_PARM0)[0], sv.protocol); MSG_WriteCoord(&sv.datagram, PRVM_G_VECTOR(OFS_PARM0)[1], sv.protocol); MSG_WriteCoord(&sv.datagram, PRVM_G_VECTOR(OFS_PARM0)[2], sv.protocol); + SV_FlushBroadcastMessages(); } static void VM_SV_te_tarexplosion (void) @@ -1852,6 +1892,7 @@ static void VM_SV_te_tarexplosion (void) MSG_WriteCoord(&sv.datagram, PRVM_G_VECTOR(OFS_PARM0)[0], sv.protocol); MSG_WriteCoord(&sv.datagram, PRVM_G_VECTOR(OFS_PARM0)[1], sv.protocol); MSG_WriteCoord(&sv.datagram, PRVM_G_VECTOR(OFS_PARM0)[2], sv.protocol); + SV_FlushBroadcastMessages(); } static void VM_SV_te_wizspike (void) @@ -1863,6 +1904,7 @@ static void VM_SV_te_wizspike (void) MSG_WriteCoord(&sv.datagram, PRVM_G_VECTOR(OFS_PARM0)[0], sv.protocol); MSG_WriteCoord(&sv.datagram, PRVM_G_VECTOR(OFS_PARM0)[1], sv.protocol); MSG_WriteCoord(&sv.datagram, PRVM_G_VECTOR(OFS_PARM0)[2], sv.protocol); + SV_FlushBroadcastMessages(); } static void VM_SV_te_knightspike (void) @@ -1874,6 +1916,7 @@ static void VM_SV_te_knightspike (void) MSG_WriteCoord(&sv.datagram, PRVM_G_VECTOR(OFS_PARM0)[0], sv.protocol); MSG_WriteCoord(&sv.datagram, PRVM_G_VECTOR(OFS_PARM0)[1], sv.protocol); MSG_WriteCoord(&sv.datagram, PRVM_G_VECTOR(OFS_PARM0)[2], sv.protocol); + SV_FlushBroadcastMessages(); } static void VM_SV_te_lavasplash (void) @@ -1885,6 +1928,7 @@ static void VM_SV_te_lavasplash (void) MSG_WriteCoord(&sv.datagram, PRVM_G_VECTOR(OFS_PARM0)[0], sv.protocol); MSG_WriteCoord(&sv.datagram, PRVM_G_VECTOR(OFS_PARM0)[1], sv.protocol); MSG_WriteCoord(&sv.datagram, PRVM_G_VECTOR(OFS_PARM0)[2], sv.protocol); + SV_FlushBroadcastMessages(); } static void VM_SV_te_teleport (void) @@ -1896,6 +1940,7 @@ static void VM_SV_te_teleport (void) MSG_WriteCoord(&sv.datagram, PRVM_G_VECTOR(OFS_PARM0)[0], sv.protocol); MSG_WriteCoord(&sv.datagram, PRVM_G_VECTOR(OFS_PARM0)[1], sv.protocol); MSG_WriteCoord(&sv.datagram, PRVM_G_VECTOR(OFS_PARM0)[2], sv.protocol); + SV_FlushBroadcastMessages(); } static void VM_SV_te_explosion2 (void) @@ -1910,6 +1955,7 @@ static void VM_SV_te_explosion2 (void) // color MSG_WriteByte(&sv.datagram, (int)PRVM_G_FLOAT(OFS_PARM1)); MSG_WriteByte(&sv.datagram, (int)PRVM_G_FLOAT(OFS_PARM2)); + SV_FlushBroadcastMessages(); } static void VM_SV_te_lightning1 (void) @@ -1927,6 +1973,7 @@ static void VM_SV_te_lightning1 (void) MSG_WriteCoord(&sv.datagram, PRVM_G_VECTOR(OFS_PARM2)[0], sv.protocol); MSG_WriteCoord(&sv.datagram, PRVM_G_VECTOR(OFS_PARM2)[1], sv.protocol); MSG_WriteCoord(&sv.datagram, PRVM_G_VECTOR(OFS_PARM2)[2], sv.protocol); + SV_FlushBroadcastMessages(); } static void VM_SV_te_lightning2 (void) @@ -1944,6 +1991,7 @@ static void VM_SV_te_lightning2 (void) MSG_WriteCoord(&sv.datagram, PRVM_G_VECTOR(OFS_PARM2)[0], sv.protocol); MSG_WriteCoord(&sv.datagram, PRVM_G_VECTOR(OFS_PARM2)[1], sv.protocol); MSG_WriteCoord(&sv.datagram, PRVM_G_VECTOR(OFS_PARM2)[2], sv.protocol); + SV_FlushBroadcastMessages(); } static void VM_SV_te_lightning3 (void) @@ -1961,6 +2009,7 @@ static void VM_SV_te_lightning3 (void) MSG_WriteCoord(&sv.datagram, PRVM_G_VECTOR(OFS_PARM2)[0], sv.protocol); MSG_WriteCoord(&sv.datagram, PRVM_G_VECTOR(OFS_PARM2)[1], sv.protocol); MSG_WriteCoord(&sv.datagram, PRVM_G_VECTOR(OFS_PARM2)[2], sv.protocol); + SV_FlushBroadcastMessages(); } static void VM_SV_te_beam (void) @@ -1978,6 +2027,7 @@ static void VM_SV_te_beam (void) MSG_WriteCoord(&sv.datagram, PRVM_G_VECTOR(OFS_PARM2)[0], sv.protocol); MSG_WriteCoord(&sv.datagram, PRVM_G_VECTOR(OFS_PARM2)[1], sv.protocol); MSG_WriteCoord(&sv.datagram, PRVM_G_VECTOR(OFS_PARM2)[2], sv.protocol); + SV_FlushBroadcastMessages(); } static void VM_SV_te_plasmaburn (void) @@ -1988,6 +2038,7 @@ static void VM_SV_te_plasmaburn (void) MSG_WriteCoord(&sv.datagram, PRVM_G_VECTOR(OFS_PARM0)[0], sv.protocol); MSG_WriteCoord(&sv.datagram, PRVM_G_VECTOR(OFS_PARM0)[1], sv.protocol); MSG_WriteCoord(&sv.datagram, PRVM_G_VECTOR(OFS_PARM0)[2], sv.protocol); + SV_FlushBroadcastMessages(); } static void VM_SV_te_flamejet (void) @@ -2005,6 +2056,7 @@ static void VM_SV_te_flamejet (void) MSG_WriteCoord(&sv.datagram, PRVM_G_VECTOR(OFS_PARM1)[2], sv.protocol); // count MSG_WriteByte(&sv.datagram, (int)PRVM_G_FLOAT(OFS_PARM2)); + SV_FlushBroadcastMessages(); } void clippointtosurface(model_t *model, msurface_t *surface, vec3_t p, vec3_t out) @@ -2643,18 +2695,37 @@ static void VM_SV_trailparticles (void) MSG_WriteShort(&sv.datagram, (int)PRVM_G_FLOAT(OFS_PARM1)); MSG_WriteVector(&sv.datagram, PRVM_G_VECTOR(OFS_PARM2), sv.protocol); MSG_WriteVector(&sv.datagram, PRVM_G_VECTOR(OFS_PARM3), sv.protocol); + SV_FlushBroadcastMessages(); } //#337 void(float effectnum, vector origin, vector dir, float count) pointparticles (EXT_CSQC) static void VM_SV_pointparticles (void) { - VM_SAFEPARMCOUNT(4, VM_SV_pointparticles); + int effectnum, count; + vec3_t org, vel; + VM_SAFEPARMCOUNTRANGE(4, 8, VM_SV_pointparticles); + effectnum = (int)PRVM_G_FLOAT(OFS_PARM0); + VectorCopy(PRVM_G_VECTOR(OFS_PARM1), org); + VectorCopy(PRVM_G_VECTOR(OFS_PARM2), vel); + count = bound(0, (int)PRVM_G_FLOAT(OFS_PARM3), 65535); + if (count == 1 && !VectorLength2(vel)) + { + // 1+2+12=15 bytes + MSG_WriteByte(&sv.datagram, svc_pointparticles1); + MSG_WriteShort(&sv.datagram, effectnum); + MSG_WriteVector(&sv.datagram, org, sv.protocol); + } + else + { + // 1+2+12+12+2=29 bytes + MSG_WriteByte(&sv.datagram, svc_pointparticles); + MSG_WriteShort(&sv.datagram, effectnum); + MSG_WriteVector(&sv.datagram, org, sv.protocol); + MSG_WriteVector(&sv.datagram, vel, sv.protocol); + MSG_WriteShort(&sv.datagram, count); + } - MSG_WriteByte(&sv.datagram, svc_pointparticles); - MSG_WriteShort(&sv.datagram, (int)PRVM_G_FLOAT(OFS_PARM0)); - MSG_WriteVector(&sv.datagram, PRVM_G_VECTOR(OFS_PARM1), sv.protocol); - MSG_WriteVector(&sv.datagram, PRVM_G_VECTOR(OFS_PARM2), sv.protocol); - MSG_WriteShort(&sv.datagram, bound(0, (int)PRVM_G_FLOAT(OFS_PARM3), 65535)); + SV_FlushBroadcastMessages(); } prvm_builtin_t vm_sv_builtins[] = { @@ -2881,16 +2952,16 @@ NULL, // #217 VM_bitshift, // #218 float(float number, float quantity) bitshift (EXT_BITSHIFT) NULL, // #219 NULL, // #220 -NULL, // #221 +VM_strstrofs, // #221 float(string str, string sub[, float startpos]) strstrofs (FTE_STRINGS) VM_str2chr, // #222 float(string str, float ofs) str2chr (FTE_STRINGS) VM_chr2str, // #223 string(float c, ...) chr2str (FTE_STRINGS) -NULL, // #224 -NULL, // #225 -NULL, // #226 -NULL, // #227 +VM_strconv, // #224 string(float ccase, float calpha, float cnum, string s, ...) strconv (FTE_STRINGS) +VM_strpad, // #225 string(float chars, string s, ...) strpad (FTE_STRINGS) +VM_infoadd, // #226 string(string info, string key, string value, ...) infoadd (FTE_STRINGS) +VM_infoget, // #227 string(string info, string key) infoget (FTE_STRINGS) VM_strncmp, // #228 float(string s1, string s2, float len) strncmp (FTE_STRINGS) -NULL, // #229 -NULL, // #230 +VM_strncasecmp, // #229 float(string s1, string s2) strcasecmp (FTE_STRINGS) +VM_strncasecmp, // #230 float(string s1, string s2, float len) strncasecmp (FTE_STRINGS) NULL, // #231 VM_SV_AddStat, // #232 void(float index, float type, .void field) SV_AddStat (EXT_CSQC) NULL, // #233 @@ -3106,10 +3177,10 @@ VM_SV_clientcommand, // #440 void(entity e, string s) clientcommand (KRIMZON_S VM_tokenize, // #441 float(string s) tokenize (KRIMZON_SV_PARSECLIENTCOMMAND) VM_argv, // #442 string(float n) argv (KRIMZON_SV_PARSECLIENTCOMMAND) VM_SV_setattachment, // #443 void(entity e, entity tagentity, string tagname) setattachment (DP_GFX_QUAKE3MODELTAGS) -VM_search_begin, // #444 float(string pattern, float caseinsensitive, float quiet) search_begin (DP_FS_SEARCH) -VM_search_end, // #445 void(float handle) search_end (DP_FS_SEARCH) -VM_search_getsize, // #446 float(float handle) search_getsize (DP_FS_SEARCH) -VM_search_getfilename, // #447 string(float handle, float num) search_getfilename (DP_FS_SEARCH) +VM_search_begin, // #444 float(string pattern, float caseinsensitive, float quiet) search_begin (DP_QC_FS_SEARCH) +VM_search_end, // #445 void(float handle) search_end (DP_QC_FS_SEARCH) +VM_search_getsize, // #446 float(float handle) search_getsize (DP_QC_FS_SEARCH) +VM_search_getfilename, // #447 string(float handle, float num) search_getfilename (DP_QC_FS_SEARCH) VM_cvar_string, // #448 string(string s) cvar_string (DP_QC_CVAR_STRING) VM_findflags, // #449 entity(entity start, .float fld, float match) findflags (DP_QC_FINDFLAGS) VM_findchainflags, // #450 entity(.float fld, float match) findchainflags (DP_QC_FINDCHAINFLAGS) @@ -3141,13 +3212,13 @@ VM_tan, // #475 float(float a) VM_tan (DP_QC_ASINACOSATANATAN2TAN) VM_strlennocol, // #476 float(string s) : DRESK - String Length (not counting color codes) (DP_QC_STRINGCOLORFUNCTIONS) VM_strdecolorize, // #477 string(string s) : DRESK - Decolorized String (DP_SV_STRINGCOLORFUNCTIONS) VM_strftime, // #478 string(float uselocaltime, string format, ...) (DP_QC_STRFTIME) -NULL, // #479 -NULL, // #480 -NULL, // #481 -NULL, // #482 -NULL, // #483 -NULL, // #484 -NULL, // #485 +VM_tokenizebyseparator, // #479 float(string s) tokenizebyseparator (DP_QC_TOKENIZEBYSEPARATOR) +VM_strtolower, // #480 string(string s) VM_strtolower (DP_QC_STRING_CASE_FUNCTIONS) +VM_strtoupper, // #481 string(string s) VM_strtoupper (DP_QC_STRING_CASE_FUNCTIONS) +VM_cvar_defstring, // #482 string(string s) cvar_defstring (DP_QC_CVAR_DEFSTRING) +VM_SV_pointsound, // #483 void(vector origin, string sample, float volume, float attenuation) (DP_SV_POINTSOUND) +VM_strreplace, // #484 string(string search, string replace, string subject) strreplace (DP_QC_STRREPLACE) +VM_strireplace, // #485 string(string search, string replace, string subject) strireplace (DP_QC_STRREPLACE) NULL, // #486 NULL, // #487 NULL, // #488