X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=pr_cmds.c;h=cb472514f9ed077578d9bc82533185963a2f0a33;hb=50179cc6a7fa538adf02e37077776a556e6ba63e;hp=74872ab17a909a87031617684cc99b0e1a2d5a29;hpb=1d7d32f43a3f0e4cb3f20e7a16c93c0cc7da6b98;p=xonotic%2Fdarkplaces.git diff --git a/pr_cmds.c b/pr_cmds.c index 74872ab1..cb472514 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) /* @@ -74,6 +76,7 @@ char *ENGINE_EXTENSIONS = "DP_EF_FLAME " "DP_EF_FULLBRIGHT " "DP_EF_NODRAW " +"DP_EF_NOSHADOW " "DP_EF_RED " "DP_EF_STARDUST " "DP_ENT_ALPHA " @@ -123,6 +126,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 " @@ -143,6 +147,7 @@ char *ENGINE_EXTENSIONS = "KRIMZON_SV_PARSECLIENTCOMMAND " "NEH_CMD_PLAY2 " "NEH_RESTOREGAME " +"TENEBRAE_GFX_DLIGHTS " "TW_SV_STEPCONTROL " ; @@ -197,11 +202,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"); } /* @@ -220,9 +225,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); } @@ -270,9 +275,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); @@ -285,7 +290,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); @@ -312,9 +317,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); @@ -337,9 +342,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 @@ -348,7 +353,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); @@ -375,7 +380,7 @@ void PF_bprint (void) { char string[STRINGTEMP_LENGTH]; PF_VarString(0, string, sizeof(string)); - SV_BroadcastPrintf("%s", string); + SV_BroadcastPrint(string); } /* @@ -397,7 +402,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; } @@ -429,7 +434,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; } @@ -633,7 +638,7 @@ void PF_ambientsound (void) if (!*check) { - Con_Printf ("no precache: %s\n", samp); + Con_Printf("no precache: %s\n", samp); return; } @@ -691,13 +696,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); } @@ -711,7 +716,7 @@ break() */ void PF_break (void) { - Host_Error ("break statement"); + PF_ERROR("break: break statement\n"); } /* @@ -729,17 +734,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; @@ -773,7 +778,7 @@ void PF_tracebox (void) { float *v1, *v2, *m1, *m2; trace_t trace; - int nomonsters; + int move; edict_t *ent; pr_xfunction->builtinsprofile += 30; @@ -782,10 +787,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; @@ -812,7 +817,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); @@ -962,7 +967,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); @@ -1071,7 +1076,7 @@ void PF_dprint (void) if (developer.integer) { PF_VarString(0, string, sizeof(string)); - Con_Printf("%s",string); + Con_Print(string); } } @@ -1127,12 +1132,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); } @@ -1272,7 +1277,7 @@ void PF_findchainfloat (void) void PR_CheckEmptyString (char *s) { if (s[0] <= ' ') - Host_Error ("Bad string"); + PF_ERROR("Bad string"); } void PF_precache_file (void) @@ -1286,7 +1291,7 @@ void PF_precache_sound (void) int i; 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); @@ -1302,7 +1307,7 @@ void PF_precache_sound (void) if (!strcmp(sv.sound_precache[i], s)) return; } - Host_Error ("PF_precache_sound: overflow"); + PF_ERROR("PF_precache_sound: overflow"); } void PF_precache_model (void) @@ -1311,7 +1316,7 @@ void PF_precache_model (void) int i; 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); if (sv.worldmodel->brush.ishlbsp && ((!s) || (!s[0]))) @@ -1330,7 +1335,7 @@ void PF_precache_model (void) if (!strcmp(sv.model_precache[i], s)) return; } - Host_Error ("PF_precache_model: overflow"); + PF_ERROR("PF_precache_model: overflow"); } @@ -1369,19 +1374,19 @@ void PF_walkmove (void) mfunction_t *oldf; int oldself; + // 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("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; @@ -1414,20 +1419,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); @@ -1561,11 +1567,14 @@ void PF_aim (void) float dist, bestdist; float speed; + // assume failure if it returns early + VectorClear(G_VECTOR(OFS_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); @@ -1643,9 +1652,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; @@ -1690,22 +1699,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; } @@ -1775,7 +1784,7 @@ sizebuf_t *WriteDest (void) return &sv.signon; default: - Host_Error ("WriteDest: bad destination"); + Host_Error("WriteDest: bad destination"); break; } @@ -1832,9 +1841,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) @@ -1882,7 +1891,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; } @@ -1990,12 +1999,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); + PF_ERROR("PF_registercvar: ran out of cvar slots\n"); // copy the name and value variable = &qc_cvar[currentqc_cvar++]; @@ -2033,7 +2042,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"); + } } /* @@ -2060,7 +2072,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"); + } } /* @@ -2105,14 +2120,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); } @@ -2136,7 +2151,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; } @@ -2164,7 +2179,7 @@ void PF_effect (void) 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)); } @@ -2945,7 +2960,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; } @@ -2957,30 +2972,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; @@ -3008,9 +3019,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;