char *vm_sv_extensions =
-"DP_CON_EXPANDCVAR "
-"DP_CON_ALIASPARAMETERS "
+"BX_WAL_SUPPORT "
"DP_BUTTONCHAT "
"DP_BUTTONUSE "
"DP_CL_LOADSKY "
+"DP_CON_ALIASPARAMETERS "
+"DP_CON_EXPANDCVAR "
"DP_CON_SET "
"DP_CON_SETA "
"DP_CON_STARTMAP "
"DP_EF_ADDITIVE "
"DP_EF_BLUE "
+"DP_EF_DOUBLESIDED "
"DP_EF_FLAME "
"DP_EF_FULLBRIGHT "
-"DP_EF_DOUBLESIDED "
"DP_EF_NODEPTHTEST "
"DP_EF_NODRAW "
"DP_EF_NOSHADOW "
"DP_MONSTERWALK "
"DP_MOVETYPEBOUNCEMISSILE "
"DP_MOVETYPEFOLLOW "
+"DP_QC_ASINACOSATANATAN2TAN "
"DP_QC_CHANGEPITCH "
"DP_QC_COPYENTITY "
"DP_QC_CVAR_STRING "
"DP_QC_FINDCHAINFLOAT "
"DP_QC_FINDFLAGS "
"DP_QC_FINDFLOAT "
-"DP_QC_FS_SEARCH " // Black: same as in the menu qc
+"DP_QC_FS_SEARCH "
"DP_QC_GETLIGHT "
"DP_QC_GETSURFACE "
"DP_QC_GETTAGINFO "
"DP_QC_MULTIPLETEMPSTRINGS "
"DP_QC_RANDOMVEC "
"DP_QC_SINCOSSQRTPOW "
+"DP_QC_STRFTIME "
"DP_QC_STRINGBUFFERS "
+"DP_QC_STRINGCOLORFUNCTIONS "
"DP_QC_TRACEBOX "
"DP_QC_TRACETOSS "
"DP_QC_TRACE_MOVETYPE_HITMODEL "
"DP_QC_TRACE_MOVETYPE_WORLDONLY "
+"DP_QC_UNLIMITEDTEMPSTRINGS "
"DP_QC_VECTORVECTORS "
"DP_QUAKE2_MODEL "
"DP_QUAKE2_SPRITE "
"DP_SV_DRAWONLYTOCLIENT "
"DP_SV_DROPCLIENT "
"DP_SV_EFFECT "
+"DP_SV_ENTITYCONTENTSTRANSITION "
"DP_SV_NODRAWTOCLIENT "
"DP_SV_PING "
"DP_SV_PLAYERPHYSICS "
"DP_SV_PRECACHEANYTIME "
+"DP_SV_PRINT "
"DP_SV_PUNCHVECTOR "
"DP_SV_ROTATINGBMODEL "
"DP_SV_SETCOLOR "
"KRIMZON_SV_PARSECLIENTCOMMAND "
"NEH_CMD_PLAY2 "
"NEH_RESTOREGAME "
+"NEXUIZ_PLAYERMODEL "
"NXQ_GFX_LETTERBOX "
"PRYDON_CLIENTCURSOR "
"TENEBRAE_GFX_DLIGHTS "
"TW_SV_STEPCONTROL "
-"NEXUIZ_PLAYERMODEL "
;
/*
prog->globals.server->trace_ent = PRVM_EDICT_TO_PROG(trace.ent);
else
prog->globals.server->trace_ent = PRVM_EDICT_TO_PROG(prog->edicts);
- if ((val = PRVM_GETGLOBALFIELDVALUE(gval_trace_dpstartcontents)))
+ if ((val = PRVM_GLOBALFIELDVALUE(prog->globaloffsets.trace_dpstartcontents)))
val->_float = trace.startsupercontents;
- if ((val = PRVM_GETGLOBALFIELDVALUE(gval_trace_dphitcontents)))
+ if ((val = PRVM_GLOBALFIELDVALUE(prog->globaloffsets.trace_dphitcontents)))
val->_float = trace.hitsupercontents;
- if ((val = PRVM_GETGLOBALFIELDVALUE(gval_trace_dphitq3surfaceflags)))
+ if ((val = PRVM_GLOBALFIELDVALUE(prog->globaloffsets.trace_dphitq3surfaceflags)))
val->_float = trace.hitq3surfaceflags;
- if ((val = PRVM_GETGLOBALFIELDVALUE(gval_trace_dphittexturename)))
+ if ((val = PRVM_GLOBALFIELDVALUE(prog->globaloffsets.trace_dphittexturename)))
{
if (trace.hittexture)
- {
- char *s = VM_GetTempString();
- strlcpy(s, trace.hittexture->name, VM_STRINGTEMP_LENGTH);
- val->string = PRVM_SetEngineString(s);
- }
+ val->string = PRVM_SetTempString(trace.hittexture->name);
else
val->string = 0;
}
prog->globals.server->trace_ent = PRVM_EDICT_TO_PROG(trace.ent);
else
prog->globals.server->trace_ent = PRVM_EDICT_TO_PROG(prog->edicts);
- if ((val = PRVM_GETGLOBALFIELDVALUE(gval_trace_dpstartcontents)))
+ if ((val = PRVM_GLOBALFIELDVALUE(prog->globaloffsets.trace_dpstartcontents)))
val->_float = trace.startsupercontents;
- if ((val = PRVM_GETGLOBALFIELDVALUE(gval_trace_dphitcontents)))
+ if ((val = PRVM_GLOBALFIELDVALUE(prog->globaloffsets.trace_dphitcontents)))
val->_float = trace.hitsupercontents;
- if ((val = PRVM_GETGLOBALFIELDVALUE(gval_trace_dphitq3surfaceflags)))
+ if ((val = PRVM_GLOBALFIELDVALUE(prog->globaloffsets.trace_dphitq3surfaceflags)))
val->_float = trace.hitq3surfaceflags;
- if ((val = PRVM_GETGLOBALFIELDVALUE(gval_trace_dphittexturename)))
+ if ((val = PRVM_GLOBALFIELDVALUE(prog->globaloffsets.trace_dphittexturename)))
{
if (trace.hittexture)
- {
- char *s = VM_GetTempString();
- strlcpy(s, trace.hittexture->name, VM_STRINGTEMP_LENGTH);
- val->string = PRVM_SetEngineString(s);
- }
+ val->string = PRVM_SetTempString(trace.hittexture->name);
else
val->string = 0;
}
prog->globals.server->trace_ent = PRVM_EDICT_TO_PROG(trace.ent);
else
prog->globals.server->trace_ent = PRVM_EDICT_TO_PROG(prog->edicts);
- if ((val = PRVM_GETGLOBALFIELDVALUE(gval_trace_dpstartcontents)))
+ if ((val = PRVM_GLOBALFIELDVALUE(prog->globaloffsets.trace_dpstartcontents)))
val->_float = trace.startsupercontents;
- if ((val = PRVM_GETGLOBALFIELDVALUE(gval_trace_dphitcontents)))
+ if ((val = PRVM_GLOBALFIELDVALUE(prog->globaloffsets.trace_dphitcontents)))
val->_float = trace.hitsupercontents;
- if ((val = PRVM_GETGLOBALFIELDVALUE(gval_trace_dphitq3surfaceflags)))
+ if ((val = PRVM_GLOBALFIELDVALUE(prog->globaloffsets.trace_dphitq3surfaceflags)))
val->_float = trace.hitq3surfaceflags;
- if ((val = PRVM_GETGLOBALFIELDVALUE(gval_trace_dphittexturename)))
+ if ((val = PRVM_GLOBALFIELDVALUE(prog->globaloffsets.trace_dphittexturename)))
{
if (trace.hittexture)
- {
- char *s = VM_GetTempString();
- strlcpy(s, trace.hittexture->name, VM_STRINGTEMP_LENGTH);
- val->string = PRVM_SetEngineString(s);
- }
+ val->string = PRVM_SetTempString(trace.hittexture->name);
else
val->string = 0;
}
maxs[0] = org[0] + (radius + 1);
maxs[1] = org[1] + (radius + 1);
maxs[2] = org[2] + (radius + 1);
- numtouchedicts = SV_EntitiesInBox(mins, maxs, MAX_EDICTS, touchedicts);
+ numtouchedicts = World_EntitiesInBox(&sv.world, mins, maxs, MAX_EDICTS, touchedicts);
if (numtouchedicts > MAX_EDICTS)
{
// this never happens
trace = SV_Move (ent->fields.server->origin, ent->fields.server->mins, ent->fields.server->maxs, end, MOVE_NORMAL, ent);
- if (trace.fraction != 1)
+ if (trace.fraction != 1 || (trace.startsolid && sv_gameplayfix_droptofloorstartsolid.integer))
{
- VectorCopy (trace.endpos, ent->fields.server->origin);
+ if (trace.fraction < 1)
+ VectorCopy (trace.endpos, ent->fields.server->origin);
SV_LinkEdict (ent, false);
ent->fields.server->flags = (int)ent->fields.server->flags | FL_ONGROUND;
ent->fields.server->groundentity = PRVM_EDICT_TO_PROG(trace.ent);
}
}
-/*
-==============
-PF_changeyaw
-
-This was a major timewaster in progs, so it was converted to C
-==============
-*/
-void PF_changeyaw (void)
-{
- prvm_edict_t *ent;
- float ideal, current, move, speed;
-
- ent = PRVM_PROG_TO_EDICT(prog->globals.server->self);
- if (ent == prog->edicts)
- {
- VM_Warning("changeyaw: can not modify world entity\n");
- return;
- }
- if (ent->priv.server->free)
- {
- VM_Warning("changeyaw: can not modify free entity\n");
- return;
- }
- current = ANGLEMOD(ent->fields.server->angles[1]);
- ideal = ent->fields.server->ideal_yaw;
- speed = ent->fields.server->yaw_speed;
-
- if (current == ideal)
- return;
- move = ideal - current;
- if (ideal > current)
- {
- if (move >= 180)
- move = move - 360;
- }
- else
- {
- if (move <= -180)
- move = move + 360;
- }
- if (move > 0)
- {
- if (move > speed)
- move = speed;
- }
- else
- {
- if (move < -speed)
- move = -speed;
- }
-
- ent->fields.server->angles[1] = ANGLEMOD (current + move);
-}
-
-/*
-==============
-PF_changepitch
-==============
-*/
-void PF_changepitch (void)
-{
- prvm_edict_t *ent;
- float ideal, current, move, speed;
- prvm_eval_t *val;
-
- ent = PRVM_G_EDICT(OFS_PARM0);
- if (ent == prog->edicts)
- {
- VM_Warning("changepitch: can not modify world entity\n");
- return;
- }
- if (ent->priv.server->free)
- {
- VM_Warning("changepitch: can not modify free entity\n");
- return;
- }
- current = ANGLEMOD( ent->fields.server->angles[0] );
- if ((val = PRVM_GETEDICTFIELDVALUE(ent, eval_idealpitch)))
- ideal = val->_float;
- else
- {
- VM_Warning("PF_changepitch: .float idealpitch and .float pitch_speed must be defined to use changepitch\n");
- return;
- }
- if ((val = PRVM_GETEDICTFIELDVALUE(ent, eval_pitch_speed)))
- speed = val->_float;
- else
- {
- VM_Warning("PF_changepitch: .float idealpitch and .float pitch_speed must be defined to use changepitch\n");
- return;
- }
-
- if (current == ideal)
- return;
- move = ideal - current;
- if (ideal > current)
- {
- if (move >= 180)
- move = move - 360;
- }
- else
- {
- if (move <= -180)
- move = move + 360;
- }
- if (move > 0)
- {
- if (move > speed)
- move = speed;
- }
- else
- {
- if (move < -speed)
- move = -speed;
- }
-
- ent->fields.server->angles[0] = ANGLEMOD (current + move);
-}
-
/*
===============================================================================
client = svs.clients + entnum-1;
if (client->edict)
{
- if ((val = PRVM_GETEDICTFIELDVALUE(client->edict, eval_clientcolors)))
+ if ((val = PRVM_EDICTFIELDVALUE(client->edict, prog->fieldoffsets.clientcolors)))
val->_float = i;
client->edict->fields.server->team = (i & 15) + 1;
}
int i;
const char *s;
s = PRVM_G_STRING(OFS_PARM1);
- if (!s || !s[0])
+ if (!s[0])
{
VM_Warning("effect: no model specified\n");
return;
VM_Warning("effect: model not precached\n");
return;
}
+
+ if (PRVM_G_FLOAT(OFS_PARM3) < 1)
+ {
+ VM_Warning("effect: framecount < 1\n");
+ return;
+ }
+
+ if (PRVM_G_FLOAT(OFS_PARM4) < 1)
+ {
+ VM_Warning("effect: framerate < 1\n");
+ return;
+ }
+
SV_StartEffect(PRVM_G_VECTOR(OFS_PARM0), i, (int)PRVM_G_FLOAT(OFS_PARM2), (int)PRVM_G_FLOAT(OFS_PARM3), (int)PRVM_G_FLOAT(OFS_PARM4));
}
{
model_t *model;
msurface_t *surface;
- PRVM_G_INT(OFS_RETURN) = 0;
+ PRVM_G_INT(OFS_RETURN) = OFS_NULL;
if (!(model = getmodel(PRVM_G_EDICT(OFS_PARM0))) || !(surface = getsurface(model, (int)PRVM_G_FLOAT(OFS_PARM1))))
return;
- PRVM_G_INT(OFS_RETURN) = PRVM_SetEngineString(surface->texture->name);
+ PRVM_G_INT(OFS_RETURN) = PRVM_SetTempString(surface->texture->name);
}
//PF_getsurfacenearpoint, // #438 float(entity e, vector p) getsurfacenearpoint = #438;
void PF_getsurfacenearpoint(void)
if (tagentity == NULL)
tagentity = prog->edicts;
- v = PRVM_GETEDICTFIELDVALUE(e, eval_tag_entity);
+ v = PRVM_EDICTFIELDVALUE(e, prog->fieldoffsets.tag_entity);
if (v)
v->edict = PRVM_EDICT_TO_PROG(tagentity);
- v = PRVM_GETEDICTFIELDVALUE(e, eval_tag_index);
+ v = PRVM_EDICTFIELDVALUE(e, prog->fieldoffsets.tag_index);
if (v)
v->_float = 0;
if (tagentity != NULL && tagentity != prog->edicts && tagname && tagname[0])
void SV_GetEntityMatrix (prvm_edict_t *ent, matrix4x4_t *out, qboolean viewmatrix)
{
- float scale = PRVM_GETEDICTFIELDVALUE(ent, eval_scale)->_float;
+ float scale = PRVM_EDICTFIELDVALUE(ent, prog->fieldoffsets.scale)->_float;
if (scale == 0)
scale = 1;
if (viewmatrix)
Matrix4x4_CreateFromQuakeEntity(out, ent->fields.server->origin[0], ent->fields.server->origin[1], ent->fields.server->origin[2] + ent->fields.server->view_ofs[2], ent->fields.server->v_angle[0], ent->fields.server->v_angle[1], ent->fields.server->v_angle[2], scale);
else
- Matrix4x4_CreateFromQuakeEntity(out, ent->fields.server->origin[0], ent->fields.server->origin[1], ent->fields.server->origin[2], -ent->fields.server->angles[0], ent->fields.server->angles[1], ent->fields.server->angles[2], scale * 0.333);
+ Matrix4x4_CreateFromQuakeEntity(out, ent->fields.server->origin[0], ent->fields.server->origin[1], ent->fields.server->origin[2], -ent->fields.server->angles[0], ent->fields.server->angles[1], ent->fields.server->angles[2], scale * cl_viewmodel_scale.value);
}
int SV_GetEntityLocalTagMatrix(prvm_edict_t *ent, int tagindex, matrix4x4_t *out)
SV_GetEntityMatrix(ent, &entitymatrix, false);
Matrix4x4_Concat(&tagmatrix, &entitymatrix, out);
// next iteration we process the parent entity
- if ((val = PRVM_GETEDICTFIELDVALUE(ent, eval_tag_entity)) && val->edict)
+ if ((val = PRVM_EDICTFIELDVALUE(ent, prog->fieldoffsets.tag_entity)) && val->edict)
{
- tagindex = (int)PRVM_GETEDICTFIELDVALUE(ent, eval_tag_index)->_float;
+ tagindex = (int)PRVM_EDICTFIELDVALUE(ent, prog->fieldoffsets.tag_index)->_float;
ent = PRVM_EDICT_NUM(val->edict);
}
else
}
// RENDER_VIEWMODEL magic
- if ((val = PRVM_GETEDICTFIELDVALUE(ent, eval_viewmodelforclient)) && val->edict)
+ if ((val = PRVM_EDICTFIELDVALUE(ent, prog->fieldoffsets.viewmodelforclient)) && val->edict)
{
Matrix4x4_Copy(&tagmatrix, out);
ent = PRVM_EDICT_NUM(val->edict);
VM_RETURN_EDICT(PRVM_EDICT_NUM((int)PRVM_G_FLOAT(OFS_PARM0)));
}
+// #336 void(entity ent, float effectnum, vector start, vector end) trailparticles (EXT_CSQC)
+static void VM_SV_trailparticles (void)
+{
+ VM_SAFEPARMCOUNT(4, VM_SV_trailparticles);
+
+ MSG_WriteByte(&sv.datagram, svc_trailparticles);
+ MSG_WriteShort(&sv.datagram, PRVM_G_EDICTNUM(OFS_PARM0));
+ 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);
+}
+
+//#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);
+
+ 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));
+}
+
prvm_builtin_t vm_sv_builtins[] = {
NULL, // #0
PF_makevectors, // #1 void(vector ang) makevectors
VM_localcmd, // #46 void(string s) localcmd
VM_nextent, // #47 entity(entity e) nextent
PF_particle, // #48 void(vector o, vector d, float color, float count) particle
-PF_changeyaw, // #49 void() ChangeYaw
+VM_changeyaw, // #49 void() ChangeYaw
NULL, // #50
VM_vectoangles, // #51 vector(vector v) vectoangles
PF_WriteByte, // #52 void(float to, float f) WriteByte
VM_sin, // #60 float(float f) sin (DP_QC_SINCOSSQRTPOW)
VM_cos, // #61 float(float f) cos (DP_QC_SINCOSSQRTPOW)
VM_sqrt, // #62 float(float f) sqrt (DP_QC_SINCOSSQRTPOW)
-PF_changepitch, // #63 void(entity ent) changepitch (DP_QC_CHANGEPITCH)
+VM_changepitch, // #63 void(entity ent) changepitch (DP_QC_CHANGEPITCH)
PF_tracetoss, // #64 void(entity e, entity ignore) tracetoss (DP_QC_TRACETOSS)
VM_etos, // #65 string(entity ent) etos (DP_QC_ETOS)
NULL, // #66
e10, // #270-#279
e10, // #280-#289
e10, // #290-#299
-e10, e10, e10, e10, e10, e10, e10, e10, e10, e10, // #300-399
+e10, // #300-309
+e10, // #310-319
+e10, // #320-329
+NULL, // #330
+NULL, // #331
+NULL, // #332
+NULL, // #333
+NULL, // #334
+NULL, // #335
+VM_SV_trailparticles, // #336 void(entity ent, float effectnum, vector start, vector end) trailparticles (EXT_CSQC)
+VM_SV_pointparticles, // #337 void(float effectnum, vector origin [, vector dir, float count]) pointparticles (EXT_CSQC)
+NULL, // #338
+VM_print, // #339 void(string, ...) print (DP_SV_PRINT)
+e10, // #340-349
+e10, // #350-359
+e10, // #360-369
+e10, // #370-379
+e10, // #380-389
+e10, // #390-399
VM_copyentity, // #400 void(entity from, entity to) copyentity (DP_QC_COPYENTITY)
PF_setcolor, // #401 void(entity ent, float colors) setcolor (DP_QC_SETCOLOR)
VM_findchain, // #402 entity(.string fld, string match) findchain (DP_QC_FINDCHAIN)
VM_bufstr_add, // #468 float(float bufhandle, string str, float order) bufstr_add (DP_QC_STRINGBUFFERS)
VM_bufstr_free, // #469 void(float bufhandle, float string_index) bufstr_free (DP_QC_STRINGBUFFERS)
PF_SV_AddStat, // #470 void(float index, float type, .void field) SV_AddStat (EXT_CSQC)
-NULL, // #471
-NULL, // #472
-NULL, // #473
-NULL, // #474
-NULL, // #475
-NULL, // #476
-NULL, // #477
+VM_asin, // #471 float(float s) VM_asin (DP_QC_ASINACOSATANATAN2TAN)
+VM_acos, // #472 float(float c) VM_acos (DP_QC_ASINACOSATANATAN2TAN)
+VM_atan, // #473 float(float t) VM_atan (DP_QC_ASINACOSATANATAN2TAN)
+VM_atan2, // #474 float(float c, float s) VM_atan2 (DP_QC_ASINACOSATANATAN2TAN)
+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, // #478
NULL, // #479
e10, e10 // #480-499 (LordHavoc)