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