mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-03-09 19:01:00 +00:00
- add MAX_NET_EDICTS and MAX_NET_EDICTS_MASK defines, which are 512 and 511 respectively - change baselines to access the array directly, rather than through the entity's "data" field - cleanup SV_ReliableSVC_Emit - add entity remapping. the entity number used internally in the server no longer matches the number sent to the client, and it releases the mapping after 10 seconds of inuse, so there's no "512 entity limit" anymore. Still the MAX_EDICTS limit though, which is currently 768, but it can probably be defined to something much higher without any trouble.
260 lines
7.5 KiB
C
260 lines
7.5 KiB
C
/*
|
|
protocol.h
|
|
|
|
(description)
|
|
|
|
Copyright (C) 1996-1997 Id Software, Inc.
|
|
|
|
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
|
|
|
|
$Id$
|
|
*/
|
|
// protocol.h -- communications protocols
|
|
|
|
#ifndef PROTOCOL_H
|
|
#define PROTOCOL_H
|
|
|
|
#include "QF/mathlib.h"
|
|
|
|
#define PROTOCOL_VERSION 28
|
|
|
|
#define QW_CHECK_HASH 0x5157
|
|
|
|
//=========================================
|
|
|
|
#define PORT_CLIENT "27001"
|
|
#define PORT_MASTER 27000
|
|
#define PORT_SERVER 27500
|
|
|
|
//=========================================
|
|
|
|
// out of band message id bytes
|
|
|
|
// M = master, S = server, C = client, A = any
|
|
// the second character will always be \n if the message isn't a single
|
|
// byte long (?? not true anymore?)
|
|
|
|
#define S2C_CHALLENGE 'c'
|
|
#define S2C_CONNECTION 'j'
|
|
#define A2A_PING 'k' // respond with an A2A_ACK
|
|
#define A2A_ACK 'l' // general acknowledgement without info
|
|
#define A2A_NACK 'm' // [+ comment] general failure
|
|
#define A2A_ECHO 'e' // for echoing
|
|
#define A2C_PRINT 'n' // print a message on client
|
|
|
|
#define S2M_HEARTBEAT 'a' // + serverinfo + userlist + fraglist
|
|
#define A2C_CLIENT_COMMAND 'B' // + command line
|
|
#define S2M_SHUTDOWN 'C'
|
|
|
|
#define M2C_MASTER_REPLY 'd' // + \n + qw server port list
|
|
|
|
//==================
|
|
// note that there are some defs.qc that mirror to these numbers
|
|
// also related to svc_strings[] in cl_parse
|
|
//==================
|
|
|
|
|
|
//==============================================
|
|
|
|
// playerinfo flags from server
|
|
// playerinfo always sends: playernum, flags, origin[] and framenumber
|
|
|
|
#define PF_MSEC (1<<0)
|
|
#define PF_COMMAND (1<<1)
|
|
#define PF_VELOCITY1 (1<<2)
|
|
#define PF_VELOCITY2 (1<<3)
|
|
#define PF_VELOCITY3 (1<<4)
|
|
#define PF_MODEL (1<<5)
|
|
#define PF_SKINNUM (1<<6)
|
|
#define PF_EFFECTS (1<<7)
|
|
#define PF_WEAPONFRAME (1<<8) // only sent for view player
|
|
#define PF_DEAD (1<<9) // don't block movement any more
|
|
#define PF_GIB (1<<10) // offset the view height differently
|
|
#define PF_NOGRAV (1<<11) // don't apply gravity for prediction
|
|
|
|
//==============================================
|
|
|
|
// if the high bit of the client to server byte is set, the low bits are
|
|
// client move cmd bits
|
|
// ms and angle2 are always sent, the others are optional
|
|
#define CM_ANGLE1 (1<<0)
|
|
#define CM_ANGLE3 (1<<1)
|
|
#define CM_FORWARD (1<<2)
|
|
#define CM_SIDE (1<<3)
|
|
#define CM_UP (1<<4)
|
|
#define CM_BUTTONS (1<<5)
|
|
#define CM_IMPULSE (1<<6)
|
|
#define CM_ANGLE2 (1<<7)
|
|
|
|
//==============================================
|
|
|
|
// the first 16 bits of a packetentities update holds 9 bits
|
|
// of entity number and 7 bits of flags
|
|
#define U_ORIGIN1 (1<<9)
|
|
#define U_ORIGIN2 (1<<10)
|
|
#define U_ORIGIN3 (1<<11)
|
|
#define U_ANGLE2 (1<<12)
|
|
#define U_FRAME (1<<13)
|
|
#define U_REMOVE (1<<14) // REMOVE this entity, don't add it
|
|
#define U_MOREBITS (1<<15)
|
|
|
|
// if MOREBITS is set, these additional flags are read in next
|
|
#define U_ANGLE1 (1<<0)
|
|
#define U_ANGLE3 (1<<1)
|
|
#define U_MODEL (1<<2)
|
|
#define U_COLORMAP (1<<3)
|
|
#define U_SKIN (1<<4)
|
|
#define U_EFFECTS (1<<5)
|
|
#define U_SOLID (1<<6) // the entity should be solid for prediction
|
|
|
|
///////////////////////////////////////////////////////////////////////////
|
|
// QSG Protocol Extensions (Version 2)
|
|
// Network definitions for the engine
|
|
|
|
#define U_EXTEND1 (1<<7)
|
|
|
|
// LordHavoc: would be U_DELTA here (as in DarkPlaces), but in QW everything is delta compressed...
|
|
#define U_ALPHA (1<<17) // 1 byte, 0.0-1.0 = 0-255 (Unsent if 1)
|
|
#define U_SCALE (1<<18) // 1 byte, scale / 16 positive, (Unsent if 1)
|
|
#define U_EFFECTS2 (1<<19) // 1 byte, .effects & 0xFF00
|
|
#define U_GLOWSIZE (1<<20) // 1 byte, float/8.0, signed. Unsent if 1
|
|
#define U_GLOWCOLOR (1<<21) // 1 byte, palette index, default, 254.
|
|
#define U_COLORMOD (1<<22) // 1 byte, rrrgggbb. Model tinting
|
|
#define U_EXTEND2 (1<<23) // Another byte to follow
|
|
|
|
#define U_GLOWTRAIL (1<<24) // Leave U_GLOW* trail
|
|
#define U_VIEWMODEL (1<<25) // Attach model to view (relative). Owner only
|
|
#define U_FRAME2 (1<<26) // 1 byte .frame & 0xFF00 (second byte)
|
|
#define U_UNUSED27 (1<<27) // future expansion
|
|
#define U_UNUSED28 (1<<28) // future expansion
|
|
#define U_UNUSED29 (1<<29) // future expansion
|
|
#define U_UNUSED30 (1<<30) // future expansion
|
|
#define U_EXTEND3 (1<<31) // another byte to follow, future expansion
|
|
|
|
|
|
#define U_GROUP_ORIG (U_ORIGIN1 | U_ORIGIN2 | U_ORIGIN3 | \
|
|
U_ANGLE2 | U_FRAME | U_REMOVE | U_MOREBITS)
|
|
#define U_GROUP_MOREBITS (U_ANGLE1 | U_ANGLE3 | U_MODEL | \
|
|
U_COLORMAP | U_SKIN | U_EFFECTS | \
|
|
U_SOLID | U_EXTEND1)
|
|
#define U_GROUP_EXTEND1 (U_ALPHA | U_SCALE | U_EFFECTS2 | \
|
|
U_GLOWSIZE | U_GLOWCOLOR | U_COLORMOD | \
|
|
U_EXTEND2)
|
|
#define U_GROUP_EXTEND2 (U_GLOWTRAIL | U_VIEWMODEL | U_FRAME2)
|
|
// I skip the UNUSED and EXTEND3 bits because although they exist in
|
|
// QSG2, they're not usable
|
|
|
|
#define U_VERSION_ID ((U_GROUP_ORIG | U_GROUP_MOREBITS) & ~U_EXTEND1)
|
|
#define U_VERSION_QSG2 (U_VERSION_ID | U_EXTEND1 | U_GROUP_EXTEND1 | \
|
|
U_GROUP_EFFECTS2)
|
|
//==============================================
|
|
|
|
// a sound with no channel is a local only sound
|
|
// the sound field has bits 0-2: channel, 3-12: entity
|
|
#define SND_VOLUME (1<<15) // a byte
|
|
#define SND_ATTENUATION (1<<14) // a byte
|
|
|
|
// svc_qwprint messages have an id, so messages can be filtered
|
|
#define PRINT_LOW 0
|
|
#define PRINT_MEDIUM 1
|
|
#define PRINT_HIGH 2
|
|
#define PRINT_CHAT 3 // also go to chat buffer
|
|
|
|
//
|
|
// temp entity events
|
|
//
|
|
#define TE_SPIKE 0
|
|
#define TE_SUPERSPIKE 1
|
|
#define TE_GUNSHOT 2
|
|
#define TE_EXPLOSION 3
|
|
#define TE_TAREXPLOSION 4
|
|
#define TE_LIGHTNING1 5
|
|
#define TE_LIGHTNING2 6
|
|
#define TE_WIZSPIKE 7
|
|
#define TE_KNIGHTSPIKE 8
|
|
#define TE_LIGHTNING3 9
|
|
#define TE_LAVASPLASH 10
|
|
#define TE_TELEPORT 11
|
|
#define TE_BLOOD 12
|
|
#define TE_LIGHTNINGBLOOD 13
|
|
#define TE_EXPLOSION2 16
|
|
// PGM 01/21/97
|
|
#define TE_BEAM 17
|
|
// PGM 01/21/97
|
|
|
|
|
|
/*
|
|
==========================================================
|
|
|
|
ELEMENTS COMMUNICATED ACROSS THE NET
|
|
|
|
==========================================================
|
|
*/
|
|
|
|
#define MAX_CLIENTS 32
|
|
|
|
#define MAX_NET_EDICTS 512
|
|
#define MAX_NET_EDICTS_MASK (MAX_NET_EDICTS - 1)
|
|
|
|
#define UPDATE_BACKUP 64 // copies of entity_state_t to keep buffered
|
|
// must be power of two
|
|
#define UPDATE_MASK (UPDATE_BACKUP-1)
|
|
|
|
// entity_state_t is the information conveyed from the server
|
|
// in an update message
|
|
typedef struct
|
|
{
|
|
int number; // edict index
|
|
|
|
int flags; // nolerp, etc
|
|
vec3_t origin;
|
|
vec3_t angles;
|
|
int modelindex;
|
|
int frame;
|
|
int colormap;
|
|
int skinnum;
|
|
int effects;
|
|
|
|
// LordHavoc: Endy neglected to mark this as a QSG version 2 thingy...
|
|
byte alpha;
|
|
byte scale;
|
|
byte glow_size;
|
|
byte glow_color;
|
|
byte colormod;
|
|
} entity_state_t;
|
|
|
|
|
|
#define MAX_PACKET_ENTITIES 64 // doesn't count nails
|
|
typedef struct
|
|
{
|
|
int num_entities;
|
|
entity_state_t entities[MAX_PACKET_ENTITIES];
|
|
} packet_entities_t;
|
|
|
|
typedef struct usercmd_s
|
|
{
|
|
byte msec;
|
|
byte padding[3]; // make sure non-aligning compilers get it right
|
|
vec3_t angles;
|
|
short forwardmove, sidemove, upmove;
|
|
byte buttons;
|
|
byte impulse;
|
|
} usercmd_t;
|
|
|
|
#endif // PROTOCOL_H
|