2020-04-15 16:39:17 +00:00
|
|
|
#ifndef __GAME_H__
|
|
|
|
#define __GAME_H__
|
|
|
|
|
2020-04-16 18:28:40 +00:00
|
|
|
#include "cube.hh"
|
2020-04-15 16:39:17 +00:00
|
|
|
|
|
|
|
// animations
|
|
|
|
|
|
|
|
enum
|
|
|
|
{
|
|
|
|
ANIM_DEAD = ANIM_GAMESPECIFIC, ANIM_DYING,
|
|
|
|
ANIM_IDLE, ANIM_RUN_N, ANIM_RUN_NE, ANIM_RUN_E, ANIM_RUN_SE, ANIM_RUN_S, ANIM_RUN_SW, ANIM_RUN_W, ANIM_RUN_NW,
|
|
|
|
ANIM_JUMP, ANIM_JUMP_N, ANIM_JUMP_NE, ANIM_JUMP_E, ANIM_JUMP_SE, ANIM_JUMP_S, ANIM_JUMP_SW, ANIM_JUMP_W, ANIM_JUMP_NW,
|
|
|
|
ANIM_SINK, ANIM_SWIM,
|
|
|
|
ANIM_CROUCH, ANIM_CROUCH_N, ANIM_CROUCH_NE, ANIM_CROUCH_E, ANIM_CROUCH_SE, ANIM_CROUCH_S, ANIM_CROUCH_SW, ANIM_CROUCH_W, ANIM_CROUCH_NW,
|
|
|
|
ANIM_CROUCH_JUMP, ANIM_CROUCH_JUMP_N, ANIM_CROUCH_JUMP_NE, ANIM_CROUCH_JUMP_E, ANIM_CROUCH_JUMP_SE, ANIM_CROUCH_JUMP_S, ANIM_CROUCH_JUMP_SW, ANIM_CROUCH_JUMP_W, ANIM_CROUCH_JUMP_NW,
|
|
|
|
ANIM_CROUCH_SINK, ANIM_CROUCH_SWIM,
|
|
|
|
ANIM_SHOOT, ANIM_MELEE,
|
|
|
|
ANIM_PAIN,
|
|
|
|
ANIM_EDIT, ANIM_LAG, ANIM_TAUNT, ANIM_WIN, ANIM_LOSE,
|
|
|
|
ANIM_GUN_IDLE, ANIM_GUN_SHOOT, ANIM_GUN_MELEE,
|
|
|
|
ANIM_VWEP_IDLE, ANIM_VWEP_SHOOT, ANIM_VWEP_MELEE,
|
|
|
|
NUMANIMS
|
|
|
|
};
|
|
|
|
|
|
|
|
static const char * const animnames[] =
|
|
|
|
{
|
|
|
|
"mapmodel",
|
|
|
|
"dead", "dying",
|
|
|
|
"idle", "run N", "run NE", "run E", "run SE", "run S", "run SW", "run W", "run NW",
|
|
|
|
"jump", "jump N", "jump NE", "jump E", "jump SE", "jump S", "jump SW", "jump W", "jump NW",
|
|
|
|
"sink", "swim",
|
|
|
|
"crouch", "crouch N", "crouch NE", "crouch E", "crouch SE", "crouch S", "crouch SW", "crouch W", "crouch NW",
|
|
|
|
"crouch jump", "crouch jump N", "crouch jump NE", "crouch jump E", "crouch jump SE", "crouch jump S", "crouch jump SW", "crouch jump W", "crouch jump NW",
|
|
|
|
"crouch sink", "crouch swim",
|
|
|
|
"shoot", "melee",
|
|
|
|
"pain",
|
|
|
|
"edit", "lag", "taunt", "win", "lose",
|
|
|
|
"gun idle", "gun shoot", "gun melee",
|
|
|
|
"vwep idle", "vwep shoot", "vwep melee"
|
|
|
|
};
|
|
|
|
|
|
|
|
// console message types
|
|
|
|
|
|
|
|
enum
|
|
|
|
{
|
|
|
|
CON_CHAT = 1<<8,
|
|
|
|
CON_TEAMCHAT = 1<<9,
|
|
|
|
CON_GAMEINFO = 1<<10,
|
|
|
|
CON_FRAG_SELF = 1<<11,
|
|
|
|
CON_FRAG_OTHER = 1<<12,
|
|
|
|
CON_TEAMKILL = 1<<13
|
|
|
|
};
|
|
|
|
|
|
|
|
// network quantization scale
|
|
|
|
#define DMF 16.0f // for world locations
|
|
|
|
#define DNF 100.0f // for normalized vectors
|
|
|
|
#define DVELF 1.0f // for playerspeed based velocity vectors
|
|
|
|
|
|
|
|
enum // static entity types
|
|
|
|
{
|
|
|
|
NOTUSED = ET_EMPTY, // entity slot not in use in map
|
|
|
|
LIGHT = ET_LIGHT, // lightsource, attr1 = radius, attr2 = intensity
|
|
|
|
MAPMODEL = ET_MAPMODEL, // attr1 = idx, attr2 = yaw, attr3 = pitch, attr4 = roll, attr5 = scale
|
|
|
|
PLAYERSTART, // attr1 = angle, attr2 = team
|
|
|
|
ENVMAP = ET_ENVMAP, // attr1 = radius
|
|
|
|
PARTICLES = ET_PARTICLES,
|
|
|
|
MAPSOUND = ET_SOUND,
|
|
|
|
SPOTLIGHT = ET_SPOTLIGHT,
|
|
|
|
DECAL = ET_DECAL,
|
|
|
|
MAXENTTYPES,
|
|
|
|
|
|
|
|
I_FIRST = 0,
|
|
|
|
I_LAST = -1
|
|
|
|
};
|
|
|
|
|
|
|
|
struct gameentity : extentity
|
|
|
|
{
|
|
|
|
};
|
|
|
|
|
|
|
|
enum
|
|
|
|
{
|
2020-04-17 18:19:42 +00:00
|
|
|
M_EDIT = 1<<0
|
2020-04-15 16:39:17 +00:00
|
|
|
};
|
|
|
|
|
2020-04-16 21:18:05 +00:00
|
|
|
#define m_edit true
|
2020-04-15 16:39:17 +00:00
|
|
|
|
|
|
|
// hardcoded sounds, defined in sounds.cfg
|
|
|
|
enum
|
|
|
|
{
|
|
|
|
S_JUMP = 0, S_LAND,
|
|
|
|
S_SPLASHIN, S_SPLASHOUT, S_BURN,
|
|
|
|
S_ITEMSPAWN, S_TELEPORT, S_JUMPPAD,
|
|
|
|
S_MELEE, S_PULSE1, S_PULSE2, S_PULSEEXPLODE, S_RAIL1, S_RAIL2,
|
|
|
|
S_WEAPLOAD, S_NOAMMO, S_HIT,
|
2020-04-16 21:18:05 +00:00
|
|
|
S_PAIN1, S_PAIN2, S_DIE1, S_DIE2
|
2020-04-15 16:39:17 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
// network messages codes, c2s, c2c, s2c
|
|
|
|
|
|
|
|
enum
|
|
|
|
{
|
|
|
|
N_CONNECT = 0, N_SERVINFO, N_WELCOME, N_INITCLIENT, N_POS, N_TEXT, N_SOUND, N_CDIS,
|
|
|
|
N_DIED, N_DAMAGE, N_HITPUSH, N_SHOTFX, N_EXPLODEFX,
|
|
|
|
N_TRYSPAWN, N_SPAWNSTATE, N_SPAWN, N_FORCEDEATH,
|
2020-04-17 18:19:42 +00:00
|
|
|
N_MAPCHANGE,
|
2020-04-15 16:39:17 +00:00
|
|
|
N_PING, N_PONG, N_CLIENTPING,
|
|
|
|
N_SERVMSG, N_ITEMLIST, N_RESUME,
|
|
|
|
N_EDITMODE, N_EDITENT, N_EDITF, N_EDITT, N_EDITM, N_FLIP, N_COPY, N_PASTE, N_ROTATE, N_REPLACE, N_DELCUBE, N_CALCLIGHT, N_REMIP, N_EDITVSLOT, N_UNDO, N_REDO, N_NEWMAP, N_GETMAP, N_SENDMAP, N_CLIPBOARD, N_EDITVAR,
|
2020-04-16 21:18:05 +00:00
|
|
|
N_SPECTATOR, N_SETTEAM,
|
2020-04-15 16:39:17 +00:00
|
|
|
N_CLIENT,
|
|
|
|
N_PAUSEGAME, N_GAMESPEED,
|
|
|
|
N_MAPCRC, N_CHECKMAPS,
|
|
|
|
N_SWITCHNAME, N_SWITCHMODEL, N_SWITCHCOLOR, N_SWITCHTEAM,
|
|
|
|
N_SERVCMD,
|
|
|
|
NUMMSG
|
|
|
|
};
|
|
|
|
|
|
|
|
static const int msgsizes[] = // size inclusive message token, 0 for variable or not-checked sizes
|
|
|
|
{
|
|
|
|
N_CONNECT, 0, N_SERVINFO, 0, N_WELCOME, 1, N_INITCLIENT, 0, N_POS, 0, N_TEXT, 0, N_SOUND, 2, N_CDIS, 2,
|
|
|
|
N_DIED, 5, N_DAMAGE, 5, N_HITPUSH, 7, N_SHOTFX, 10, N_EXPLODEFX, 4,
|
|
|
|
N_TRYSPAWN, 1, N_SPAWNSTATE, 8, N_SPAWN, 3, N_FORCEDEATH, 2,
|
2020-04-17 18:19:42 +00:00
|
|
|
N_MAPCHANGE, 0,
|
2020-04-15 16:39:17 +00:00
|
|
|
N_PING, 2, N_PONG, 2, N_CLIENTPING, 2,
|
|
|
|
N_SERVMSG, 0, N_ITEMLIST, 0, N_RESUME, 0,
|
|
|
|
N_EDITMODE, 2, N_EDITENT, 11, N_EDITF, 16, N_EDITT, 16, N_EDITM, 16, N_FLIP, 14, N_COPY, 14, N_PASTE, 14, N_ROTATE, 15, N_REPLACE, 17, N_DELCUBE, 14, N_CALCLIGHT, 1, N_REMIP, 1, N_EDITVSLOT, 16, N_UNDO, 0, N_REDO, 0, N_NEWMAP, 2, N_GETMAP, 1, N_SENDMAP, 0, N_EDITVAR, 0,
|
2020-04-16 21:18:05 +00:00
|
|
|
N_SPECTATOR, 3, N_SETTEAM, 0,
|
2020-04-15 16:39:17 +00:00
|
|
|
N_CLIENT, 0,
|
|
|
|
N_PAUSEGAME, 0, N_GAMESPEED, 0,
|
|
|
|
N_MAPCRC, 0, N_CHECKMAPS, 1,
|
|
|
|
N_SWITCHNAME, 0, N_SWITCHMODEL, 2, N_SWITCHCOLOR, 2, N_SWITCHTEAM, 2,
|
|
|
|
N_SERVCMD, 0,
|
|
|
|
-1
|
|
|
|
};
|
|
|
|
|
|
|
|
#define TESSERACT_SERVER_PORT 42000
|
|
|
|
#define TESSERACT_LANINFO_PORT 41998
|
|
|
|
#define TESSERACT_MASTER_PORT 41999
|
|
|
|
#define PROTOCOL_VERSION 2 // bump when protocol changes
|
|
|
|
|
|
|
|
#define MAXNAMELEN 15
|
|
|
|
|
|
|
|
#define validitem(n) false
|
|
|
|
|
|
|
|
// inherited by gameent and server clients
|
|
|
|
struct gamestate
|
|
|
|
{
|
2020-04-17 18:19:42 +00:00
|
|
|
gamestate() {}
|
2020-04-15 16:39:17 +00:00
|
|
|
|
|
|
|
bool canpickup(int type)
|
|
|
|
{
|
|
|
|
return validitem(type);
|
|
|
|
}
|
|
|
|
|
|
|
|
void pickup(int type)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
void respawn()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
void spawnstate(int gamemode)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
struct gameent : dynent, gamestate
|
|
|
|
{
|
|
|
|
int weight; // affects the effectiveness of hitpush
|
2020-04-16 21:18:05 +00:00
|
|
|
int clientnum, lastupdate, plag, ping;
|
2020-04-15 16:39:17 +00:00
|
|
|
int lifesequence; // sequence id for each respawn, used in damage test
|
2020-04-17 18:19:42 +00:00
|
|
|
int respawned;
|
|
|
|
int lastaction;
|
2020-04-15 16:39:17 +00:00
|
|
|
editinfo *edit;
|
|
|
|
float deltayaw, deltapitch, deltaroll, newyaw, newpitch, newroll;
|
|
|
|
int smoothmillis;
|
|
|
|
|
|
|
|
string name, info;
|
|
|
|
int team, playermodel, playercolor;
|
|
|
|
int ownernum, lastnode;
|
|
|
|
|
|
|
|
vec muzzle;
|
|
|
|
|
2020-04-17 18:19:42 +00:00
|
|
|
gameent() : weight(100), clientnum(-1), lastupdate(0), plag(0), ping(0), lifesequence(0), respawned(-1), edit(NULL), smoothmillis(-1), team(0), playermodel(-1), playercolor(0), ownernum(-1), muzzle(-1, -1, -1)
|
2020-04-15 16:39:17 +00:00
|
|
|
{
|
|
|
|
name[0] = info[0] = 0;
|
|
|
|
respawn();
|
|
|
|
}
|
|
|
|
~gameent()
|
|
|
|
{
|
|
|
|
freeeditinfo(edit);
|
|
|
|
}
|
|
|
|
|
|
|
|
void respawn()
|
|
|
|
{
|
|
|
|
dynent::reset();
|
|
|
|
gamestate::respawn();
|
2020-04-17 18:19:42 +00:00
|
|
|
respawned = -1;
|
2020-04-15 16:39:17 +00:00
|
|
|
lastaction = 0;
|
|
|
|
lastnode = -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
int respawnwait(int secs, int delay = 0)
|
|
|
|
{
|
2020-04-17 18:19:42 +00:00
|
|
|
return 0;
|
2020-04-15 16:39:17 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void startgame()
|
|
|
|
{
|
|
|
|
lifesequence = -1;
|
2020-04-17 18:19:42 +00:00
|
|
|
respawned = -2;
|
2020-04-15 16:39:17 +00:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
struct teaminfo
|
|
|
|
{
|
|
|
|
int frags;
|
|
|
|
|
|
|
|
teaminfo() { reset(); }
|
|
|
|
|
|
|
|
void reset() { frags = 0; }
|
|
|
|
};
|
|
|
|
|
|
|
|
namespace entities
|
|
|
|
{
|
|
|
|
extern vector<extentity *> ents;
|
|
|
|
|
|
|
|
extern const char *entmdlname(int type);
|
|
|
|
extern const char *itemname(int i);
|
|
|
|
extern int itemicon(int i);
|
|
|
|
|
|
|
|
extern void preloadentities();
|
|
|
|
extern void renderentities();
|
|
|
|
extern void checkitems(gameent *d);
|
|
|
|
extern void resetspawns();
|
|
|
|
extern void spawnitems(bool force = false);
|
|
|
|
extern void putitems(packetbuf &p);
|
|
|
|
extern void setspawn(int i, bool on);
|
|
|
|
}
|
|
|
|
|
|
|
|
namespace game
|
|
|
|
{
|
|
|
|
struct clientmode
|
|
|
|
{
|
|
|
|
virtual ~clientmode() {}
|
|
|
|
|
|
|
|
virtual void preload() {}
|
|
|
|
virtual float clipconsole(float w, float h) { return 0; }
|
|
|
|
virtual void drawhud(gameent *d, int w, int h) {}
|
|
|
|
virtual void rendergame() {}
|
|
|
|
virtual void respawned(gameent *d) {}
|
|
|
|
virtual void setup() {}
|
|
|
|
virtual void checkitems(gameent *d) {}
|
|
|
|
virtual int respawnwait(gameent *d, int delay = 0) { return 0; }
|
2020-04-17 18:19:42 +00:00
|
|
|
virtual void pickspawn(gameent *d) { findplayerspawn(d, -1, 0); }
|
2020-04-15 16:39:17 +00:00
|
|
|
virtual void senditems(packetbuf &p) {}
|
|
|
|
virtual void removeplayer(gameent *d) {}
|
|
|
|
virtual void gameover() {}
|
|
|
|
virtual bool hidefrags() { return false; }
|
|
|
|
};
|
|
|
|
|
|
|
|
extern clientmode *cmode;
|
|
|
|
extern void setclientmode();
|
|
|
|
|
|
|
|
// game
|
|
|
|
extern string clientmap;
|
|
|
|
extern int maptime, maprealtime, maplimit;
|
|
|
|
extern gameent *player1;
|
|
|
|
extern vector<gameent *> players, clients;
|
|
|
|
extern int lastspawnattempt;
|
|
|
|
extern int lasthit;
|
|
|
|
extern int following;
|
|
|
|
extern int smoothmove, smoothdist;
|
|
|
|
|
|
|
|
extern bool clientoption(const char *arg);
|
|
|
|
extern gameent *getclient(int cn);
|
|
|
|
extern gameent *newclient(int cn);
|
|
|
|
extern const char *colorname(gameent *d, const char *name = NULL, const char *alt = NULL, const char *color = "");
|
|
|
|
extern gameent *pointatplayer();
|
|
|
|
extern gameent *hudplayer();
|
|
|
|
extern gameent *followingplayer(gameent *fallback = NULL);
|
|
|
|
extern void stopfollowing();
|
|
|
|
extern void checkfollow();
|
|
|
|
extern void nextfollow(int dir = 1);
|
|
|
|
extern void clientdisconnected(int cn, bool notify = true);
|
|
|
|
extern void clearclients(bool notify = true);
|
|
|
|
extern void startgame();
|
|
|
|
extern void spawnplayer(gameent *);
|
|
|
|
extern void deathstate(gameent *d, bool restore = false);
|
|
|
|
extern void timeupdate(int timeremain);
|
|
|
|
extern void msgsound(int n, physent *d = NULL);
|
|
|
|
|
|
|
|
// client
|
|
|
|
extern bool connected, remote, demoplayback;
|
|
|
|
extern string servdesc;
|
|
|
|
extern vector<uchar> messages;
|
|
|
|
|
|
|
|
extern int parseplayer(const char *arg);
|
|
|
|
extern bool addmsg(int type, const char *fmt = NULL, ...);
|
|
|
|
extern void sendmapinfo();
|
|
|
|
extern void changemap(const char *name, int mode);
|
|
|
|
extern void c2sinfo(bool force = false);
|
|
|
|
extern void sendposition(gameent *d, bool reliable = false);
|
|
|
|
|
|
|
|
// render
|
|
|
|
struct playermodelinfo
|
|
|
|
{
|
2020-04-17 18:19:42 +00:00
|
|
|
const char *model[1], *hudguns[1],
|
|
|
|
*icon[1];
|
2020-04-15 16:39:17 +00:00
|
|
|
bool ragdoll;
|
|
|
|
};
|
|
|
|
|
|
|
|
extern void saveragdoll(gameent *d);
|
|
|
|
extern void clearragdolls();
|
|
|
|
extern void moveragdolls();
|
|
|
|
extern const playermodelinfo &getplayermodelinfo(gameent *d);
|
|
|
|
extern int getplayercolor(gameent *d, int team);
|
|
|
|
extern int chooserandomplayermodel(int seed);
|
|
|
|
extern void syncplayer();
|
|
|
|
}
|
|
|
|
|
|
|
|
namespace server
|
|
|
|
{
|
|
|
|
extern void forcemap(const char *map, int mode);
|
|
|
|
extern void forcepaused(bool paused);
|
|
|
|
extern void forcegamespeed(int speed);
|
|
|
|
extern int msgsizelookup(int msg);
|
|
|
|
extern bool serveroption(const char *arg);
|
|
|
|
extern bool delayspawn(int type);
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|