mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2024-11-26 14:20:59 +00:00
f9a384ffd4
Now it doesn't matter if you get 22 fps or 72, you jump the same height, which actually happens to be slightly higher than the previous 72fps jump. Effectively, you jump the height you would if you got infinite fps ;)
285 lines
7.6 KiB
C
285 lines
7.6 KiB
C
/*
|
|
sv_progs.h
|
|
|
|
server specific progs definitions
|
|
|
|
Copyright (C) 2000 Bill Currie
|
|
|
|
Author: Bill Currie
|
|
Date: 28 Feb 2001
|
|
|
|
This program is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU General Public License
|
|
as published by the Free Software Foundation; either version 2
|
|
of the License, or (at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
|
|
See the GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to:
|
|
|
|
Free Software Foundation, Inc.
|
|
59 Temple Place - Suite 330
|
|
Boston, MA 02111-1307, USA
|
|
|
|
*/
|
|
|
|
#ifndef __sv_progs_h
|
|
#define __sv_progs_h
|
|
|
|
#include "QF/link.h"
|
|
#include "QF/progs.h"
|
|
|
|
#include "protocol.h"
|
|
#include "sv_pr_cmds.h"
|
|
|
|
typedef struct {
|
|
pr_int_t *self;
|
|
pr_int_t *other;
|
|
pr_int_t *world;
|
|
float *time;
|
|
float *frametime;
|
|
float *force_retouch;
|
|
string_t *mapname;
|
|
string_t *startspot;
|
|
float *deathmatch;
|
|
float *coop;
|
|
float *teamplay;
|
|
float *serverflags;
|
|
float *total_secrets;
|
|
float *total_monsters;
|
|
float *found_secrets;
|
|
float *killed_monsters;
|
|
float *parms;
|
|
vec3_t *v_forward;
|
|
vec3_t *v_up;
|
|
vec3_t *v_right;
|
|
float *trace_allsolid;
|
|
float *trace_startsolid;
|
|
float *trace_fraction;
|
|
vec3_t *trace_endpos;
|
|
vec3_t *trace_plane_normal;
|
|
float *trace_plane_dist;
|
|
pr_int_t *trace_ent;
|
|
float *trace_inopen;
|
|
float *trace_inwater;
|
|
pr_int_t *msg_entity;
|
|
string_t *null;
|
|
|
|
pr_int_t *newmis;
|
|
} sv_globals_t;
|
|
|
|
extern sv_globals_t sv_globals;
|
|
|
|
typedef struct {
|
|
func_t main;
|
|
func_t StartFrame;
|
|
func_t PlayerPreThink;
|
|
func_t PlayerPostThink;
|
|
func_t ClientKill;
|
|
func_t ClientConnect;
|
|
func_t PutClientInServer;
|
|
func_t ClientDisconnect;
|
|
func_t SetNewParms;
|
|
func_t SetChangeParms;
|
|
|
|
func_t EndFrame;
|
|
} sv_funcs_t;
|
|
|
|
extern sv_funcs_t sv_funcs;
|
|
|
|
typedef struct
|
|
{
|
|
pr_int_t modelindex; //float
|
|
pr_int_t absmin; //vec3_t
|
|
pr_int_t absmax; //vec3_t
|
|
pr_int_t ltime; //float
|
|
pr_int_t movetype; //float
|
|
pr_int_t solid; //float
|
|
pr_int_t origin; //vec3_t
|
|
pr_int_t oldorigin; //vec3_t
|
|
pr_int_t velocity; //vec3_t
|
|
pr_int_t angles; //vec3_t
|
|
pr_int_t avelocity; //vec3_t
|
|
pr_int_t basevelocity; //vec3_t
|
|
pr_int_t punchangle; //vec3_t
|
|
pr_int_t classname; //string_t
|
|
pr_int_t model; //string_t
|
|
pr_int_t frame; //float
|
|
pr_int_t skin; //float
|
|
pr_int_t effects; //float
|
|
pr_int_t drawPercent; //float
|
|
pr_int_t gravity; //float
|
|
pr_int_t mass; //float
|
|
pr_int_t light_level; //float
|
|
pr_int_t mins; //vec3_t
|
|
pr_int_t maxs; //vec3_t
|
|
pr_int_t size; //vec3_t
|
|
pr_int_t touch; //func_t
|
|
pr_int_t use; //func_t
|
|
pr_int_t think; //func_t
|
|
pr_int_t blocked; //func_t
|
|
pr_int_t nextthink; //float
|
|
pr_int_t groundentity; //int
|
|
pr_int_t health; //float
|
|
pr_int_t frags; //float
|
|
pr_int_t weapon; //float
|
|
pr_int_t weaponmodel; //string_t
|
|
pr_int_t weaponframe; //float
|
|
pr_int_t currentammo; //float
|
|
pr_int_t ammo_shells; //float
|
|
pr_int_t ammo_nails; //float
|
|
pr_int_t ammo_rockets; //float
|
|
pr_int_t ammo_cells; //float
|
|
pr_int_t items; //float
|
|
pr_int_t items2; //float
|
|
pr_int_t takedamage; //float
|
|
pr_int_t chain; //int
|
|
pr_int_t deadflag; //float
|
|
pr_int_t view_ofs; //vec3_t
|
|
pr_int_t button0; //float
|
|
pr_int_t button1; //float
|
|
pr_int_t button2; //float
|
|
pr_int_t impulse; //float
|
|
pr_int_t fixangle; //float
|
|
pr_int_t v_angle; //vec3_t
|
|
pr_int_t idealpitch; //float
|
|
pr_int_t pitch_speed; //float
|
|
pr_int_t netname; //string_t
|
|
pr_int_t enemy; //int
|
|
pr_int_t flags; //float
|
|
pr_int_t colormap; //float
|
|
pr_int_t team; //float
|
|
pr_int_t max_health; //float
|
|
pr_int_t teleport_time; //float
|
|
pr_int_t armortype; //float
|
|
pr_int_t armorvalue; //float
|
|
pr_int_t waterlevel; //float
|
|
pr_int_t watertype; //float
|
|
pr_int_t ideal_yaw; //float
|
|
pr_int_t yaw_speed; //float
|
|
pr_int_t aiment; //int
|
|
pr_int_t goalentity; //int
|
|
pr_int_t spawnflags; //float
|
|
pr_int_t target; //string_t
|
|
pr_int_t targetname; //string_t
|
|
pr_int_t dmg_take; //float
|
|
pr_int_t dmg_save; //float
|
|
pr_int_t dmg_inflictor; //int
|
|
pr_int_t owner; //int
|
|
pr_int_t movedir; //vec3_t
|
|
pr_int_t message; //string_t
|
|
pr_int_t sounds; //float
|
|
pr_int_t noise; //string_t
|
|
pr_int_t noise1; //string_t
|
|
pr_int_t noise2; //string_t
|
|
pr_int_t noise3; //string_t
|
|
pr_int_t dmg; //float
|
|
pr_int_t dmgtime; //float
|
|
pr_int_t air_finished; //float
|
|
pr_int_t pain_finished; //float
|
|
pr_int_t radsuit_finished; //float
|
|
pr_int_t speed; //float
|
|
|
|
pr_int_t rotated_bbox; //int
|
|
pr_int_t alpha; //float
|
|
|
|
pr_int_t lastruntime; //float
|
|
} sv_fields_t;
|
|
|
|
extern sv_fields_t sv_fields;
|
|
|
|
extern progs_t sv_pr_state;
|
|
|
|
#define PR_RANGE_ID 0x0000
|
|
#define PR_RANGE_ID_MAX 82
|
|
|
|
#if TYPECHECK_PROGS
|
|
#define SVFIELD(e,f,t) E_var (e, PR_AccessField (&sv_pr_state, #f, ev_##t, __FILE__, __LINE__), t)
|
|
#else
|
|
#define SVFIELD(e,f,t) E_var (e, sv_fields.f, t)
|
|
#endif
|
|
|
|
#define SVfloat(e,f) SVFIELD (e, f, float)
|
|
#define SVstring(e,f) SVFIELD (e, f, string)
|
|
#define SVfunc(e,f) SVFIELD (e, f, func)
|
|
#define SVentity(e,f) SVFIELD (e, f, entity)
|
|
#define SVvector(e,f) SVFIELD (e, f, vector)
|
|
#define SVinteger(e,f) SVFIELD (e, f, integer)
|
|
|
|
typedef struct edict_leaf_s {
|
|
struct edict_leaf_s *next;
|
|
unsigned leafnum;
|
|
} edict_leaf_t;
|
|
|
|
typedef struct sv_data_s {
|
|
edict_t *edict;
|
|
link_t area; ///< linked to a division node or leaf
|
|
edict_leaf_t *leafs;
|
|
entity_state_t state;
|
|
byte alpha;
|
|
qboolean sendinterval;
|
|
qboolean add_grav;
|
|
} sv_data_t;
|
|
|
|
#define SVdata(e) ((sv_data_t *) ((e)->edata))
|
|
#define EDICT_FROM_AREA(l) (STRUCT_FROM_LINK(l,sv_data_t,area)->edict)
|
|
|
|
static inline void
|
|
sv_pr_touch (edict_t *self, edict_t *other)
|
|
{
|
|
pr_int_t this;
|
|
|
|
*sv_globals.self = EDICT_TO_PROG (&sv_pr_state, self);
|
|
*sv_globals.other = EDICT_TO_PROG (&sv_pr_state, other);
|
|
if ((this = sv_pr_state.fields.this) != -1) {
|
|
PR_RESET_PARAMS (&sv_pr_state);
|
|
P_INT (&sv_pr_state, 0) = E_POINTER (self, this);
|
|
P_INT (&sv_pr_state, 1) = 0;
|
|
P_INT (&sv_pr_state, 2) = E_POINTER (other, this);
|
|
}
|
|
PR_ExecuteProgram (&sv_pr_state, SVfunc (self, touch));
|
|
}
|
|
|
|
static inline void
|
|
sv_pr_use (edict_t *self, edict_t *other)
|
|
{
|
|
}
|
|
|
|
static inline void
|
|
sv_pr_think (edict_t *self)
|
|
{
|
|
pr_int_t this;
|
|
|
|
*sv_globals.self = EDICT_TO_PROG (&sv_pr_state, self);
|
|
*sv_globals.other = 0;
|
|
if ((this = sv_pr_state.fields.this) != -1) {
|
|
PR_RESET_PARAMS (&sv_pr_state);
|
|
P_INT (&sv_pr_state, 0) = E_POINTER (self, this);
|
|
P_INT (&sv_pr_state, 1) = 0;
|
|
P_INT (&sv_pr_state, 2) = 0;
|
|
}
|
|
PR_ExecuteProgram (&sv_pr_state, SVfunc (self, think));
|
|
}
|
|
|
|
static inline void
|
|
sv_pr_blocked (edict_t *self, edict_t *other)
|
|
{
|
|
pr_int_t this;
|
|
|
|
*sv_globals.self = EDICT_TO_PROG (&sv_pr_state, self);
|
|
*sv_globals.other = EDICT_TO_PROG (&sv_pr_state, other);
|
|
if ((this = sv_pr_state.fields.this) != -1) {
|
|
PR_RESET_PARAMS (&sv_pr_state);
|
|
P_INT (&sv_pr_state, 0) = E_POINTER (self, this);
|
|
P_INT (&sv_pr_state, 1) = 0;
|
|
P_INT (&sv_pr_state, 2) = E_POINTER (other, this);
|
|
}
|
|
PR_ExecuteProgram (&sv_pr_state, SVfunc (self, blocked));
|
|
}
|
|
|
|
#endif // __sv_progs_h
|