X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=pr_cmds.c;h=15efae181cf695091deedaa783179310bdd4371d;hb=040b91e774cf55247a5af8ea0854cceb12a35229;hp=360573426eed54d4495dbd1c6eb69b512a2ba5e3;hpb=ac1f988697444a4bc07b5954e5c83e0c9a4d2e4c;p=xonotic%2Fdarkplaces.git diff --git a/pr_cmds.c b/pr_cmds.c index 36057342..15efae18 100644 --- a/pr_cmds.c +++ b/pr_cmds.c @@ -39,7 +39,9 @@ static char *PR_GetTempString(void) return s; } -#define RETURN_EDICT(e) (((int *)pr_globals)[OFS_RETURN] = EDICT_TO_PROG(e)) +#define RETURN_EDICT(e) (G_INT(OFS_RETURN) = EDICT_TO_PROG(e)) +#define PF_WARNING(s) do{Con_Printf(s);PR_PrintState();return;}while(0) +#define PF_ERROR(s) do{Host_Error(s);return;}while(0) /* @@ -69,18 +71,20 @@ void PF_VarString(int first, char *out, int outlength) char *ENGINE_EXTENSIONS = "DP_CL_LOADSKY " -"DP_EF_NODRAW " "DP_EF_ADDITIVE " "DP_EF_BLUE " -"DP_EF_RED " -"DP_EF_FULLBRIGHT " "DP_EF_FLAME " +"DP_EF_FULLBRIGHT " +"DP_EF_NODEPTHTEST " +"DP_EF_NODRAW " +"DP_EF_NOSHADOW " +"DP_EF_RED " "DP_EF_STARDUST " "DP_ENT_ALPHA " "DP_ENT_CUSTOMCOLORMAP " "DP_ENT_EXTERIORMODELTOCLIENT " -"DP_ENT_LOWPRECISION " "DP_ENT_GLOW " +"DP_ENT_LOWPRECISION " "DP_ENT_SCALE " "DP_ENT_VIEWMODEL " "DP_GFX_EXTERNALTEXTURES " @@ -97,23 +101,31 @@ char *ENGINE_EXTENSIONS = "DP_MOVETYPEFOLLOW " "DP_QC_CHANGEPITCH " "DP_QC_COPYENTITY " +"DP_QC_CVAR_STRING " "DP_QC_ETOS " "DP_QC_FINDCHAIN " +"DP_QC_FINDCHAINFLAGS " "DP_QC_FINDCHAINFLOAT " +"DP_QC_FINDFLAGS " "DP_QC_FINDFLOAT " +"DP_QC_FS_SEARCH " // Black: same as in the menu qc "DP_QC_GETLIGHT " "DP_QC_GETSURFACE " "DP_QC_MINMAXBOUND " +"DP_QC_MULTIPLETEMPSTRINGS " "DP_QC_RANDOMVEC " "DP_QC_SINCOSSQRTPOW " "DP_QC_TRACEBOX " "DP_QC_TRACETOSS " -"DP_QC_TRACE_MOVETYPE_WORLDONLY " "DP_QC_TRACE_MOVETYPE_HITMODEL " +"DP_QC_TRACE_MOVETYPE_WORLDONLY " "DP_QC_VECTORVECTORS " "DP_QUAKE2_MODEL " "DP_QUAKE3_MODEL " "DP_REGISTERCVAR " +"DP_SND_DIRECTIONLESSATTNNONE " +"DP_SND_OGGVORBIS " +"DP_SND_STEREOWAV " "DP_SOLIDCORPSE " "DP_SPRITE32 " "DP_SV_DRAWONLYTOCLIENT " @@ -121,6 +133,7 @@ char *ENGINE_EXTENSIONS = "DP_SV_EXTERIORMODELTOCLIENT " "DP_SV_NODRAWTOCLIENT " "DP_SV_PLAYERPHYSICS " +"DP_SV_ROTATINGBMODEL " "DP_SV_SETCOLOR " "DP_SV_SLOWMO " "DP_TE_BLOOD " @@ -141,6 +154,8 @@ char *ENGINE_EXTENSIONS = "KRIMZON_SV_PARSECLIENTCOMMAND " "NEH_CMD_PLAY2 " "NEH_RESTOREGAME " +"NXQ_GFX_LETTERBOX " +"TENEBRAE_GFX_DLIGHTS " "TW_SV_STEPCONTROL " ; @@ -195,11 +210,11 @@ void PF_error (void) char string[STRINGTEMP_LENGTH]; PF_VarString(0, string, sizeof(string)); - Con_Printf ("======SERVER ERROR in %s:\n%s\n", PR_GetString(pr_xfunction->s_name), string); + Con_Printf("======SERVER ERROR in %s:\n%s\n", PR_GetString(pr_xfunction->s_name), string); ed = PROG_TO_EDICT(pr_global_struct->self); - ED_Print (ed); + ED_Print(ed); - Host_Error ("Program error"); + PF_ERROR("Program error"); } /* @@ -218,9 +233,9 @@ void PF_objerror (void) char string[STRINGTEMP_LENGTH]; PF_VarString(0, string, sizeof(string)); - Con_Printf ("======OBJECT ERROR in %s:\n%s\n", PR_GetString(pr_xfunction->s_name), string); + Con_Printf("======OBJECT ERROR in %s:\n%s\n", PR_GetString(pr_xfunction->s_name), string); ed = PROG_TO_EDICT(pr_global_struct->self); - ED_Print (ed); + ED_Print(ed); ED_Free (ed); } @@ -268,9 +283,9 @@ void PF_setorigin (void) e = G_EDICT(OFS_PARM0); if (e == sv.edicts) - Host_Error("setorigin: can not modify world entity\n"); + PF_WARNING("setorigin: can not modify world entity\n"); if (e->e->free) - Host_Error("setorigin: can not modify free entity\n"); + PF_WARNING("setorigin: can not modify free entity\n"); org = G_VECTOR(OFS_PARM1); VectorCopy (org, e->v->origin); SV_LinkEdict (e, false); @@ -283,7 +298,7 @@ void SetMinMaxSize (edict_t *e, float *min, float *max, qboolean rotate) for (i=0 ; i<3 ; i++) if (min[i] > max[i]) - Host_Error ("backwards mins/maxs"); + PF_ERROR("SetMinMaxSize: backwards mins/maxs\n"); // set derived values VectorCopy (min, e->v->mins); @@ -310,9 +325,9 @@ void PF_setsize (void) e = G_EDICT(OFS_PARM0); if (e == sv.edicts) - Host_Error("setsize: can not modify world entity\n"); + PF_WARNING("setsize: can not modify world entity\n"); if (e->e->free) - Host_Error("setsize: can not modify free entity\n"); + PF_WARNING("setsize: can not modify free entity\n"); min = G_VECTOR(OFS_PARM1); max = G_VECTOR(OFS_PARM2); SetMinMaxSize (e, min, max, false); @@ -335,9 +350,9 @@ void PF_setmodel (void) e = G_EDICT(OFS_PARM0); if (e == sv.edicts) - Host_Error("setmodel: can not modify world entity\n"); + PF_WARNING("setmodel: can not modify world entity\n"); if (e->e->free) - Host_Error("setmodel: can not modify free entity\n"); + PF_WARNING("setmodel: can not modify free entity\n"); m = G_STRING(OFS_PARM1); // check to see if model was properly precached @@ -346,7 +361,7 @@ void PF_setmodel (void) break; if (!*check) - Host_Error ("no precache: %s\n", m); + PF_WARNING("setmodel: no precache\n"); e->v->model = PR_SetString(*check); @@ -373,7 +388,7 @@ void PF_bprint (void) { char string[STRINGTEMP_LENGTH]; PF_VarString(0, string, sizeof(string)); - SV_BroadcastPrintf("%s", string); + SV_BroadcastPrint(string); } /* @@ -395,7 +410,7 @@ void PF_sprint (void) if (entnum < 1 || entnum > svs.maxclients || !svs.clients[entnum-1].active) { - Con_Printf ("tried to sprint to a non-client\n"); + Con_Print("tried to sprint to a non-client\n"); return; } @@ -427,7 +442,7 @@ void PF_centerprint (void) if (entnum < 1 || entnum > svs.maxclients || !svs.clients[entnum-1].active) { - Con_Printf ("tried to sprint to a non-client\n"); + Con_Print("tried to sprint to a non-client\n"); return; } @@ -509,7 +524,7 @@ void PF_vectoyaw (void) yaw = 0; else { - yaw = (int) (atan2(value1[1], value1[0]) * 180 / M_PI); + yaw = (atan2(value1[1], value1[0]) * 180 / M_PI); if (yaw < 0) yaw += 360; } @@ -527,11 +542,9 @@ vector vectoangles(vector) */ void PF_vectoangles (void) { - float *value1; - float forward; - float yaw, pitch; + double value1[3], forward, yaw, pitch; - value1 = G_VECTOR(OFS_PARM0); + VectorCopy(G_VECTOR(OFS_PARM0), value1); if (value1[1] == 0 && value1[0] == 0) { @@ -556,14 +569,12 @@ void PF_vectoangles (void) yaw = 270; forward = sqrt(value1[0]*value1[0] + value1[1]*value1[1]); - pitch = (int) (atan2(value1[2], forward) * 180 / M_PI); + pitch = (atan2(value1[2], forward) * 180 / M_PI); if (pitch < 0) pitch += 360; } - G_FLOAT(OFS_RETURN+0) = pitch; - G_FLOAT(OFS_RETURN+1) = yaw; - G_FLOAT(OFS_RETURN+2) = 0; + VectorSet(G_VECTOR(OFS_RETURN), pitch, yaw, 0); } /* @@ -617,7 +628,7 @@ void PF_ambientsound (void) char *samp; float *pos; float vol, attenuation; - int i, soundnum, large; + int soundnum, large; pos = G_VECTOR (OFS_PARM0); samp = G_STRING(OFS_PARM1); @@ -631,7 +642,7 @@ void PF_ambientsound (void) if (!*check) { - Con_Printf ("no precache: %s\n", samp); + Con_Printf("no precache: %s\n", samp); return; } @@ -646,8 +657,7 @@ void PF_ambientsound (void) else MSG_WriteByte (&sv.signon, svc_spawnstaticsound); - for (i=0 ; i<3 ; i++) - MSG_WriteDPCoord(&sv.signon, pos[i]); + MSG_WriteVector(&sv.signon, pos, sv.protocol); if (large) MSG_WriteShort (&sv.signon, soundnum); @@ -689,13 +699,13 @@ void PF_sound (void) attenuation = G_FLOAT(OFS_PARM4); if (volume < 0 || volume > 255) - Host_Error ("SV_StartSound: volume = %i", volume); + PF_WARNING("SV_StartSound: volume must be in range 0-1\n"); if (attenuation < 0 || attenuation > 4) - Host_Error ("SV_StartSound: attenuation = %f", attenuation); + PF_WARNING("SV_StartSound: attenuation must be in range 0-4\n"); if (channel < 0 || channel > 7) - Host_Error ("SV_StartSound: channel = %i", channel); + PF_WARNING("SV_StartSound: channel must be in range 0-7\n"); SV_StartSound (entity, channel, sample, volume, attenuation); } @@ -709,7 +719,7 @@ break() */ void PF_break (void) { - Host_Error ("break statement"); + PF_ERROR("break: break statement\n"); } /* @@ -727,17 +737,17 @@ void PF_traceline (void) { float *v1, *v2; trace_t trace; - int nomonsters; + int move; edict_t *ent; pr_xfunction->builtinsprofile += 30; v1 = G_VECTOR(OFS_PARM0); v2 = G_VECTOR(OFS_PARM1); - nomonsters = G_FLOAT(OFS_PARM2); + move = G_FLOAT(OFS_PARM2); ent = G_EDICT(OFS_PARM3); - trace = SV_Move (v1, vec3_origin, vec3_origin, v2, nomonsters, ent); + trace = SV_Move (v1, vec3_origin, vec3_origin, v2, move, ent); pr_global_struct->trace_allsolid = trace.allsolid; pr_global_struct->trace_startsolid = trace.startsolid; @@ -771,7 +781,7 @@ void PF_tracebox (void) { float *v1, *v2, *m1, *m2; trace_t trace; - int nomonsters; + int move; edict_t *ent; pr_xfunction->builtinsprofile += 30; @@ -780,10 +790,10 @@ void PF_tracebox (void) m1 = G_VECTOR(OFS_PARM1); m2 = G_VECTOR(OFS_PARM2); v2 = G_VECTOR(OFS_PARM3); - nomonsters = G_FLOAT(OFS_PARM4); + move = G_FLOAT(OFS_PARM4); ent = G_EDICT(OFS_PARM5); - trace = SV_Move (v1, m1, m2, v2, nomonsters ? MOVE_NOMONSTERS : MOVE_NORMAL, ent); + trace = SV_Move (v1, m1, m2, v2, move, ent); pr_global_struct->trace_allsolid = trace.allsolid; pr_global_struct->trace_startsolid = trace.startsolid; @@ -810,7 +820,7 @@ void PF_TraceToss (void) ent = G_EDICT(OFS_PARM0); if (ent == sv.edicts) - Host_Error("tracetoss: can not use world entity\n"); + PF_WARNING("tracetoss: can not use world entity\n"); ignore = G_EDICT(OFS_PARM1); trace = SV_Trace_Toss (ent, ignore); @@ -960,7 +970,7 @@ void PF_stuffcmd (void) entnum = G_EDICTNUM(OFS_PARM0); if (entnum < 1 || entnum > svs.maxclients || !svs.clients[entnum-1].active) { - Con_Printf("Can't stuffcmd to a non-client"); + Con_Print("Can't stuffcmd to a non-client\n"); return; } str = G_STRING(OFS_PARM1); @@ -1021,37 +1031,46 @@ findradius (origin, radius) void PF_findradius (void) { edict_t *ent, *chain; - float radius; - float radius2; - float *org; - float eorg[3]; + vec_t radius, radius2; + vec3_t org, eorg, mins, maxs; int i; + int numtouchedicts; + edict_t *touchedicts[MAX_EDICTS]; chain = (edict_t *)sv.edicts; - org = G_VECTOR(OFS_PARM0); + VectorCopy(G_VECTOR(OFS_PARM0), org); radius = G_FLOAT(OFS_PARM1); radius2 = radius * radius; - ent = NEXT_EDICT(sv.edicts); - for (i=1 ; i MAX_EDICTS) + { + // this never happens + Con_Printf("SV_EntitiesInBox returned %i edicts, max was %i\n", numtouchedicts, MAX_EDICTS); + numtouchedicts = MAX_EDICTS; + } + for (i = 0;i < numtouchedicts;i++) { + ent = touchedicts[i]; pr_xfunction->builtinsprofile++; - if (ent->e->free) - continue; - if (ent->v->solid == SOLID_NOT) - continue; - - // LordHavoc: compare against bounding box rather than center, - // and use DotProduct instead of Length, major speedup + // LordHavoc: compare against bounding box rather than center so it + // doesn't miss large objects, and use DotProduct instead of Length + // for a major speedup eorg[0] = (org[0] - ent->v->origin[0]) - bound(ent->v->mins[0], (org[0] - ent->v->origin[0]), ent->v->maxs[0]); eorg[1] = (org[1] - ent->v->origin[1]) - bound(ent->v->mins[1], (org[1] - ent->v->origin[1]), ent->v->maxs[1]); eorg[2] = (org[2] - ent->v->origin[2]) - bound(ent->v->mins[2], (org[2] - ent->v->origin[2]), ent->v->maxs[2]); - if (DotProduct(eorg, eorg) > radius2) - continue; - - ent->v->chain = EDICT_TO_PROG(chain); - chain = ent; + if (DotProduct(eorg, eorg) < radius2) + { + ent->v->chain = EDICT_TO_PROG(chain); + chain = ent; + } } RETURN_EDICT(chain); @@ -1069,7 +1088,7 @@ void PF_dprint (void) if (developer.integer) { PF_VarString(0, string, sizeof(string)); - Con_Printf("%s",string); + Con_Print(string); } } @@ -1125,12 +1144,12 @@ void PF_Remove (void) ed = G_EDICT(OFS_PARM0); if (ed == sv.edicts) - Host_Error("remove: tried to remove world\n"); + PF_WARNING("remove: tried to remove world\n"); if (NUM_FOR_EDICT(ed) <= svs.maxclients) - Host_Error("remove: tried to remove a client\n"); + PF_WARNING("remove: tried to remove a client\n"); // LordHavoc: not an error because id1 progs did this in some cases (killtarget removes entities, even if they are already removed in some cases...) if (ed->e->free && developer.integer) - Con_Printf("remove: tried to remove an entity that was already removed\n"); + PF_WARNING("remove: tried to remove an entity that was already removed\n"); ED_Free (ed); } @@ -1267,10 +1286,67 @@ void PF_findchainfloat (void) RETURN_EDICT(chain); } +// LordHavoc: search for flags in float fields +void PF_findflags (void) +{ + int e; + int f; + int s; + edict_t *ed; + + e = G_EDICTNUM(OFS_PARM0); + f = G_INT(OFS_PARM1); + s = (int)G_FLOAT(OFS_PARM2); + + for (e++ ; e < sv.num_edicts ; e++) + { + pr_xfunction->builtinsprofile++; + ed = EDICT_NUM(e); + if (ed->e->free) + continue; + if ((int)E_FLOAT(ed,f) & s) + { + RETURN_EDICT(ed); + return; + } + } + + RETURN_EDICT(sv.edicts); +} + +// LordHavoc: chained search for flags in float fields +void PF_findchainflags (void) +{ + int i; + int f; + int s; + edict_t *ent, *chain; + + chain = (edict_t *)sv.edicts; + + f = G_INT(OFS_PARM0); + s = (int)G_FLOAT(OFS_PARM1); + + ent = NEXT_EDICT(sv.edicts); + for (i = 1;i < sv.num_edicts;i++, ent = NEXT_EDICT(ent)) + { + pr_xfunction->builtinsprofile++; + if (ent->e->free) + continue; + if (!((int)E_FLOAT(ent,f) & s)) + continue; + + ent->v->chain = EDICT_TO_PROG(chain); + chain = ent; + } + + RETURN_EDICT(chain); +} + void PR_CheckEmptyString (char *s) { if (s[0] <= ' ') - Host_Error ("Bad string"); + PF_ERROR("Bad string"); } void PF_precache_file (void) @@ -1282,15 +1358,16 @@ void PF_precache_sound (void) { char *s; int i; + int limit = (sv.protocol == PROTOCOL_QUAKE ? 256 : MAX_SOUNDS); if (sv.state != ss_loading) - Host_Error ("PF_Precache_*: Precache can only be done in spawn functions"); + PF_ERROR("PF_Precache_*: Precache can only be done in spawn functions"); s = G_STRING(OFS_PARM0); G_INT(OFS_RETURN) = G_INT(OFS_PARM0); PR_CheckEmptyString (s); - for (i=0 ; ibrush.ishlbsp && ((!s) || (!s[0]))) @@ -1317,7 +1395,7 @@ void PF_precache_model (void) G_INT(OFS_RETURN) = G_INT(OFS_PARM0); PR_CheckEmptyString (s); - for (i=0 ; iself); if (ent == sv.edicts) - Host_Error("walkmove: can not modify world entity\n"); + PF_WARNING("walkmove: can not modify world entity\n"); if (ent->e->free) - Host_Error("walkmove: can not modify free entity\n"); + PF_WARNING("walkmove: can not modify free entity\n"); yaw = G_FLOAT(OFS_PARM0); dist = G_FLOAT(OFS_PARM1); if ( !( (int)ent->v->flags & (FL_ONGROUND|FL_FLY|FL_SWIM) ) ) - { - G_FLOAT(OFS_RETURN) = 0; return; - } yaw = yaw*M_PI*2 / 360; @@ -1412,20 +1490,21 @@ void PF_droptofloor (void) vec3_t end; trace_t trace; + // assume failure if it returns early + G_FLOAT(OFS_RETURN) = 0; + ent = PROG_TO_EDICT(pr_global_struct->self); if (ent == sv.edicts) - Host_Error("droptofloor: can not modify world entity\n"); + PF_WARNING("droptofloor: can not modify world entity\n"); if (ent->e->free) - Host_Error("droptofloor: can not modify free entity\n"); + PF_WARNING("droptofloor: can not modify free entity\n"); VectorCopy (ent->v->origin, end); end[2] -= 256; trace = SV_Move (ent->v->origin, ent->v->mins, ent->v->maxs, end, MOVE_NORMAL, ent); - if (trace.fraction == 1) - G_FLOAT(OFS_RETURN) = 0; - else + if (trace.fraction != 1) { VectorCopy (trace.endpos, ent->v->origin); SV_LinkEdict (ent, false); @@ -1559,11 +1638,17 @@ void PF_aim (void) float dist, bestdist; float speed; + // assume failure if it returns early + VectorCopy(pr_global_struct->v_forward, G_VECTOR(OFS_RETURN)); + // if sv_aim is so high it can't possibly accept anything, skip out early + if (sv_aim.value >= 1) + return; + ent = G_EDICT(OFS_PARM0); if (ent == sv.edicts) - Host_Error("aim: can not use world entity\n"); + PF_WARNING("aim: can not use world entity\n"); if (ent->e->free) - Host_Error("aim: can not use free entity\n"); + PF_WARNING("aim: can not use free entity\n"); speed = G_FLOAT(OFS_PARM1); VectorCopy (ent->v->origin, start); @@ -1641,9 +1726,9 @@ void PF_changeyaw (void) ent = PROG_TO_EDICT(pr_global_struct->self); if (ent == sv.edicts) - Host_Error("changeyaw: can not modify world entity\n"); + PF_WARNING("changeyaw: can not modify world entity\n"); if (ent->e->free) - Host_Error("changeyaw: can not modify free entity\n"); + PF_WARNING("changeyaw: can not modify free entity\n"); current = ANGLEMOD(ent->v->angles[1]); ideal = ent->v->ideal_yaw; speed = ent->v->yaw_speed; @@ -1688,22 +1773,22 @@ void PF_changepitch (void) ent = G_EDICT(OFS_PARM0); if (ent == sv.edicts) - Host_Error("changepitch: can not modify world entity\n"); + PF_WARNING("changepitch: can not modify world entity\n"); if (ent->e->free) - Host_Error("changepitch: can not modify free entity\n"); + PF_WARNING("changepitch: can not modify free entity\n"); current = ANGLEMOD( ent->v->angles[0] ); if ((val = GETEDICTFIELDVALUE(ent, eval_idealpitch))) ideal = val->_float; else { - Host_Error ("PF_changepitch: .float idealpitch and .float pitch_speed must be defined to use changepitch"); + PF_WARNING("PF_changepitch: .float idealpitch and .float pitch_speed must be defined to use changepitch\n"); return; } if ((val = GETEDICTFIELDVALUE(ent, eval_pitch_speed))) speed = val->_float; else { - Host_Error ("PF_changepitch: .float idealpitch and .float pitch_speed must be defined to use changepitch"); + PF_WARNING("PF_changepitch: .float idealpitch and .float pitch_speed must be defined to use changepitch\n"); return; } @@ -1773,7 +1858,7 @@ sizebuf_t *WriteDest (void) return &sv.signon; default: - Host_Error ("WriteDest: bad destination"); + Host_Error("WriteDest: bad destination"); break; } @@ -1802,12 +1887,12 @@ void PF_WriteLong (void) void PF_WriteAngle (void) { - MSG_WriteAngle (WriteDest(), G_FLOAT(OFS_PARM1)); + MSG_WriteAngle (WriteDest(), G_FLOAT(OFS_PARM1), sv.protocol); } void PF_WriteCoord (void) { - MSG_WriteDPCoord (WriteDest(), G_FLOAT(OFS_PARM1)); + MSG_WriteCoord (WriteDest(), G_FLOAT(OFS_PARM1), sv.protocol); } void PF_WriteString (void) @@ -1830,9 +1915,9 @@ void PF_makestatic (void) ent = G_EDICT(OFS_PARM0); if (ent == sv.edicts) - Host_Error("makestatic: can not modify world entity\n"); + PF_WARNING("makestatic: can not modify world entity\n"); if (ent->e->free) - Host_Error("makestatic: can not modify free entity\n"); + PF_WARNING("makestatic: can not modify free entity\n"); large = false; if (ent->v->modelindex >= 256 || ent->v->frame >= 256) @@ -1855,8 +1940,8 @@ void PF_makestatic (void) MSG_WriteByte (&sv.signon, ent->v->skin); for (i=0 ; i<3 ; i++) { - MSG_WriteDPCoord(&sv.signon, ent->v->origin[i]); - MSG_WriteAngle(&sv.signon, ent->v->angles[i]); + MSG_WriteCoord(&sv.signon, ent->v->origin[i], sv.protocol); + MSG_WriteAngle(&sv.signon, ent->v->angles[i], sv.protocol); } // throw the entity away now @@ -1880,7 +1965,7 @@ void PF_setspawnparms (void) i = NUM_FOR_EDICT(ent); if (i < 1 || i > svs.maxclients || !svs.clients[i-1].active) { - Con_Printf("tried to setspawnparms on a non-client\n"); + Con_Print("tried to setspawnparms on a non-client\n"); return; } @@ -1970,17 +2055,13 @@ void PF_GetLight (void) VectorMA(ambientcolor, 0.5, diffusecolor, G_VECTOR(OFS_RETURN)); } -#define MAX_QC_CVARS 128 -cvar_t qc_cvar[MAX_QC_CVARS]; -int currentqc_cvar; - void PF_registercvar (void) { char *name, *value; - cvar_t *variable; name = G_STRING(OFS_PARM0); value = G_STRING(OFS_PARM1); G_FLOAT(OFS_RETURN) = 0; + // first check to see if it has already been defined if (Cvar_FindVar (name)) return; @@ -1988,22 +2069,12 @@ void PF_registercvar (void) // check for overlap with a command if (Cmd_Exists (name)) { - Con_Printf ("PF_registercvar: %s is a command\n", name); + Con_Printf("PF_registercvar: %s is a command\n", name); return; } - if (currentqc_cvar >= MAX_QC_CVARS) - Host_Error ("PF_registercvar: ran out of cvar slots (%i)\n", MAX_QC_CVARS); + Cvar_Get(name, value, 0); -// copy the name and value - variable = &qc_cvar[currentqc_cvar++]; - variable->name = Z_Malloc (strlen(name)+1); - strcpy (variable->name, name); - variable->string = Z_Malloc (strlen(value)+1); - strcpy (variable->string, value); - variable->value = atof (value); - - Cvar_RegisterVariable(variable); G_FLOAT(OFS_RETURN) = 1; // success } @@ -2031,7 +2102,10 @@ void PF_min (void) G_FLOAT(OFS_RETURN) = f; } else - Host_Error("min: must supply at least 2 floats\n"); + { + G_FLOAT(OFS_RETURN) = 0; + PF_WARNING("min: must supply at least 2 floats\n"); + } } /* @@ -2058,7 +2132,10 @@ void PF_max (void) G_FLOAT(OFS_RETURN) = f; } else - Host_Error("max: must supply at least 2 floats\n"); + { + G_FLOAT(OFS_RETURN) = 0; + PF_WARNING("max: must supply at least 2 floats\n"); + } } /* @@ -2103,14 +2180,14 @@ void PF_copyentity (void) edict_t *in, *out; in = G_EDICT(OFS_PARM0); if (in == sv.edicts) - Host_Error("copyentity: can not read world entity\n"); + PF_WARNING("copyentity: can not read world entity\n"); if (in->e->free) - Host_Error("copyentity: can not read free entity\n"); + PF_WARNING("copyentity: can not read free entity\n"); out = G_EDICT(OFS_PARM1); if (out == sv.edicts) - Host_Error("copyentity: can not modify world entity\n"); + PF_WARNING("copyentity: can not modify world entity\n"); if (out->e->free) - Host_Error("copyentity: can not modify free entity\n"); + PF_WARNING("copyentity: can not modify free entity\n"); memcpy(out->v, in->v, progs->entityfields * 4); } @@ -2134,7 +2211,7 @@ void PF_setcolor (void) if (entnum < 1 || entnum > svs.maxclients || !svs.clients[entnum-1].active) { - Con_Printf ("tried to setcolor a non-client\n"); + Con_Print("tried to setcolor a non-client\n"); return; } @@ -2159,12 +2236,16 @@ effect(origin, modelname, startframe, framecount, framerate) */ void PF_effect (void) { + int i; char *s; s = G_STRING(OFS_PARM1); if (!s || !s[0]) - Host_Error("effect: no model specified\n"); + PF_WARNING("effect: no model specified\n"); - SV_StartEffect(G_VECTOR(OFS_PARM0), SV_ModelIndex(s), G_FLOAT(OFS_PARM2), G_FLOAT(OFS_PARM3), G_FLOAT(OFS_PARM4)); + i = SV_ModelIndex(s); + if (i < 0) + PF_WARNING("effect: model not precached\n"); + SV_StartEffect(G_VECTOR(OFS_PARM0), i, G_FLOAT(OFS_PARM2), G_FLOAT(OFS_PARM3), G_FLOAT(OFS_PARM4)); } void PF_te_blood (void) @@ -2174,9 +2255,9 @@ void PF_te_blood (void) MSG_WriteByte(&sv.datagram, svc_temp_entity); MSG_WriteByte(&sv.datagram, TE_BLOOD); // origin - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2], sv.protocol); // velocity MSG_WriteByte(&sv.datagram, bound(-128, (int) G_VECTOR(OFS_PARM1)[0], 127)); MSG_WriteByte(&sv.datagram, bound(-128, (int) G_VECTOR(OFS_PARM1)[1], 127)); @@ -2192,15 +2273,15 @@ void PF_te_bloodshower (void) MSG_WriteByte(&sv.datagram, svc_temp_entity); MSG_WriteByte(&sv.datagram, TE_BLOODSHOWER); // min - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2], sv.protocol); // max - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[0]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[1]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[2]); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[0], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[1], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[2], sv.protocol); // speed - MSG_WriteDPCoord(&sv.datagram, G_FLOAT(OFS_PARM2)); + MSG_WriteCoord(&sv.datagram, G_FLOAT(OFS_PARM2), sv.protocol); // count MSG_WriteShort(&sv.datagram, bound(0, G_FLOAT(OFS_PARM3), 65535)); } @@ -2210,9 +2291,9 @@ void PF_te_explosionrgb (void) MSG_WriteByte(&sv.datagram, svc_temp_entity); MSG_WriteByte(&sv.datagram, TE_EXPLOSIONRGB); // origin - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2], sv.protocol); // color MSG_WriteByte(&sv.datagram, bound(0, (int) (G_VECTOR(OFS_PARM1)[0] * 255), 255)); MSG_WriteByte(&sv.datagram, bound(0, (int) (G_VECTOR(OFS_PARM1)[1] * 255), 255)); @@ -2226,17 +2307,17 @@ void PF_te_particlecube (void) MSG_WriteByte(&sv.datagram, svc_temp_entity); MSG_WriteByte(&sv.datagram, TE_PARTICLECUBE); // min - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2], sv.protocol); // max - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[0]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[1]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[2]); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[0], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[1], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[2], sv.protocol); // velocity - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[0]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[1]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[2]); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[0], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[1], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[2], sv.protocol); // count MSG_WriteShort(&sv.datagram, bound(0, G_FLOAT(OFS_PARM3), 65535)); // color @@ -2244,7 +2325,7 @@ void PF_te_particlecube (void) // gravity true/false MSG_WriteByte(&sv.datagram, ((int) G_FLOAT(OFS_PARM5)) != 0); // randomvel - MSG_WriteDPCoord(&sv.datagram, G_FLOAT(OFS_PARM6)); + MSG_WriteCoord(&sv.datagram, G_FLOAT(OFS_PARM6), sv.protocol); } void PF_te_particlerain (void) @@ -2254,17 +2335,17 @@ void PF_te_particlerain (void) MSG_WriteByte(&sv.datagram, svc_temp_entity); MSG_WriteByte(&sv.datagram, TE_PARTICLERAIN); // min - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2], sv.protocol); // max - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[0]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[1]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[2]); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[0], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[1], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[2], sv.protocol); // velocity - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[0]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[1]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[2]); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[0], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[1], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[2], sv.protocol); // count MSG_WriteShort(&sv.datagram, bound(0, G_FLOAT(OFS_PARM3), 65535)); // color @@ -2278,17 +2359,17 @@ void PF_te_particlesnow (void) MSG_WriteByte(&sv.datagram, svc_temp_entity); MSG_WriteByte(&sv.datagram, TE_PARTICLESNOW); // min - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2], sv.protocol); // max - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[0]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[1]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[2]); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[0], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[1], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[2], sv.protocol); // velocity - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[0]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[1]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[2]); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[0], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[1], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[2], sv.protocol); // count MSG_WriteShort(&sv.datagram, bound(0, G_FLOAT(OFS_PARM3), 65535)); // color @@ -2302,9 +2383,9 @@ void PF_te_spark (void) MSG_WriteByte(&sv.datagram, svc_temp_entity); MSG_WriteByte(&sv.datagram, TE_SPARK); // origin - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2], sv.protocol); // velocity MSG_WriteByte(&sv.datagram, bound(-128, (int) G_VECTOR(OFS_PARM1)[0], 127)); MSG_WriteByte(&sv.datagram, bound(-128, (int) G_VECTOR(OFS_PARM1)[1], 127)); @@ -2318,9 +2399,9 @@ void PF_te_gunshotquad (void) MSG_WriteByte(&sv.datagram, svc_temp_entity); MSG_WriteByte(&sv.datagram, TE_GUNSHOTQUAD); // origin - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2], sv.protocol); } void PF_te_spikequad (void) @@ -2328,9 +2409,9 @@ void PF_te_spikequad (void) MSG_WriteByte(&sv.datagram, svc_temp_entity); MSG_WriteByte(&sv.datagram, TE_SPIKEQUAD); // origin - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2], sv.protocol); } void PF_te_superspikequad (void) @@ -2338,9 +2419,9 @@ void PF_te_superspikequad (void) MSG_WriteByte(&sv.datagram, svc_temp_entity); MSG_WriteByte(&sv.datagram, TE_SUPERSPIKEQUAD); // origin - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2], sv.protocol); } void PF_te_explosionquad (void) @@ -2348,9 +2429,9 @@ void PF_te_explosionquad (void) MSG_WriteByte(&sv.datagram, svc_temp_entity); MSG_WriteByte(&sv.datagram, TE_EXPLOSIONQUAD); // origin - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2], sv.protocol); } void PF_te_smallflash (void) @@ -2358,9 +2439,9 @@ void PF_te_smallflash (void) MSG_WriteByte(&sv.datagram, svc_temp_entity); MSG_WriteByte(&sv.datagram, TE_SMALLFLASH); // origin - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2], sv.protocol); } void PF_te_customflash (void) @@ -2370,9 +2451,9 @@ void PF_te_customflash (void) MSG_WriteByte(&sv.datagram, svc_temp_entity); MSG_WriteByte(&sv.datagram, TE_CUSTOMFLASH); // origin - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2], sv.protocol); // radius MSG_WriteByte(&sv.datagram, bound(0, G_FLOAT(OFS_PARM1) / 8 - 1, 255)); // lifetime @@ -2388,9 +2469,9 @@ void PF_te_gunshot (void) MSG_WriteByte(&sv.datagram, svc_temp_entity); MSG_WriteByte(&sv.datagram, TE_GUNSHOT); // origin - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2], sv.protocol); } void PF_te_spike (void) @@ -2398,9 +2479,9 @@ void PF_te_spike (void) MSG_WriteByte(&sv.datagram, svc_temp_entity); MSG_WriteByte(&sv.datagram, TE_SPIKE); // origin - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2], sv.protocol); } void PF_te_superspike (void) @@ -2408,9 +2489,9 @@ void PF_te_superspike (void) MSG_WriteByte(&sv.datagram, svc_temp_entity); MSG_WriteByte(&sv.datagram, TE_SUPERSPIKE); // origin - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2], sv.protocol); } void PF_te_explosion (void) @@ -2418,9 +2499,9 @@ void PF_te_explosion (void) MSG_WriteByte(&sv.datagram, svc_temp_entity); MSG_WriteByte(&sv.datagram, TE_EXPLOSION); // origin - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2], sv.protocol); } void PF_te_tarexplosion (void) @@ -2428,9 +2509,9 @@ void PF_te_tarexplosion (void) MSG_WriteByte(&sv.datagram, svc_temp_entity); MSG_WriteByte(&sv.datagram, TE_TAREXPLOSION); // origin - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2], sv.protocol); } void PF_te_wizspike (void) @@ -2438,9 +2519,9 @@ void PF_te_wizspike (void) MSG_WriteByte(&sv.datagram, svc_temp_entity); MSG_WriteByte(&sv.datagram, TE_WIZSPIKE); // origin - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2], sv.protocol); } void PF_te_knightspike (void) @@ -2448,9 +2529,9 @@ void PF_te_knightspike (void) MSG_WriteByte(&sv.datagram, svc_temp_entity); MSG_WriteByte(&sv.datagram, TE_KNIGHTSPIKE); // origin - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2], sv.protocol); } void PF_te_lavasplash (void) @@ -2458,9 +2539,9 @@ void PF_te_lavasplash (void) MSG_WriteByte(&sv.datagram, svc_temp_entity); MSG_WriteByte(&sv.datagram, TE_LAVASPLASH); // origin - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2], sv.protocol); } void PF_te_teleport (void) @@ -2468,9 +2549,9 @@ void PF_te_teleport (void) MSG_WriteByte(&sv.datagram, svc_temp_entity); MSG_WriteByte(&sv.datagram, TE_TELEPORT); // origin - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2], sv.protocol); } void PF_te_explosion2 (void) @@ -2478,11 +2559,12 @@ void PF_te_explosion2 (void) MSG_WriteByte(&sv.datagram, svc_temp_entity); MSG_WriteByte(&sv.datagram, TE_EXPLOSION2); // origin - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2], sv.protocol); // color MSG_WriteByte(&sv.datagram, G_FLOAT(OFS_PARM1)); + MSG_WriteByte(&sv.datagram, G_FLOAT(OFS_PARM2)); } void PF_te_lightning1 (void) @@ -2492,13 +2574,13 @@ void PF_te_lightning1 (void) // owner entity MSG_WriteShort(&sv.datagram, G_EDICTNUM(OFS_PARM0)); // start - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[0]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[1]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[2]); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[0], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[1], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[2], sv.protocol); // end - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[0]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[1]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[2]); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[0], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[1], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[2], sv.protocol); } void PF_te_lightning2 (void) @@ -2508,13 +2590,13 @@ void PF_te_lightning2 (void) // owner entity MSG_WriteShort(&sv.datagram, G_EDICTNUM(OFS_PARM0)); // start - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[0]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[1]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[2]); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[0], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[1], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[2], sv.protocol); // end - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[0]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[1]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[2]); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[0], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[1], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[2], sv.protocol); } void PF_te_lightning3 (void) @@ -2524,13 +2606,13 @@ void PF_te_lightning3 (void) // owner entity MSG_WriteShort(&sv.datagram, G_EDICTNUM(OFS_PARM0)); // start - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[0]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[1]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[2]); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[0], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[1], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[2], sv.protocol); // end - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[0]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[1]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[2]); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[0], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[1], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[2], sv.protocol); } void PF_te_beam (void) @@ -2540,22 +2622,22 @@ void PF_te_beam (void) // owner entity MSG_WriteShort(&sv.datagram, G_EDICTNUM(OFS_PARM0)); // start - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[0]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[1]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[2]); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[0], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[1], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM1)[2], sv.protocol); // end - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[0]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[1]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[2]); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[0], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[1], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM2)[2], sv.protocol); } void PF_te_plasmaburn (void) { MSG_WriteByte(&sv.datagram, svc_temp_entity); MSG_WriteByte(&sv.datagram, TE_PLASMABURN); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1]); - MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[0], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[1], sv.protocol); + MSG_WriteCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2], sv.protocol); } static void clippointtosurface(msurface_t *surf, vec3_t p, vec3_t out) @@ -2593,9 +2675,9 @@ static msurface_t *getsurface(edict_t *ed, int surfnum) if (modelindex < 1 || modelindex >= MAX_MODELS) return NULL; model = sv.models[modelindex]; - if (surfnum < 0 || surfnum >= model->brushq1.nummodelsurfaces) + if (surfnum < 0 || surfnum >= model->nummodelsurfaces) return NULL; - return model->brushq1.surfaces + surfnum + model->brushq1.firstmodelsurface; + return model->brushq1.surfaces + surfnum + model->firstmodelsurface; } @@ -2679,9 +2761,9 @@ void PF_getsurfacenearpoint(void) VectorSubtract(point, ed->v->origin, p); best = -1; bestdist = 1000000000; - for (surfnum = 0;surfnum < model->brushq1.nummodelsurfaces;surfnum++) + for (surfnum = 0;surfnum < model->nummodelsurfaces;surfnum++) { - surf = model->brushq1.surfaces + surfnum + model->brushq1.firstmodelsurface; + surf = model->brushq1.surfaces + surfnum + model->firstmodelsurface; dist = PlaneDiff(p, surf->plane); dist = dist * dist; if (dist < bestdist) @@ -2748,7 +2830,7 @@ void PF_stof(void) //float(string filename, float mode) fopen = #110; // opens a file inside quake/gamedir/data/ (mode is FILE_READ, FILE_APPEND, or FILE_WRITE), returns fhandle >= 0 if successful, or fhandle < 0 if unable to open file for any reason void PF_fopen(void) { - int filenum, mode; + int filenum, mode, i; char *modestring, *filename; for (filenum = 0;filenum < MAX_PRFILES;filenum++) if (pr_files[filenum] == NULL) @@ -2777,17 +2859,26 @@ void PF_fopen(void) return; } filename = G_STRING(OFS_PARM0); - // .. is parent directory on many platforms - // / is parent directory on Amiga + // control characters do not cause issues with any platforms I know of, but they are usually annoying to deal with + // ../ is parent directory on many platforms + // // is parent directory on Amiga + // / at the beginning of a path is root on unix, and parent directory on Amiga // : is root of drive on Amiga (also used as a directory separator on Mac, but / works there too, so that's a bad idea) // \ is a windows-ism (so it's naughty to use it, / works on all platforms) - if ((filename[0] == '.' && filename[1] == '.') || filename[0] == '/' || strrchr(filename, ':') || strrchr(filename, '\\')) + for (i = 0;filename[i];i++) { - Con_Printf("PF_fopen: dangerous or non-portable filename \"%s\" not allowed. (contains : or \\ or begins with .. or /)\n", filename); - G_FLOAT(OFS_RETURN) = -4; - return; + if (filename[i] < ' ' || (filename[i] == '/' && filename[i+1] == '/') || (filename[i] == '.' && filename[i+1] == '.') || filename[i] == ':' || filename[i] == '\\' || filename[0] == '/') + { + Con_Printf("PF_fopen: dangerous/confusing/annoying/non-portable filename \"%s\" not allowed. (contains control characters or // or .. or : or \\ or begins with /)\n", filename); + G_FLOAT(OFS_RETURN) = -4; + return; + } } pr_files[filenum] = FS_Open(va("data/%s", filename), modestring, false); + + if (pr_files[filenum] == NULL && modestring == "rb") + pr_files[filenum] = FS_Open(filename, modestring, false); + if (pr_files[filenum] == NULL) G_FLOAT(OFS_RETURN) = -1; else @@ -2843,7 +2934,7 @@ void PF_fgets(void) c = FS_Getc(pr_files[filenum]); if (developer.integer) Con_Printf("fgets: %s\n", string); - if (c >= 0) + if (c >= 0 || end) G_INT(OFS_RETURN) = PR_SetString(string); else G_INT(OFS_RETURN) = 0; @@ -2943,7 +3034,7 @@ void PF_clientcommand (void) i = (NUM_FOR_EDICT(G_EDICT(OFS_PARM0)) - 1); if (i < 0 || i >= svs.maxclients || !svs.clients[i].active) { - Con_Printf("PF_clientcommand: entity is not a client"); + Con_Print("PF_clientcommand: entity is not a client\n"); return; } @@ -2955,30 +3046,26 @@ void PF_clientcommand (void) //float(string s) tokenize = #441; // takes apart a string into individal words (access them with argv), returns how many //this function originally written by KrimZon, made shorter by LordHavoc -char **tokens = NULL; -int max_tokens, num_tokens = 0; +//20040203: rewritten by LordHavoc (no longer uses allocations) +int num_tokens = 0; +char *tokens[256], tokenbuf[4096]; void PF_tokenize (void) { + int pos; const char *p; - char *str; - str = G_STRING(OFS_PARM0); + p = G_STRING(OFS_PARM0); - if (tokens != NULL) + num_tokens = 0; + pos = 0; + while(COM_ParseToken(&p, false)) { - int i; - for (i=0;i= (int)(sizeof(tokens)/sizeof(tokens[0]))) + break; + if (pos + strlen(com_token) + 1 > sizeof(tokenbuf)) + break; + tokens[num_tokens++] = tokenbuf + pos; + strcpy(tokenbuf + pos, com_token); + pos += strlen(com_token) + 1; } G_FLOAT(OFS_RETURN) = num_tokens; @@ -3006,9 +3093,9 @@ void PF_setattachment (void) model_t *model; if (e == sv.edicts) - Host_Error("setattachment: can not modify world entity\n"); + PF_WARNING("setattachment: can not modify world entity\n"); if (e->e->free) - Host_Error("setattachment: can not modify free entity\n"); + PF_WARNING("setattachment: can not modify free entity\n"); if (tagentity == NULL) tagentity = sv.edicts; @@ -3029,6 +3116,7 @@ void PF_setattachment (void) for (i = 0;i < model->data_overridetagnamesforskin[(unsigned int)tagentity->v->skin].num_overridetagnames;i++) if (!strcmp(tagname, model->data_overridetagnamesforskin[(unsigned int)tagentity->v->skin].data_overridetagnames[i].name)) v->_float = i + 1; + // FIXME: use a model function to get tag info (need to handle skeletal) if (v->_float == 0 && model->alias.aliasnum_tags) for (i = 0;i < model->alias.aliasnum_tags;i++) if (!strcmp(tagname, model->alias.aliasdata_tags[i].name)) @@ -3042,6 +3130,178 @@ void PF_setattachment (void) } +///////////////////////////////////////// +// DP_QC_FS_SEARCH extension + +// qc fs search handling +#define MAX_SEARCHES 128 + +fssearch_t *pr_fssearchlist[MAX_SEARCHES]; + +void PR_Search_Init(void) +{ + memset(pr_fssearchlist,0,sizeof(pr_fssearchlist)); +} + +void PR_Search_Reset(void) +{ + int i; + // reset the fssearch list + for(i = 0; i < MAX_SEARCHES; i++) + if(pr_fssearchlist[i]) + FS_FreeSearch(pr_fssearchlist[i]); + memset(pr_fssearchlist,0,sizeof(pr_fssearchlist)); +} + +/* +========= +PF_search_begin + +float search_begin(string pattern, float caseinsensitive, float quiet) +========= +*/ +void PF_search_begin(void) +{ + int handle; + char *pattern; + int caseinsens, quiet; + + pattern = G_STRING(OFS_PARM0); + + PR_CheckEmptyString(pattern); + + caseinsens = G_FLOAT(OFS_PARM1); + quiet = G_FLOAT(OFS_PARM2); + + for(handle = 0; handle < MAX_SEARCHES; handle++) + if(!pr_fssearchlist[handle]) + break; + + if(handle >= MAX_SEARCHES) + { + Con_Printf("PR_search_begin: ran out of search handles (%i)\n", MAX_SEARCHES); + G_FLOAT(OFS_RETURN) = -2; + return; + } + + if(!(pr_fssearchlist[handle] = FS_Search(pattern,caseinsens, quiet))) + G_FLOAT(OFS_RETURN) = -1; + else + G_FLOAT(OFS_RETURN) = handle; +} + +/* +========= +VM_search_end + +void search_end(float handle) +========= +*/ +void PF_search_end(void) +{ + int handle; + + handle = G_FLOAT(OFS_PARM0); + + if(handle < 0 || handle >= MAX_SEARCHES) + { + Con_Printf("PF_search_end: invalid handle %i\n", handle); + return; + } + if(pr_fssearchlist[handle] == NULL) + { + Con_Printf("PF_search_end: no such handle %i\n", handle); + return; + } + + FS_FreeSearch(pr_fssearchlist[handle]); + pr_fssearchlist[handle] = NULL; +} + +/* +========= +VM_search_getsize + +float search_getsize(float handle) +========= +*/ +void PF_search_getsize(void) +{ + int handle; + + handle = G_FLOAT(OFS_PARM0); + + if(handle < 0 || handle >= MAX_SEARCHES) + { + Con_Printf("PF_search_getsize: invalid handle %i\n", handle); + return; + } + if(pr_fssearchlist[handle] == NULL) + { + Con_Printf("PF_search_getsize: no such handle %i\n", handle); + return; + } + + G_FLOAT(OFS_RETURN) = pr_fssearchlist[handle]->numfilenames; +} + +/* +========= +VM_search_getfilename + +string search_getfilename(float handle, float num) +========= +*/ +void PF_search_getfilename(void) +{ + int handle, filenum; + char *tmp; + + handle = G_FLOAT(OFS_PARM0); + filenum = G_FLOAT(OFS_PARM1); + + if(handle < 0 || handle >= MAX_SEARCHES) + { + Con_Printf("PF_search_getfilename: invalid handle %i\n", handle); + return; + } + if(pr_fssearchlist[handle] == NULL) + { + Con_Printf("PF_search_getfilename: no such handle %i\n", handle); + return; + } + if(filenum < 0 || filenum >= pr_fssearchlist[handle]->numfilenames) + { + Con_Printf("PF_search_getfilename: invalid filenum %i\n", filenum); + return; + } + + tmp = PR_GetTempString(); + strcpy(tmp, pr_fssearchlist[handle]->filenames[filenum]); + + G_INT(OFS_RETURN) = PR_SetString(tmp); +} + +void PF_cvar_string (void) +{ + char *str; + cvar_t *var; + char *tmp; + + str = G_STRING(OFS_PARM0); + var = Cvar_FindVar (str); + if (var) + { + tmp = PR_GetTempString(); + strcpy(tmp, var->string); + } + else + tmp = ""; + G_INT(OFS_RETURN) = PR_SetString(tmp); +} + + + builtin_t pr_builtin[] = { NULL, // #0 @@ -3195,7 +3455,7 @@ PF_te_wizspike, // #423 void(vector org) te_wizspike (DP_TE_STANDARDEFFECTBUI PF_te_knightspike, // #424 void(vector org) te_knightspike (DP_TE_STANDARDEFFECTBUILTINS) PF_te_lavasplash, // #425 void(vector org) te_lavasplash (DP_TE_STANDARDEFFECTBUILTINS) PF_te_teleport, // #426 void(vector org) te_teleport (DP_TE_STANDARDEFFECTBUILTINS) -PF_te_explosion2, // #427 void(vector org, float color) te_explosion2 (DP_TE_STANDARDEFFECTBUILTINS) +PF_te_explosion2, // #427 void(vector org, float colorstart, float colorlength) te_explosion2 (DP_TE_STANDARDEFFECTBUILTINS) PF_te_lightning1, // #428 void(entity own, vector start, vector end) te_lightning1 (DP_TE_STANDARDEFFECTBUILTINS) PF_te_lightning2, // #429 void(entity own, vector start, vector end) te_lightning2 (DP_TE_STANDARDEFFECTBUILTINS) PF_te_lightning3, // #430 void(entity own, vector start, vector end) te_lightning3 (DP_TE_STANDARDEFFECTBUILTINS) @@ -3212,13 +3472,23 @@ PF_clientcommand, // #440 void(entity e, string s) clientcommand (KRIMZON_SV_P PF_tokenize, // #441 float(string s) tokenize (KRIMZON_SV_PARSECLIENTCOMMAND) PF_argv, // #442 string(float n) argv (KRIMZON_SV_PARSECLIENTCOMMAND) PF_setattachment, // #443 void(entity e, entity tagentity, string tagname) setattachment (DP_GFX_QUAKE3MODELTAGS) -NULL, // #444 -NULL, // #445 -NULL, // #446 -NULL, // #447 -NULL, // #448 -NULL, // #449 -a a a a a // #450-499 (LordHavoc) +PF_search_begin, // #444 +PF_search_end, // #445 +PF_search_getsize, // #446 +PF_search_getfilename, // #447 +PF_cvar_string, // #448 string(string s) cvar_string (DP_QC_CVAR_STRING) +PF_findflags, // #449 entity(entity start, .float fld, float match) findflags (DP_QC_FINDFLAGS) +PF_findchainflags, // #450 entity(.float fld, float match) findchainflags (DP_QC_FINDCHAINFLAGS) +NULL, // #451 +NULL, // #452 +NULL, // #453 +NULL, // #454 +NULL, // #455 +NULL, // #456 +NULL, // #457 +NULL, // #458 +NULL, // #459 +a a a a // #460-499 (LordHavoc) }; builtin_t *pr_builtins = pr_builtin; @@ -3226,13 +3496,15 @@ int pr_numbuiltins = sizeof(pr_builtin)/sizeof(pr_builtin[0]); void PR_Cmd_Init(void) { - pr_strings_mempool = Mem_AllocPool("pr_stringszone"); + pr_strings_mempool = Mem_AllocPool("pr_stringszone", 0, NULL); PR_Files_Init(); + PR_Search_Init(); } void PR_Cmd_Reset(void) { Mem_EmptyPool(pr_strings_mempool); + PR_Search_Reset(); PR_Files_CloseAll(); }