quakeforge/nq/include/sv_progs.h
Bill Currie f9a384ffd4 Make simple gravity acceleration framerate independent.
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 ;)
2012-04-28 14:54:58 +09:00

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