1cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 2cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichCopyright (C) 1996-1997 Id Software, Inc. 3cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 4cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichThis program is free software; you can redistribute it and/or 5cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichmodify it under the terms of the GNU General Public License 6cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichas published by the Free Software Foundation; either version 2 7cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichof the License, or (at your option) any later version. 8cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 9cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichThis program is distributed in the hope that it will be useful, 10cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichbut WITHOUT ANY WARRANTY; without even the implied warranty of 11cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 12cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 13cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichSee the GNU General Public License for more details. 14cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 15cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichYou should have received a copy of the GNU General Public License 16cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichalong with this program; if not, write to the Free Software 17cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichFoundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 18cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 19cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 20cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 21cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#include "quakedef.h" 22cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 23cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#define RETURN_EDICT(e) (((int *)pr_globals)[OFS_RETURN] = EDICT_TO_PROG(e)) 24cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 25cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 26cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich=============================================================================== 27cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 28cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich BUILT-IN FUNCTIONS 29cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 30cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich=============================================================================== 31cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 32cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 33cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichchar *PF_VarString (int first) 34cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 35cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int i; 36cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich static char out[256]; 37cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 38cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich out[0] = 0; 39cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (i=first ; i<pr_argc ; i++) 40cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 41cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich strcat (out, G_STRING((OFS_PARM0+i*3))); 42cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 43cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return out; 44cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 45cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 46cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 47cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 48cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================= 49cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_errror 50cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 51cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichThis is a TERMINAL error, which will kill off the entire server. 52cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichDumps self. 53cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 54cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevicherror(value) 55cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================= 56cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 57cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_error (void) 58cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 59cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich char *s; 60cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich edict_t *ed; 61cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 62cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich s = PF_VarString(0); 63cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Con_Printf ("======SERVER ERROR in %s:\n%s\n" 64cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich ,pr_strings + pr_xfunction->s_name,s); 65cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich ed = PROG_TO_EDICT(pr_global_struct->self); 66cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich ED_Print (ed); 67cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 68cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Host_Error ("Program error"); 69cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 70cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 71cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 72cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================= 73cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_objerror 74cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 75cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichDumps out self, then an error message. The program is aborted and self is 76cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichremoved, but the level can continue. 77cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 78cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichobjerror(value) 79cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================= 80cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 81cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_objerror (void) 82cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 83cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich char *s; 84cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich edict_t *ed; 85cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 86cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich s = PF_VarString(0); 87cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Con_Printf ("======OBJECT ERROR in %s:\n%s\n" 88cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich ,pr_strings + pr_xfunction->s_name,s); 89cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich ed = PROG_TO_EDICT(pr_global_struct->self); 90cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich ED_Print (ed); 91cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich ED_Free (ed); 92cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 93cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Host_Error ("Program error"); 94cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 95cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 96cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 97cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 98cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 99cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============== 100cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_makevectors 101cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 102cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichWrites new values for v_forward, v_up, and v_right based on angles 103cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichmakevectors(vector) 104cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============== 105cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 106cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_makevectors (void) 107cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 108cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich AngleVectors (G_VECTOR(OFS_PARM0), pr_global_struct->v_forward, pr_global_struct->v_right, pr_global_struct->v_up); 109cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 110cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 111cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 112cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================= 113cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_setorigin 114cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 115cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichThis is the only valid way to move an object without using the physics of the world (setting velocity and waiting). Directly changing origin will not set internal links correctly, so clipping would be messed up. This should be called when an object is spawned, and then only if it is teleported. 116cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 117cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichsetorigin (entity, origin) 118cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================= 119cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 120cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_setorigin (void) 121cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 122cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich edict_t *e; 123cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float *org; 124cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 125cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich e = G_EDICT(OFS_PARM0); 126cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich org = G_VECTOR(OFS_PARM1); 127cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VectorCopy (org, e->u.v.origin); 128cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich SV_LinkEdict (e, false); 129cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 130cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 131cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 132cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid SetMinMaxSize (edict_t *e, float *min, float *max, qboolean rotate) 133cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 134cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float *angles; 135cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vec3_t rmin, rmax; 136cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float bounds[2][3]; 137cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float xvector[2], yvector[2]; 138cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float a; 139cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vec3_t base, transformed; 140cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int i, j, k, l; 141cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 142cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (i=0 ; i<3 ; i++) 143cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (min[i] > max[i]) 144cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich PR_RunError ("backwards mins/maxs"); 145cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 146cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich rotate = false; // FIXME: implement rotation properly again 147cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 148cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (!rotate) 149cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 150cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VectorCopy (min, rmin); 151cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VectorCopy (max, rmax); 152cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 153cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 154cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 155cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich // find min / max for rotations 156cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich angles = e->u.v.angles; 157cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 158cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich a = angles[1]/180 * M_PI; 159cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 160cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich xvector[0] = cos(a); 161cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich xvector[1] = sin(a); 162cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich yvector[0] = -sin(a); 163cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich yvector[1] = cos(a); 164cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 165cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VectorCopy (min, bounds[0]); 166cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VectorCopy (max, bounds[1]); 167cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 168cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich rmin[0] = rmin[1] = rmin[2] = 9999; 169cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich rmax[0] = rmax[1] = rmax[2] = -9999; 170cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 171cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (i=0 ; i<= 1 ; i++) 172cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 173cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich base[0] = bounds[i][0]; 174cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (j=0 ; j<= 1 ; j++) 175cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 176cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich base[1] = bounds[j][1]; 177cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (k=0 ; k<= 1 ; k++) 178cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 179cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich base[2] = bounds[k][2]; 180cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 181cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich // transform the point 182cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich transformed[0] = xvector[0]*base[0] + yvector[0]*base[1]; 183cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich transformed[1] = xvector[1]*base[0] + yvector[1]*base[1]; 184cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich transformed[2] = base[2]; 185cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 186cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (l=0 ; l<3 ; l++) 187cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 188cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (transformed[l] < rmin[l]) 189cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich rmin[l] = transformed[l]; 190cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (transformed[l] > rmax[l]) 191cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich rmax[l] = transformed[l]; 192cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 193cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 194cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 195cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 196cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 197cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 198cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// set derived values 199cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VectorCopy (rmin, e->u.v.mins); 200cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VectorCopy (rmax, e->u.v.maxs); 201cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VectorSubtract (max, min, e->u.v.size); 202cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 203cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich SV_LinkEdict (e, false); 204cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 205cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 206cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 207cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================= 208cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_setsize 209cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 210cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichthe size box is rotated by the current angle 211cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 212cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichsetsize (entity, minvector, maxvector) 213cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================= 214cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 215cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_setsize (void) 216cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 217cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich edict_t *e; 218cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float *min, *max; 219cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 220cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich e = G_EDICT(OFS_PARM0); 221cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich min = G_VECTOR(OFS_PARM1); 222cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich max = G_VECTOR(OFS_PARM2); 223cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich SetMinMaxSize (e, min, max, false); 224cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 225cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 226cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 227cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 228cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================= 229cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_setmodel 230cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 231cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichsetmodel(entity, model) 232cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================= 233cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 234cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_setmodel (void) 235cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 236cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich edict_t *e; 237cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich char *m, **check; 238cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich model_t *mod; 239cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int i; 240cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 241cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich e = G_EDICT(OFS_PARM0); 242cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich m = G_STRING(OFS_PARM1); 243cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 244cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// check to see if model was properly precached 245cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (i=0, check = sv.model_precache ; *check ; i++, check++) 246cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (!strcmp(*check, m)) 247cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich break; 248cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 249cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (!*check) 250cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich PR_RunError ("no precache: %s\n", m); 251cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 252cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 253cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich e->u.v.model = m - pr_strings; 254cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich e->u.v.modelindex = i; //SV_ModelIndex (m); 255cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 256cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich mod = sv.models[ (int)e->u.v.modelindex]; // Mod_ForName (m, true); 257cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 258cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (mod) 259cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich SetMinMaxSize (e, mod->mins, mod->maxs, true); 260cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 261cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich SetMinMaxSize (e, vec3_origin, vec3_origin, true); 262cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 263cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 264cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 265cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================= 266cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_bprint 267cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 268cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichbroadcast print to everyone on server 269cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 270cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichbprint(value) 271cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================= 272cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 273cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_bprint (void) 274cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 275cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich char *s; 276cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 277cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich s = PF_VarString(0); 278cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich SV_BroadcastPrintf ("%s", s); 279cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 280cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 281cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 282cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================= 283cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_sprint 284cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 285cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichsingle print to a specific client 286cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 287cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichsprint(clientent, value) 288cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================= 289cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 290cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_sprint (void) 291cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 292cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich char *s; 293cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich client_t *client; 294cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int entnum; 295cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 296cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich entnum = G_EDICTNUM(OFS_PARM0); 297cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich s = PF_VarString(1); 298cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 299cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (entnum < 1 || entnum > svs.maxclients) 300cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 301cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Con_Printf ("tried to sprint to a non-client\n"); 302cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return; 303cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 304cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 305cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich client = &svs.clients[entnum-1]; 306cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 307cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich MSG_WriteChar (&client->message,svc_print); 308cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich MSG_WriteString (&client->message, s ); 309cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 310cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 311cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 312cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 313cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================= 314cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_centerprint 315cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 316cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichsingle print to a specific client 317cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 318cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcenterprint(clientent, value) 319cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================= 320cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 321cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_centerprint (void) 322cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 323cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich char *s; 324cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich client_t *client; 325cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int entnum; 326cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 327cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich entnum = G_EDICTNUM(OFS_PARM0); 328cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich s = PF_VarString(1); 329cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 330cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (entnum < 1 || entnum > svs.maxclients) 331cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 332cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Con_Printf ("tried to sprint to a non-client\n"); 333cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return; 334cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 335cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 336cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich client = &svs.clients[entnum-1]; 337cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 338cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich MSG_WriteChar (&client->message,svc_centerprint); 339cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich MSG_WriteString (&client->message, s ); 340cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 341cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 342cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 343cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 344cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================= 345cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_normalize 346cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 347cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvector normalize(vector) 348cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================= 349cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 350cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_normalize (void) 351cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 352cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float *value1; 353cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vec3_t newvalue; 354cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float temp; 355cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 356cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich value1 = G_VECTOR(OFS_PARM0); 357cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 358cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich temp = value1[0] * value1[0] + value1[1] * value1[1] + value1[2]*value1[2]; 359cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich temp = sqrt(temp); 360cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 361cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (temp == 0) 362cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich newvalue[0] = newvalue[1] = newvalue[2] = 0; 363cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 364cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 365cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich temp = 1/temp; 366cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich newvalue[0] = value1[0] * temp; 367cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich newvalue[1] = value1[1] * temp; 368cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich newvalue[2] = value1[2] * temp; 369cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 370cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 371cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VectorCopy (newvalue, G_VECTOR(OFS_RETURN)); 372cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 373cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 374cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 375cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================= 376cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_vlen 377cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 378cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichscalar vlen(vector) 379cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================= 380cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 381cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_vlen (void) 382cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 383cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float *value1; 384cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float temp; 385cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 386cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich value1 = G_VECTOR(OFS_PARM0); 387cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 388cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich temp = value1[0] * value1[0] + value1[1] * value1[1] + value1[2]*value1[2]; 389cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich temp = sqrt(temp); 390cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 391cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich G_FLOAT(OFS_RETURN) = temp; 392cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 393cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 394cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 395cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================= 396cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_vectoyaw 397cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 398cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichfloat vectoyaw(vector) 399cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================= 400cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 401cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_vectoyaw (void) 402cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 403cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float *value1; 404cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float yaw; 405cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 406cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich value1 = G_VECTOR(OFS_PARM0); 407cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 408cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (value1[1] == 0 && value1[0] == 0) 409cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich yaw = 0; 410cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 411cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 412cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich yaw = (int) (atan2(value1[1], value1[0]) * 180 / M_PI); 413cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (yaw < 0) 414cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich yaw += 360; 415cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 416cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 417cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich G_FLOAT(OFS_RETURN) = yaw; 418cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 419cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 420cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 421cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 422cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================= 423cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_vectoangles 424cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 425cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvector vectoangles(vector) 426cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================= 427cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 428cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_vectoangles (void) 429cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 430cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float *value1; 431cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float forward; 432cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float yaw, pitch; 433cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 434cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich value1 = G_VECTOR(OFS_PARM0); 435cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 436cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (value1[1] == 0 && value1[0] == 0) 437cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 438cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich yaw = 0; 439cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (value1[2] > 0) 440cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich pitch = 90; 441cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 442cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich pitch = 270; 443cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 444cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 445cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 446cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich yaw = (int) (atan2(value1[1], value1[0]) * 180 / M_PI); 447cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (yaw < 0) 448cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich yaw += 360; 449cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 450cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich forward = sqrt (value1[0]*value1[0] + value1[1]*value1[1]); 451cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich pitch = (int) (atan2(value1[2], forward) * 180 / M_PI); 452cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (pitch < 0) 453cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich pitch += 360; 454cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 455cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 456cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich G_FLOAT(OFS_RETURN+0) = pitch; 457cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich G_FLOAT(OFS_RETURN+1) = yaw; 458cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich G_FLOAT(OFS_RETURN+2) = 0; 459cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 460cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 461cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 462cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================= 463cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_Random 464cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 465cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichReturns a number from 0<= num < 1 466cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 467cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichrandom() 468cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================= 469cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 470cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_random (void) 471cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 472cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float num; 473cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 474cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich num = (rand ()&0x7fff) / ((float)0x7fff); 475cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 476cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich G_FLOAT(OFS_RETURN) = num; 477cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 478cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 479cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 480cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================= 481cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_particle 482cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 483cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichparticle(origin, color, count) 484cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================= 485cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 486cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_particle (void) 487cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 488cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float *org, *dir; 489cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float color; 490cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float count; 491cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 492cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich org = G_VECTOR(OFS_PARM0); 493cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich dir = G_VECTOR(OFS_PARM1); 494cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich color = G_FLOAT(OFS_PARM2); 495cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich count = G_FLOAT(OFS_PARM3); 496cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich SV_StartParticle (org, dir, (int) color, (int) count); 497cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 498cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 499cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 500cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 501cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================= 502cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_ambientsound 503cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 504cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================= 505cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 506cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_ambientsound (void) 507cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 508cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich char **check; 509cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich char *samp; 510cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float *pos; 511cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float vol, attenuation; 512cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int i, soundnum; 513cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 514cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich pos = G_VECTOR (OFS_PARM0); 515cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich samp = G_STRING(OFS_PARM1); 516cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vol = G_FLOAT(OFS_PARM2); 517cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich attenuation = G_FLOAT(OFS_PARM3); 518cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 519cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// check to see if samp was properly precached 520cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (soundnum=0, check = sv.sound_precache ; *check ; check++, soundnum++) 521cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (!strcmp(*check,samp)) 522cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich break; 523cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 524cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (!*check) 525cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 526cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Con_Printf ("no precache: %s\n", samp); 527cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return; 528cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 529cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 530cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// add an svc_spawnambient command to the level signon packet 531cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 532cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich MSG_WriteByte (&sv.signon,svc_spawnstaticsound); 533cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (i=0 ; i<3 ; i++) 534cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich MSG_WriteCoord(&sv.signon, pos[i]); 535cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 536cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich MSG_WriteByte (&sv.signon, soundnum); 537cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 538cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich MSG_WriteByte (&sv.signon, (int) (vol*255)); 539cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich MSG_WriteByte (&sv.signon, (int) (attenuation*64)); 540cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 541cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 542cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 543cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 544cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================= 545cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_sound 546cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 547cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichEach entity can have eight independant sound sources, like voice, 548cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichweapon, feet, etc. 549cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 550cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichChannel 0 is an auto-allocate channel, the others override anything 551cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichallready running on that entity/channel pair. 552cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 553cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichAn attenuation of 0 will play full volume everywhere in the level. 554cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichLarger attenuations will drop off. 555cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 556cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================= 557cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 558cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_sound (void) 559cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 560cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich char *sample; 561cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int channel; 562cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich edict_t *entity; 563cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int volume; 564cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float attenuation; 565cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 566cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich entity = G_EDICT(OFS_PARM0); 567cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich channel = (int) G_FLOAT(OFS_PARM1); 568cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich sample = G_STRING(OFS_PARM2); 569cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich volume = (int)(G_FLOAT(OFS_PARM3) * 255); 570cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich attenuation = G_FLOAT(OFS_PARM4); 571cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 572cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (volume < 0 || volume > 255) 573cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Sys_Error ("SV_StartSound: volume = %i", volume); 574cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 575cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (attenuation < 0 || attenuation > 4) 576cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Sys_Error ("SV_StartSound: attenuation = %f", attenuation); 577cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 578cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (channel < 0 || channel > 7) 579cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Sys_Error ("SV_StartSound: channel = %i", channel); 580cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 581cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich SV_StartSound (entity, channel, sample, volume, attenuation); 582cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 583cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 584cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 585cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================= 586cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_break 587cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 588cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichbreak() 589cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================= 590cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 591cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_break (void) 592cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 593cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichCon_Printf ("break statement\n"); 594cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*(int *)-4 = 0; // dump to debugger 595cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// PR_RunError ("break statement"); 596cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 597cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 598cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 599cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================= 600cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_traceline 601cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 602cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichUsed for use tracing and shot targeting 603cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichTraces are blocked by bbox and exact bsp entityes, and also slide box entities 604cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichif the tryents flag is set. 605cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 606cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichtraceline (vector1, vector2, tryents) 607cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================= 608cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 609cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_traceline (void) 610cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 611cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float *v1, *v2; 612cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich trace_t trace; 613cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int nomonsters; 614cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich edict_t *ent; 615cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 616cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich v1 = G_VECTOR(OFS_PARM0); 617cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich v2 = G_VECTOR(OFS_PARM1); 618cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich nomonsters = (int) G_FLOAT(OFS_PARM2); 619cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich ent = G_EDICT(OFS_PARM3); 620cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 621cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich trace = SV_Move (v1, vec3_origin, vec3_origin, v2, nomonsters, ent); 622cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 623cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich pr_global_struct->trace_allsolid = trace.allsolid; 624cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich pr_global_struct->trace_startsolid = trace.startsolid; 625cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich pr_global_struct->trace_fraction = trace.fraction; 626cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich pr_global_struct->trace_inwater = trace.inwater; 627cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich pr_global_struct->trace_inopen = trace.inopen; 628cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VectorCopy (trace.endpos, pr_global_struct->trace_endpos); 629cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VectorCopy (trace.plane.normal, pr_global_struct->trace_plane_normal); 630cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich pr_global_struct->trace_plane_dist = trace.plane.dist; 631cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (trace.ent) 632cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich pr_global_struct->trace_ent = EDICT_TO_PROG(trace.ent); 633cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 634cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich pr_global_struct->trace_ent = EDICT_TO_PROG(sv.edicts); 635cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 636cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 637cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 638cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#ifdef QUAKE2 639cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichextern trace_t SV_Trace_Toss (edict_t *ent, edict_t *ignore); 640cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 641cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_TraceToss (void) 642cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 643cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich trace_t trace; 644cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich edict_t *ent; 645cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich edict_t *ignore; 646cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 647cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich ent = G_EDICT(OFS_PARM0); 648cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich ignore = G_EDICT(OFS_PARM1); 649cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 650cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich trace = SV_Trace_Toss (ent, ignore); 651cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 652cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich pr_global_struct->trace_allsolid = trace.allsolid; 653cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich pr_global_struct->trace_startsolid = trace.startsolid; 654cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich pr_global_struct->trace_fraction = trace.fraction; 655cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich pr_global_struct->trace_inwater = trace.inwater; 656cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich pr_global_struct->trace_inopen = trace.inopen; 657cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VectorCopy (trace.endpos, pr_global_struct->trace_endpos); 658cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VectorCopy (trace.plane.normal, pr_global_struct->trace_plane_normal); 659cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich pr_global_struct->trace_plane_dist = trace.plane.dist; 660cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (trace.ent) 661cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich pr_global_struct->trace_ent = EDICT_TO_PROG(trace.ent); 662cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 663cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich pr_global_struct->trace_ent = EDICT_TO_PROG(sv.edicts); 664cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 665cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#endif 666cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 667cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 668cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 669cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================= 670cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_checkpos 671cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 672cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichReturns true if the given entity can move to the given position from it's 673cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcurrent position by walking or rolling. 674cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichFIXME: make work... 675cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichscalar checkpos (entity, vector) 676cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================= 677cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 678cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_checkpos (void) 679cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 680cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 681cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 682cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich//============================================================================ 683cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 684cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichbyte checkpvs[MAX_MAP_LEAFS/8]; 685cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 686cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint PF_newcheckclient (int check) 687cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 688cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int i; 689cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich byte *pvs; 690cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich edict_t *ent; 691cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich mleaf_t *leaf; 692cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vec3_t org; 693cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 694cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// cycle to the next one 695cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 696cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (check < 1) 697cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich check = 1; 698cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (check > svs.maxclients) 699cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich check = svs.maxclients; 700cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 701cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (check == svs.maxclients) 702cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich i = 1; 703cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 704cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich i = check + 1; 705cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 706cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for ( ; ; i++) 707cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 708cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (i == svs.maxclients+1) 709cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich i = 1; 710cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 711cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich ent = EDICT_NUM(i); 712cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 713cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (i == check) 714cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich break; // didn't find anything else 715cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 716cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (ent->free) 717cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich continue; 718cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (ent->u.v.health <= 0) 719cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich continue; 720cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if ((int)ent->u.v.flags & FL_NOTARGET) 721cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich continue; 722cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 723cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich // anything that is a client, or has a client as an enemy 724cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich break; 725cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 726cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 727cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// get the PVS for the entity 728cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VectorAdd (ent->u.v.origin, ent->u.v.view_ofs, org); 729cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich leaf = Mod_PointInLeaf (org, sv.worldmodel); 730cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich pvs = Mod_LeafPVS (leaf, sv.worldmodel); 731cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich memcpy (checkpvs, pvs, (sv.worldmodel->numleafs+7)>>3 ); 732cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 733cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return i; 734cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 735cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 736cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 737cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================= 738cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_checkclient 739cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 740cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichReturns a client (or object that has a client enemy) that would be a 741cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvalid target. 742cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 743cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichIf there are more than one valid options, they are cycled each frame 744cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 745cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichIf (self.origin + self.viewofs) is not in the PVS of the current target, 746cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichit is not returned at all. 747cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 748cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichname checkclient () 749cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================= 750cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 751cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#define MAX_CHECK 16 752cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint c_invis, c_notvis; 753cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_checkclient (void) 754cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 755cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich edict_t *ent, *self; 756cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich mleaf_t *leaf; 757cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int l; 758cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vec3_t view; 759cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 760cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// find a new check if on a new frame 761cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (sv.time - sv.lastchecktime >= 0.1) 762cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 763cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich sv.lastcheck = PF_newcheckclient (sv.lastcheck); 764cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich sv.lastchecktime = sv.time; 765cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 766cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 767cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// return check if it might be visible 768cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich ent = EDICT_NUM(sv.lastcheck); 769cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (ent->free || ent->u.v.health <= 0) 770cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 771cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich RETURN_EDICT(sv.edicts); 772cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return; 773cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 774cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 775cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// if current entity can't possibly see the check entity, return 0 776cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich self = PROG_TO_EDICT(pr_global_struct->self); 777cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VectorAdd (self->u.v.origin, self->u.v.view_ofs, view); 778cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich leaf = Mod_PointInLeaf (view, sv.worldmodel); 779cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich l = (leaf - sv.worldmodel->leafs) - 1; 780cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if ( (l<0) || !(checkpvs[l>>3] & (1<<(l&7)) ) ) 781cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 782cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichc_notvis++; 783cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich RETURN_EDICT(sv.edicts); 784cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return; 785cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 786cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 787cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// might be able to see it 788cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichc_invis++; 789cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich RETURN_EDICT(ent); 790cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 791cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 792cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich//============================================================================ 793cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 794cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 795cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 796cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================= 797cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_stuffcmd 798cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 799cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichSends text over to the client's execution buffer 800cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 801cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichstuffcmd (clientent, value) 802cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================= 803cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 804cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_stuffcmd (void) 805cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 806cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int entnum; 807cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich char *str; 808cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich client_t *old; 809cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 810cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich entnum = G_EDICTNUM(OFS_PARM0); 811cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (entnum < 1 || entnum > svs.maxclients) 812cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich PR_RunError ("Parm 0 not a client"); 813cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich str = G_STRING(OFS_PARM1); 814cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 815cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich old = host_client; 816cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich host_client = &svs.clients[entnum-1]; 817cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Host_ClientCommands ("%s", str); 818cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich host_client = old; 819cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 820cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 821cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 822cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================= 823cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_localcmd 824cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 825cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichSends text over to the client's execution buffer 826cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 827cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichlocalcmd (string) 828cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================= 829cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 830cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_localcmd (void) 831cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 832cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich char *str; 833cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 834cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich str = G_STRING(OFS_PARM0); 835cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Cbuf_AddText (str); 836cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 837cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 838cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 839cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================= 840cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_cvar 841cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 842cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichfloat cvar (string) 843cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================= 844cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 845cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_cvar (void) 846cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 847cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich char *str; 848cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 849cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich str = G_STRING(OFS_PARM0); 850cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 851cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich G_FLOAT(OFS_RETURN) = Cvar_VariableValue (str); 852cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 853cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 854cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 855cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================= 856cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_cvar_set 857cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 858cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichfloat cvar (string) 859cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================= 860cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 861cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_cvar_set (void) 862cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 863cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich char *var, *val; 864cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 865cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich var = G_STRING(OFS_PARM0); 866cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich val = G_STRING(OFS_PARM1); 867cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 868cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Cvar_Set (var, val); 869cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 870cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 871cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 872cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================= 873cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_findradius 874cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 875cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichReturns a chain of entities that have origins within a spherical area 876cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 877cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichfindradius (origin, radius) 878cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================= 879cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 880cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_findradius (void) 881cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 882cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich edict_t *ent, *chain; 883cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float rad; 884cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float *org; 885cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vec3_t eorg; 886cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int i, j; 887cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 888cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich chain = (edict_t *)sv.edicts; 889cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 890cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich org = G_VECTOR(OFS_PARM0); 891cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich rad = G_FLOAT(OFS_PARM1); 892cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 893cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich ent = NEXT_EDICT(sv.edicts); 894cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (i=1 ; i<sv.num_edicts ; i++, ent = NEXT_EDICT(ent)) 895cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 896cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (ent->free) 897cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich continue; 898cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (ent->u.v.solid == SOLID_NOT) 899cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich continue; 900cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (j=0 ; j<3 ; j++) 901cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich eorg[j] = org[j] - (ent->u.v.origin[j] + (ent->u.v.mins[j] + ent->u.v.maxs[j])*0.5); 902cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (Length(eorg) > rad) 903cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich continue; 904cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 905cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich ent->u.v.chain = EDICT_TO_PROG(chain); 906cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich chain = ent; 907cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 908cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 909cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich RETURN_EDICT(chain); 910cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 911cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 912cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 913cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 914cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich========= 915cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_dprint 916cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich========= 917cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 918cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_dprint (void) 919cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 920cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Con_DPrintf ("%s",PF_VarString(0)); 921cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 922cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 923cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichchar pr_string_temp[128]; 924cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 925cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_ftos (void) 926cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 927cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float v; 928cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich v = G_FLOAT(OFS_PARM0); 929cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 930cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (v == (int)v) 931cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich sprintf (pr_string_temp, "%d",(int)v); 932cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 933cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich sprintf (pr_string_temp, "%5.1f",v); 934cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich G_INT(OFS_RETURN) = pr_string_temp - pr_strings; 935cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 936cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 937cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_fabs (void) 938cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 939cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float v; 940cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich v = G_FLOAT(OFS_PARM0); 941cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich G_FLOAT(OFS_RETURN) = fabs(v); 942cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 943cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 944cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_vtos (void) 945cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 946cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich sprintf (pr_string_temp, "'%5.1f %5.1f %5.1f'", G_VECTOR(OFS_PARM0)[0], G_VECTOR(OFS_PARM0)[1], G_VECTOR(OFS_PARM0)[2]); 947cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich G_INT(OFS_RETURN) = pr_string_temp - pr_strings; 948cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 949cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 950cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#ifdef QUAKE2 951cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_etos (void) 952cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 953cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich sprintf (pr_string_temp, "entity %i", G_EDICTNUM(OFS_PARM0)); 954cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich G_INT(OFS_RETURN) = pr_string_temp - pr_strings; 955cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 956cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#endif 957cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 958cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_Spawn (void) 959cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 960cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich edict_t *ed; 961cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich ed = ED_Alloc(); 962cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich RETURN_EDICT(ed); 963cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 964cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 965cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_Remove (void) 966cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 967cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich edict_t *ed; 968cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 969cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich ed = G_EDICT(OFS_PARM0); 970cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich ED_Free (ed); 971cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 972cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 973cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 974cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// entity (entity start, .string field, string match) find = #5; 975cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_Find (void) 976cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#ifdef QUAKE2 977cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 978cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int e; 979cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int f; 980cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich char *s, *t; 981cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich edict_t *ed; 982cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich edict_t *first; 983cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich edict_t *second; 984cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich edict_t *last; 985cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 986cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich first = second = last = (edict_t *)sv.edicts; 987cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich e = G_EDICTNUM(OFS_PARM0); 988cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich f = G_INT(OFS_PARM1); 989cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich s = G_STRING(OFS_PARM2); 990cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (!s) 991cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich PR_RunError ("PF_Find: bad search string"); 992cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 993cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (e++ ; e < sv.num_edicts ; e++) 994cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 995cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich ed = EDICT_NUM(e); 996cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (ed->free) 997cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich continue; 998cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich t = E_STRING(ed,f); 999cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (!t) 1000cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich continue; 1001cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (!strcmp(t,s)) 1002cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 1003cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (first == (edict_t *)sv.edicts) 1004cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich first = ed; 1005cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else if (second == (edict_t *)sv.edicts) 1006cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich second = ed; 1007cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich ed->u.v.chain = EDICT_TO_PROG(last); 1008cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich last = ed; 1009cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 1010cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 1011cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1012cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (first != last) 1013cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 1014cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (last != second) 1015cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich first->u.v.chain = last->u.v.chain; 1016cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 1017cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich first->u.v.chain = EDICT_TO_PROG(last); 1018cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich last->u.v.chain = EDICT_TO_PROG((edict_t *)sv.edicts); 1019cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (second && second != last) 1020cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich second->u.v.chain = EDICT_TO_PROG(last); 1021cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 1022cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich RETURN_EDICT(first); 1023cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 1024cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#else 1025cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 1026cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int e; 1027cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int f; 1028cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich char *s, *t; 1029cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich edict_t *ed; 1030cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1031cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich e = G_EDICTNUM(OFS_PARM0); 1032cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich f = G_INT(OFS_PARM1); 1033cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich s = G_STRING(OFS_PARM2); 1034cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (!s) 1035cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich PR_RunError ("PF_Find: bad search string"); 1036cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1037cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (e++ ; e < sv.num_edicts ; e++) 1038cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 1039cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich ed = EDICT_NUM(e); 1040cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (ed->free) 1041cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich continue; 1042cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich t = E_STRING(ed,f); 1043cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (!t) 1044cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich continue; 1045cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (!strcmp(t,s)) 1046cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 1047cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich RETURN_EDICT(ed); 1048cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return; 1049cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 1050cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 1051cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1052cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich RETURN_EDICT(sv.edicts); 1053cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 1054cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#endif 1055cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1056cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PR_CheckEmptyString (char *s) 1057cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 1058cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (s[0] <= ' ') 1059cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich PR_RunError ("Bad string"); 1060cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 1061cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1062cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_precache_file (void) 1063cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ // precache_file is only used to copy files with qcc, it does nothing 1064cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich G_INT(OFS_RETURN) = G_INT(OFS_PARM0); 1065cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 1066cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1067cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_precache_sound (void) 1068cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 1069cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich char *s; 1070cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int i; 1071cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1072cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (sv.state != ss_loading) 1073cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich PR_RunError ("PF_Precache_*: Precache can only be done in spawn functions"); 1074cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1075cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich s = G_STRING(OFS_PARM0); 1076cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich G_INT(OFS_RETURN) = G_INT(OFS_PARM0); 1077cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich PR_CheckEmptyString (s); 1078cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1079cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (i=0 ; i<MAX_SOUNDS ; i++) 1080cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 1081cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (!sv.sound_precache[i]) 1082cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 1083cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich sv.sound_precache[i] = s; 1084cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return; 1085cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 1086cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (!strcmp(sv.sound_precache[i], s)) 1087cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return; 1088cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 1089cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich PR_RunError ("PF_precache_sound: overflow"); 1090cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 1091cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1092cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_precache_model (void) 1093cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 1094cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich char *s; 1095cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int i; 1096cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1097cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (sv.state != ss_loading) 1098cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich PR_RunError ("PF_Precache_*: Precache can only be done in spawn functions"); 1099cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1100cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich s = G_STRING(OFS_PARM0); 1101cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich G_INT(OFS_RETURN) = G_INT(OFS_PARM0); 1102cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich PR_CheckEmptyString (s); 1103cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1104cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (i=0 ; i<MAX_MODELS ; i++) 1105cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 1106cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (!sv.model_precache[i]) 1107cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 1108cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich sv.model_precache[i] = s; 1109cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich sv.models[i] = Mod_ForName (s, true); 1110cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return; 1111cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 1112cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (!strcmp(sv.model_precache[i], s)) 1113cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return; 1114cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 1115cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich PR_RunError ("PF_precache_model: overflow"); 1116cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 1117cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1118cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1119cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_coredump (void) 1120cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 1121cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich ED_PrintEdicts (); 1122cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 1123cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1124cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_traceon (void) 1125cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 1126cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich pr_trace = true; 1127cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 1128cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1129cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_traceoff (void) 1130cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 1131cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich pr_trace = false; 1132cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 1133cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1134cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_eprint (void) 1135cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 1136cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich ED_PrintNum (G_EDICTNUM(OFS_PARM0)); 1137cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 1138cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1139cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 1140cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich=============== 1141cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_walkmove 1142cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1143cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichfloat(float yaw, float dist) walkmove 1144cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich=============== 1145cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 1146cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_walkmove (void) 1147cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 1148cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich edict_t *ent; 1149cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float yaw, dist; 1150cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vec3_t move; 1151cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich dfunction_t *oldf; 1152cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int oldself; 1153cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1154cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich ent = PROG_TO_EDICT(pr_global_struct->self); 1155cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich yaw = G_FLOAT(OFS_PARM0); 1156cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich dist = G_FLOAT(OFS_PARM1); 1157cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1158cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if ( !( (int)ent->u.v.flags & (FL_ONGROUND|FL_FLY|FL_SWIM) ) ) 1159cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 1160cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich G_FLOAT(OFS_RETURN) = 0; 1161cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return; 1162cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 1163cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1164cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich yaw = yaw*M_PI*2 / 360; 1165cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1166cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich move[0] = cos(yaw)*dist; 1167cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich move[1] = sin(yaw)*dist; 1168cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich move[2] = 0; 1169cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1170cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// save program state, because SV_movestep may call other progs 1171cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich oldf = pr_xfunction; 1172cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich oldself = pr_global_struct->self; 1173cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1174cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich G_FLOAT(OFS_RETURN) = SV_movestep(ent, move, true); 1175cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1176cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1177cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// restore program state 1178cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich pr_xfunction = oldf; 1179cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich pr_global_struct->self = oldself; 1180cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 1181cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1182cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 1183cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich=============== 1184cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_droptofloor 1185cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1186cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid() droptofloor 1187cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich=============== 1188cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 1189cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_droptofloor (void) 1190cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 1191cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich edict_t *ent; 1192cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vec3_t end; 1193cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich trace_t trace; 1194cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1195cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich ent = PROG_TO_EDICT(pr_global_struct->self); 1196cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1197cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VectorCopy (ent->u.v.origin, end); 1198cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich end[2] -= 256; 1199cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1200cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich trace = SV_Move (ent->u.v.origin, ent->u.v.mins, ent->u.v.maxs, end, false, ent); 1201cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1202cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (trace.fraction == 1 || trace.allsolid) 1203cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich G_FLOAT(OFS_RETURN) = 0; 1204cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 1205cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 1206cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VectorCopy (trace.endpos, ent->u.v.origin); 1207cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich SV_LinkEdict (ent, false); 1208cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich ent->u.v.flags = (int)ent->u.v.flags | FL_ONGROUND; 1209cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich ent->u.v.groundentity = EDICT_TO_PROG(trace.ent); 1210cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich G_FLOAT(OFS_RETURN) = 1; 1211cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 1212cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 1213cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1214cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 1215cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich=============== 1216cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_lightstyle 1217cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1218cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid(float style, string value) lightstyle 1219cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich=============== 1220cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 1221cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_lightstyle (void) 1222cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 1223cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int style; 1224cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich char *val; 1225cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich client_t *client; 1226cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int j; 1227cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1228cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich style = (int) G_FLOAT(OFS_PARM0); 1229cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich val = G_STRING(OFS_PARM1); 1230cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1231cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// change the string in sv 1232cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich sv.lightstyles[style] = val; 1233cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1234cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// send message to all clients on this server 1235cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (sv.state != ss_active) 1236cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return; 1237cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1238cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (j=0, client = svs.clients ; j<svs.maxclients ; j++, client++) 1239cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (client->active || client->spawned) 1240cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 1241cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich MSG_WriteChar (&client->message, svc_lightstyle); 1242cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich MSG_WriteChar (&client->message,style); 1243cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich MSG_WriteString (&client->message, val); 1244cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 1245cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 1246cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1247cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_rint (void) 1248cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 1249cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float f; 1250cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich f = G_FLOAT(OFS_PARM0); 1251cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (f > 0) 1252cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich G_FLOAT(OFS_RETURN) = (int)(f + 0.5); 1253cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 1254cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich G_FLOAT(OFS_RETURN) = (int)(f - 0.5); 1255cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 1256cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_floor (void) 1257cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 1258cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich G_FLOAT(OFS_RETURN) = floor(G_FLOAT(OFS_PARM0)); 1259cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 1260cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_ceil (void) 1261cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 1262cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich G_FLOAT(OFS_RETURN) = ceil(G_FLOAT(OFS_PARM0)); 1263cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 1264cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1265cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1266cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 1267cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============= 1268cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_checkbottom 1269cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============= 1270cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 1271cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_checkbottom (void) 1272cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 1273cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich edict_t *ent; 1274cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1275cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich ent = G_EDICT(OFS_PARM0); 1276cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1277cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich G_FLOAT(OFS_RETURN) = SV_CheckBottom (ent); 1278cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 1279cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1280cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 1281cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============= 1282cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_pointcontents 1283cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============= 1284cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 1285cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_pointcontents (void) 1286cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 1287cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float *v; 1288cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1289cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich v = G_VECTOR(OFS_PARM0); 1290cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1291cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich G_FLOAT(OFS_RETURN) = SV_PointContents (v); 1292cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 1293cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1294cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 1295cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============= 1296cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_nextent 1297cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1298cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichentity nextent(entity) 1299cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============= 1300cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 1301cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_nextent (void) 1302cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 1303cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int i; 1304cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich edict_t *ent; 1305cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1306cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich i = G_EDICTNUM(OFS_PARM0); 1307cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich while (1) 1308cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 1309cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich i++; 1310cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (i == sv.num_edicts) 1311cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 1312cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich RETURN_EDICT(sv.edicts); 1313cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return; 1314cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 1315cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich ent = EDICT_NUM(i); 1316cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (!ent->free) 1317cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 1318cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich RETURN_EDICT(ent); 1319cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return; 1320cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 1321cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 1322cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 1323cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1324cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 1325cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============= 1326cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_aim 1327cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1328cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPick a vector for the player to shoot along 1329cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvector aim(entity, missilespeed) 1330cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============= 1331cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 1332cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t sv_aim = CVAR2("sv_aim", "0.93"); 1333cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_aim (void) 1334cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 1335cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich edict_t *ent, *check, *bestent; 1336cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vec3_t start, dir, end, bestdir; 1337cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int i, j; 1338cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich trace_t tr; 1339cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float dist, bestdist; 1340cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float speed; 1341cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1342cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich ent = G_EDICT(OFS_PARM0); 1343cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich speed = G_FLOAT(OFS_PARM1); 1344cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1345cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VectorCopy (ent->u.v.origin, start); 1346cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich start[2] += 20; 1347cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1348cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// try sending a trace straight 1349cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VectorCopy (pr_global_struct->v_forward, dir); 1350cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VectorMA (start, 2048, dir, end); 1351cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich tr = SV_Move (start, vec3_origin, vec3_origin, end, false, ent); 1352cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (tr.ent && tr.ent->u.v.takedamage == DAMAGE_AIM 1353cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich && (!teamplay.value || ent->u.v.team <=0 || ent->u.v.team != tr.ent->u.v.team) ) 1354cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 1355cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VectorCopy (pr_global_struct->v_forward, G_VECTOR(OFS_RETURN)); 1356cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return; 1357cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 1358cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1359cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1360cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// try all possible entities 1361cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VectorCopy (dir, bestdir); 1362cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich bestdist = sv_aim.value; 1363cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich bestent = NULL; 1364cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1365cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich check = NEXT_EDICT(sv.edicts); 1366cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (i=1 ; i<sv.num_edicts ; i++, check = NEXT_EDICT(check) ) 1367cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 1368cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (check->u.v.takedamage != DAMAGE_AIM) 1369cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich continue; 1370cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (check == ent) 1371cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich continue; 1372cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (teamplay.value && ent->u.v.team > 0 && ent->u.v.team == check->u.v.team) 1373cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich continue; // don't aim at teammate 1374cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (j=0 ; j<3 ; j++) 1375cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich end[j] = check->u.v.origin[j] 1376cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich + 0.5*(check->u.v.mins[j] + check->u.v.maxs[j]); 1377cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VectorSubtract (end, start, dir); 1378cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VectorNormalize (dir); 1379cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich dist = DotProduct (dir, pr_global_struct->v_forward); 1380cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (dist < bestdist) 1381cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich continue; // to far to turn 1382cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich tr = SV_Move (start, vec3_origin, vec3_origin, end, false, ent); 1383cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (tr.ent == check) 1384cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { // can shoot at this one 1385cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich bestdist = dist; 1386cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich bestent = check; 1387cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 1388cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 1389cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1390cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (bestent) 1391cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 1392cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VectorSubtract (bestent->u.v.origin, ent->u.v.origin, dir); 1393cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich dist = DotProduct (dir, pr_global_struct->v_forward); 1394cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VectorScale (pr_global_struct->v_forward, dist, end); 1395cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich end[2] = dir[2]; 1396cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VectorNormalize (end); 1397cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VectorCopy (end, G_VECTOR(OFS_RETURN)); 1398cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 1399cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 1400cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 1401cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VectorCopy (bestdir, G_VECTOR(OFS_RETURN)); 1402cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 1403cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 1404cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1405cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 1406cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============== 1407cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_changeyaw 1408cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1409cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichThis was a major timewaster in progs, so it was converted to C 1410cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============== 1411cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 1412cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_changeyaw (void) 1413cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 1414cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich edict_t *ent; 1415cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float ideal, current, move, speed; 1416cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1417cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich ent = PROG_TO_EDICT(pr_global_struct->self); 1418cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich current = anglemod( ent->u.v.angles[1] ); 1419cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich ideal = ent->u.v.ideal_yaw; 1420cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich speed = ent->u.v.yaw_speed; 1421cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1422cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (current == ideal) 1423cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return; 1424cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich move = ideal - current; 1425cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (ideal > current) 1426cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 1427cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (move >= 180) 1428cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich move = move - 360; 1429cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 1430cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 1431cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 1432cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (move <= -180) 1433cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich move = move + 360; 1434cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 1435cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (move > 0) 1436cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 1437cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (move > speed) 1438cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich move = speed; 1439cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 1440cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 1441cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 1442cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (move < -speed) 1443cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich move = -speed; 1444cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 1445cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1446cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich ent->u.v.angles[1] = anglemod (current + move); 1447cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 1448cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1449cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#ifdef QUAKE2 1450cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 1451cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============== 1452cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_changepitch 1453cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============== 1454cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 1455cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_changepitch (void) 1456cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 1457cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich edict_t *ent; 1458cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float ideal, current, move, speed; 1459cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1460cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich ent = G_EDICT(OFS_PARM0); 1461cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich current = anglemod( ent->u.v.angles[0] ); 1462cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich ideal = ent->u.v.idealpitch; 1463cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich speed = ent->u.v.pitch_speed; 1464cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1465cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (current == ideal) 1466cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return; 1467cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich move = ideal - current; 1468cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (ideal > current) 1469cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 1470cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (move >= 180) 1471cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich move = move - 360; 1472cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 1473cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 1474cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 1475cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (move <= -180) 1476cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich move = move + 360; 1477cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 1478cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (move > 0) 1479cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 1480cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (move > speed) 1481cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich move = speed; 1482cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 1483cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 1484cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 1485cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (move < -speed) 1486cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich move = -speed; 1487cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 1488cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1489cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich ent->u.v.angles[0] = anglemod (current + move); 1490cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 1491cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#endif 1492cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1493cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 1494cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich=============================================================================== 1495cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1496cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichMESSAGE WRITING 1497cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1498cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich=============================================================================== 1499cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 1500cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1501cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#define MSG_BROADCAST 0 // unreliable to all 1502cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#define MSG_ONE 1 // reliable to one (msg_entity) 1503cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#define MSG_ALL 2 // reliable to all 1504cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#define MSG_INIT 3 // write to the init string 1505cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1506cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichsizebuf_t *WriteDest (void) 1507cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 1508cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int entnum; 1509cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int dest; 1510cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich edict_t *ent; 1511cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1512cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich dest = (int) G_FLOAT(OFS_PARM0); 1513cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich switch (dest) 1514cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 1515cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich case MSG_BROADCAST: 1516cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return &sv.datagram; 1517cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1518cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich case MSG_ONE: 1519cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich ent = PROG_TO_EDICT(pr_global_struct->msg_entity); 1520cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich entnum = NUM_FOR_EDICT(ent); 1521cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (entnum < 1 || entnum > svs.maxclients) 1522cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich PR_RunError ("WriteDest: not a client"); 1523cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return &svs.clients[entnum-1].message; 1524cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1525cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich case MSG_ALL: 1526cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return &sv.reliable_datagram; 1527cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1528cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich case MSG_INIT: 1529cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return &sv.signon; 1530cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1531cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich default: 1532cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich PR_RunError ("WriteDest: bad destination"); 1533cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich break; 1534cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 1535cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1536cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return NULL; 1537cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 1538cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1539cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_WriteByte (void) 1540cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 1541cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich MSG_WriteByte (WriteDest(), (int) G_FLOAT(OFS_PARM1)); 1542cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 1543cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1544cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_WriteChar (void) 1545cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 1546cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich MSG_WriteChar (WriteDest(), (int) G_FLOAT(OFS_PARM1)); 1547cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 1548cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1549cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_WriteShort (void) 1550cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 1551cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich MSG_WriteShort (WriteDest(), (int) G_FLOAT(OFS_PARM1)); 1552cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 1553cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1554cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_WriteLong (void) 1555cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 1556cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich MSG_WriteLong (WriteDest(), (int) G_FLOAT(OFS_PARM1)); 1557cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 1558cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1559cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_WriteAngle (void) 1560cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 1561cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich MSG_WriteAngle (WriteDest(), G_FLOAT(OFS_PARM1)); 1562cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 1563cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1564cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_WriteCoord (void) 1565cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 1566cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich MSG_WriteCoord (WriteDest(), G_FLOAT(OFS_PARM1)); 1567cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 1568cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1569cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_WriteString (void) 1570cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 1571cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich MSG_WriteString (WriteDest(), G_STRING(OFS_PARM1)); 1572cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 1573cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1574cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1575cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_WriteEntity (void) 1576cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 1577cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich MSG_WriteShort (WriteDest(), G_EDICTNUM(OFS_PARM1)); 1578cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 1579cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1580cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich//============================================================================= 1581cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1582cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint SV_ModelIndex (const char *name); 1583cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1584cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_makestatic (void) 1585cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 1586cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich edict_t *ent; 1587cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int i; 1588cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1589cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich ent = G_EDICT(OFS_PARM0); 1590cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1591cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich MSG_WriteByte (&sv.signon,svc_spawnstatic); 1592cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1593cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich MSG_WriteByte (&sv.signon, SV_ModelIndex(pr_strings + ent->u.v.model)); 1594cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1595cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich MSG_WriteByte (&sv.signon, (int) ent->u.v.frame); 1596cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich MSG_WriteByte (&sv.signon, (int) ent->u.v.colormap); 1597cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich MSG_WriteByte (&sv.signon, (int) ent->u.v.skin); 1598cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (i=0 ; i<3 ; i++) 1599cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 1600cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich MSG_WriteCoord(&sv.signon, ent->u.v.origin[i]); 1601cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich MSG_WriteAngle(&sv.signon, ent->u.v.angles[i]); 1602cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 1603cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1604cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// throw the entity away now 1605cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich ED_Free (ent); 1606cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 1607cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1608cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich//============================================================================= 1609cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1610cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 1611cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============== 1612cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_setspawnparms 1613cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============== 1614cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 1615cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_setspawnparms (void) 1616cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 1617cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich edict_t *ent; 1618cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int i; 1619cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich client_t *client; 1620cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1621cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich ent = G_EDICT(OFS_PARM0); 1622cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich i = NUM_FOR_EDICT(ent); 1623cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (i < 1 || i > svs.maxclients) 1624cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich PR_RunError ("Entity is not a client"); 1625cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1626cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich // copy spawn parms out of the client_t 1627cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich client = svs.clients + (i-1); 1628cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1629cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (i=0 ; i< NUM_SPAWN_PARMS ; i++) 1630cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich (&pr_global_struct->parm1)[i] = client->spawn_parms[i]; 1631cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 1632cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1633cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 1634cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============== 1635cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_changelevel 1636cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============== 1637cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 1638cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_changelevel (void) 1639cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 1640cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#ifdef QUAKE2 1641cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich char *s1, *s2; 1642cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1643cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (svs.changelevel_issued) 1644cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return; 1645cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich svs.changelevel_issued = true; 1646cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1647cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich s1 = G_STRING(OFS_PARM0); 1648cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich s2 = G_STRING(OFS_PARM1); 1649cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1650cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if ((int)pr_global_struct->serverflags & (SFL_NEW_UNIT | SFL_NEW_EPISODE)) 1651cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Cbuf_AddText (va("changelevel %s %s\n",s1, s2)); 1652cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 1653cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Cbuf_AddText (va("changelevel2 %s %s\n",s1, s2)); 1654cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#else 1655cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich char *s; 1656cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1657cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// make sure we don't issue two changelevels 1658cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (svs.changelevel_issued) 1659cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return; 1660cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich svs.changelevel_issued = true; 1661cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1662cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich s = G_STRING(OFS_PARM0); 1663cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Cbuf_AddText (va("changelevel %s\n",s)); 1664cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#endif 1665cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 1666cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1667cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1668cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#ifdef QUAKE2 1669cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1670cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#define CONTENT_WATER -3 1671cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#define CONTENT_SLIME -4 1672cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#define CONTENT_LAVA -5 1673cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1674cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#define FL_IMMUNE_WATER 131072 1675cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#define FL_IMMUNE_SLIME 262144 1676cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#define FL_IMMUNE_LAVA 524288 1677cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1678cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#define CHAN_VOICE 2 1679cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#define CHAN_BODY 4 1680cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1681cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#define ATTN_NORM 1 1682cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1683cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_WaterMove (void) 1684cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 1685cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich edict_t *self; 1686cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int flags; 1687cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int waterlevel; 1688cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int watertype; 1689cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float drownlevel; 1690cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float damage = 0.0; 1691cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1692cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich self = PROG_TO_EDICT(pr_global_struct->self); 1693cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1694cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (self->u.v.movetype == MOVETYPE_NOCLIP) 1695cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 1696cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich self->u.v.air_finished = sv.time + 12; 1697cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich G_FLOAT(OFS_RETURN) = damage; 1698cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return; 1699cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 1700cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1701cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (self->u.v.health < 0) 1702cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 1703cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich G_FLOAT(OFS_RETURN) = damage; 1704cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return; 1705cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 1706cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1707cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (self->u.v.deadflag == DEAD_NO) 1708cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich drownlevel = 3; 1709cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 1710cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich drownlevel = 1; 1711cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1712cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich flags = (int)self->u.v.flags; 1713cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich waterlevel = (int)self->u.v.waterlevel; 1714cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich watertype = (int)self->u.v.watertype; 1715cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1716cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (!(flags & (FL_IMMUNE_WATER + FL_GODMODE))) 1717cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (((flags & FL_SWIM) && (waterlevel < drownlevel)) || (waterlevel >= drownlevel)) 1718cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 1719cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (self->u.v.air_finished < sv.time) 1720cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (self->u.v.pain_finished < sv.time) 1721cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 1722cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich self->u.v.dmg = self->u.v.dmg + 2; 1723cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (self->u.v.dmg > 15) 1724cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich self->u.v.dmg = 10; 1725cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// T_Damage (self, world, world, self.dmg, 0, FALSE); 1726cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich damage = self->u.v.dmg; 1727cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich self->u.v.pain_finished = sv.time + 1.0; 1728cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 1729cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 1730cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 1731cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 1732cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (self->u.v.air_finished < sv.time) 1733cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// sound (self, CHAN_VOICE, "player/gasp2.wav", 1, ATTN_NORM); 1734cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich SV_StartSound (self, CHAN_VOICE, "player/gasp2.wav", 255, ATTN_NORM); 1735cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else if (self->u.v.air_finished < sv.time + 9) 1736cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// sound (self, CHAN_VOICE, "player/gasp1.wav", 1, ATTN_NORM); 1737cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich SV_StartSound (self, CHAN_VOICE, "player/gasp1.wav", 255, ATTN_NORM); 1738cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich self->u.v.air_finished = sv.time + 12.0; 1739cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich self->u.v.dmg = 2; 1740cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 1741cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1742cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (!waterlevel) 1743cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 1744cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (flags & FL_INWATER) 1745cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 1746cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich // play leave water sound 1747cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// sound (self, CHAN_BODY, "misc/outwater.wav", 1, ATTN_NORM); 1748cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich SV_StartSound (self, CHAN_BODY, "misc/outwater.wav", 255, ATTN_NORM); 1749cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich self->u.v.flags = (float)(flags &~FL_INWATER); 1750cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 1751cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich self->u.v.air_finished = sv.time + 12.0; 1752cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich G_FLOAT(OFS_RETURN) = damage; 1753cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return; 1754cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 1755cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1756cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (watertype == CONTENT_LAVA) 1757cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { // do damage 1758cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (!(flags & (FL_IMMUNE_LAVA + FL_GODMODE))) 1759cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (self->u.v.dmgtime < sv.time) 1760cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 1761cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (self->u.v.radsuit_finished < sv.time) 1762cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich self->u.v.dmgtime = sv.time + 0.2; 1763cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 1764cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich self->u.v.dmgtime = sv.time + 1.0; 1765cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// T_Damage (self, world, world, 10*self.waterlevel, 0, TRUE); 1766cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich damage = (float)(10*waterlevel); 1767cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 1768cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 1769cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else if (watertype == CONTENT_SLIME) 1770cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { // do damage 1771cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (!(flags & (FL_IMMUNE_SLIME + FL_GODMODE))) 1772cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (self->u.v.dmgtime < sv.time && self->u.v.radsuit_finished < sv.time) 1773cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 1774cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich self->u.v.dmgtime = sv.time + 1.0; 1775cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// T_Damage (self, world, world, 4*self.waterlevel, 0, TRUE); 1776cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich damage = (float)(4*waterlevel); 1777cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 1778cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 1779cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1780cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if ( !(flags & FL_INWATER) ) 1781cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 1782cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1783cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// player enter water sound 1784cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (watertype == CONTENT_LAVA) 1785cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// sound (self, CHAN_BODY, "player/inlava.wav", 1, ATTN_NORM); 1786cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich SV_StartSound (self, CHAN_BODY, "player/inlava.wav", 255, ATTN_NORM); 1787cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (watertype == CONTENT_WATER) 1788cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// sound (self, CHAN_BODY, "player/inh2o.wav", 1, ATTN_NORM); 1789cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich SV_StartSound (self, CHAN_BODY, "player/inh2o.wav", 255, ATTN_NORM); 1790cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (watertype == CONTENT_SLIME) 1791cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// sound (self, CHAN_BODY, "player/slimbrn2.wav", 1, ATTN_NORM); 1792cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich SV_StartSound (self, CHAN_BODY, "player/slimbrn2.wav", 255, ATTN_NORM); 1793cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1794cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich self->u.v.flags = (float)(flags | FL_INWATER); 1795cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich self->u.v.dmgtime = 0; 1796cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 1797cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1798cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (! (flags & FL_WATERJUMP) ) 1799cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 1800cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// self.velocity = self.velocity - 0.8*self.waterlevel*frametime*self.velocity; 1801cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VectorMA (self->u.v.velocity, -0.8 * self->u.v.waterlevel * host_frametime, self->u.v.velocity, self->u.v.velocity); 1802cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 1803cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1804cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich G_FLOAT(OFS_RETURN) = damage; 1805cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 1806cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1807cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1808cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_sin (void) 1809cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 1810cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich G_FLOAT(OFS_RETURN) = sin(G_FLOAT(OFS_PARM0)); 1811cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 1812cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1813cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_cos (void) 1814cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 1815cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich G_FLOAT(OFS_RETURN) = cos(G_FLOAT(OFS_PARM0)); 1816cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 1817cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1818cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_sqrt (void) 1819cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 1820cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich G_FLOAT(OFS_RETURN) = sqrt(G_FLOAT(OFS_PARM0)); 1821cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 1822cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#endif 1823cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1824cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid PF_Fixme (void) 1825cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 1826cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich PR_RunError ("unimplemented bulitin"); 1827cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 1828cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1829cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1830cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1831cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichbuiltin_t pr_builtin[] = 1832cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 1833cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_Fixme, 1834cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_makevectors, // void(entity e) makevectors = #1; 1835cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_setorigin, // void(entity e, vector o) setorigin = #2; 1836cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_setmodel, // void(entity e, string m) setmodel = #3; 1837cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_setsize, // void(entity e, vector min, vector max) setsize = #4; 1838cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_Fixme, // void(entity e, vector min, vector max) setabssize = #5; 1839cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_break, // void() break = #6; 1840cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_random, // float() random = #7; 1841cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_sound, // void(entity e, float chan, string samp) sound = #8; 1842cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_normalize, // vector(vector v) normalize = #9; 1843cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_error, // void(string e) error = #10; 1844cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_objerror, // void(string e) objerror = #11; 1845cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_vlen, // float(vector v) vlen = #12; 1846cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_vectoyaw, // float(vector v) vectoyaw = #13; 1847cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_Spawn, // entity() spawn = #14; 1848cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_Remove, // void(entity e) remove = #15; 1849cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_traceline, // float(vector v1, vector v2, float tryents) traceline = #16; 1850cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_checkclient, // entity() clientlist = #17; 1851cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_Find, // entity(entity start, .string fld, string match) find = #18; 1852cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_precache_sound, // void(string s) precache_sound = #19; 1853cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_precache_model, // void(string s) precache_model = #20; 1854cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_stuffcmd, // void(entity client, string s)stuffcmd = #21; 1855cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_findradius, // entity(vector org, float rad) findradius = #22; 1856cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_bprint, // void(string s) bprint = #23; 1857cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_sprint, // void(entity client, string s) sprint = #24; 1858cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_dprint, // void(string s) dprint = #25; 1859cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_ftos, // void(string s) ftos = #26; 1860cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_vtos, // void(string s) vtos = #27; 1861cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_coredump, 1862cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_traceon, 1863cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_traceoff, 1864cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_eprint, // void(entity e) debug print an entire entity 1865cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_walkmove, // float(float yaw, float dist) walkmove 1866cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_Fixme, // float(float yaw, float dist) walkmove 1867cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_droptofloor, 1868cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_lightstyle, 1869cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_rint, 1870cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_floor, 1871cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_ceil, 1872cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_Fixme, 1873cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_checkbottom, 1874cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_pointcontents, 1875cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_Fixme, 1876cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_fabs, 1877cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_aim, 1878cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_cvar, 1879cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_localcmd, 1880cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_nextent, 1881cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_particle, 1882cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_changeyaw, 1883cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_Fixme, 1884cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_vectoangles, 1885cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1886cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_WriteByte, 1887cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_WriteChar, 1888cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_WriteShort, 1889cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_WriteLong, 1890cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_WriteCoord, 1891cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_WriteAngle, 1892cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_WriteString, 1893cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_WriteEntity, 1894cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1895cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#ifdef QUAKE2 1896cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_sin, 1897cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_cos, 1898cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_sqrt, 1899cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_changepitch, 1900cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_TraceToss, 1901cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_etos, 1902cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_WaterMove, 1903cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#else 1904cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_Fixme, 1905cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_Fixme, 1906cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_Fixme, 1907cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_Fixme, 1908cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_Fixme, 1909cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_Fixme, 1910cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_Fixme, 1911cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#endif 1912cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1913cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichSV_MoveToGoal, 1914cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_precache_file, 1915cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_makestatic, 1916cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1917cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_changelevel, 1918cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_Fixme, 1919cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1920cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_cvar_set, 1921cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_centerprint, 1922cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1923cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_ambientsound, 1924cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1925cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_precache_model, 1926cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_precache_sound, // precache_sound2 is different only for qcc 1927cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_precache_file, 1928cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1929cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichPF_setspawnparms 1930cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich}; 1931cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1932cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichbuiltin_t *pr_builtins = pr_builtin; 1933cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint pr_numbuiltins = sizeof(pr_builtin)/sizeof(pr_builtin[0]); 1934cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1935