]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - svvm_cmds.c
Added DP_QC_STRREPLACE - adds strreplace and strireplace functions (behave like str_r...
[xonotic/darkplaces.git] / svvm_cmds.c
index 6a32a38ab4ff92fce4abb3c543b1c767f65d910f..5700b21aca1a34d8fcf9e2b5422c4bfba0fa980e 100644 (file)
@@ -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"};
 
 
 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,6 +69,7 @@ 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 "
@@ -96,10 +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 "
@@ -135,6 +141,9 @@ char *vm_sv_extensions =
 "TW_SV_STEPCONTROL "
 "DP_SV_CMD "
 "DP_QC_CMD "
+"FTE_STRINGS "
+"DP_CON_BESTWEAPON "
+"DP_QC_STRREPLACE "
 ;
 
 /*
@@ -401,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);
@@ -434,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)
        {
@@ -463,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
@@ -645,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;
 }
@@ -796,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);
@@ -1107,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)
@@ -1135,7 +1187,7 @@ sizebuf_t *WriteDest (void)
                return &sv.signon;
 
        case MSG_ENTITY:
-               return sv2csqcbuf;
+               return sv.writeentitiestoclient_msg;
        }
 
        return NULL;
@@ -1232,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);
@@ -2643,13 +2701,30 @@ static void VM_SV_trailparticles (void)
 //#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();
 }
 
@@ -2877,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
@@ -3102,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)
@@ -3138,12 +3213,12 @@ VM_strlennocol,                                 // #476 float(string s) : DRESK - String Length (not countin
 VM_strdecolorize,                              // #477 string(string s) : DRESK - Decolorized String (DP_SV_STRINGCOLORFUNCTIONS)
 VM_strftime,                                   // #478 string(float uselocaltime, string format, ...) (DP_QC_STRFTIME)
 VM_tokenizebyseparator,                        // #479 float(string s) tokenizebyseparator (DP_QC_TOKENIZEBYSEPARATOR)
-NULL,                                                  // #480
-NULL,                                                  // #481
-NULL,                                                  // #482
-NULL,                                                  // #483
-NULL,                                                  // #484
-NULL,                                                  // #485
+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