2
0
mirror of https://github.com/rehlds/rehlds.git synced 2025-04-04 08:39:05 +03:00
rehlds/rehlds/engine/delta.h
2017-11-30 00:25:14 +03:00

181 lines
6.9 KiB
C++

/*
*
* 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 the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game Engine ("HL
* Engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL Engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*
*/
#pragma once
#include "maintypes.h"
const int DELTA_MAX_FIELDS = 56; // 7*8
enum
{
DT_BYTE = BIT(0), // A byte
DT_SHORT = BIT(1), // 2 byte field
DT_FLOAT = BIT(2), // A floating point field
DT_INTEGER = BIT(3), // 4 byte integer
DT_ANGLE = BIT(4), // A floating point angle
DT_TIMEWINDOW_8 = BIT(5), // A floating point timestamp relative to server time
DT_TIMEWINDOW_BIG = BIT(6), // A floating point timestamp relative to server time (with more precision and custom multiplier)
DT_STRING = BIT(7), // A null terminated string, sent as 8 byte chars
DT_SIGNED = BIT(31) // sign modificator
};
const int FDT_MARK = BIT(0); // Delta mark for sending
typedef struct delta_s delta_t;
typedef void(*encoder_t)(delta_t *, const unsigned char *, const unsigned char *);
typedef struct delta_stats_s
{
int sendcount;
int receivedcount;
} delta_stats_t;
typedef struct delta_description_s
{
int fieldType;
char fieldName[32];
int fieldOffset;
short int fieldSize;
int significant_bits;
float premultiply;
float postmultiply;
short int flags;
delta_stats_t stats;
} delta_description_t;
class CDeltaJit;
union delta_marked_mask_t {
uint8 u8[8];
uint32 u32[2];
uint64 u64;
};
typedef struct delta_s
{
int dynamic;
int fieldCount;
char conditionalencodename[32];
encoder_t conditionalencode;
delta_description_t *pdd;
#if defined(REHLDS_JIT)
CDeltaJit* jit;
#elif defined(REHLDS_FIXES)
delta_marked_mask_t originalMarkedFieldsMask;
#endif
} delta_t;
typedef struct delta_encoder_s delta_encoder_t;
struct delta_encoder_s
{
delta_encoder_t *next;
char *name;
encoder_t conditionalencode;
};
typedef struct delta_link_s delta_link_t;
typedef struct delta_definition_s delta_definition_t;
typedef struct delta_definition_list_s delta_definition_list_t;
typedef struct delta_registry_s delta_registry_t;
typedef struct delta_info_s delta_info_t;
typedef struct delta_info_s
{
delta_info_s *next;
char *name;
char *loadfile;
delta_t *delta;
} delta_info_t;
#ifdef HOOK_ENGINE
#define g_defs (*pg_defs)
#define g_encoders (*pg_encoders)
#define g_deltaregistry (*pg_deltaregistry)
#endif // HOOK_ENGINE
extern delta_definition_list_t *g_defs;
extern delta_encoder_t *g_encoders;
extern delta_registry_t *g_deltaregistry;
extern delta_t g_MetaDelta[];
delta_description_t *DELTA_FindField(delta_t *pFields, const char *pszField);
int DELTA_FindFieldIndex(struct delta_s *pFields, const char *fieldname);
void DELTA_SetField(struct delta_s *pFields, const char *fieldname);
void DELTA_UnsetField(struct delta_s *pFields, const char *fieldname);
void DELTA_SetFieldByIndex(struct delta_s *pFields, int fieldNumber);
void DELTA_UnsetFieldByIndex(struct delta_s *pFields, int fieldNumber);
void DELTA_ClearFlags(delta_t *pFields);
int DELTA_TestDelta(unsigned char *from, unsigned char *to, delta_t *pFields);
int DELTA_CountSendFields(delta_t *pFields);
void DELTA_MarkSendFields(unsigned char *from, unsigned char *to, delta_t *pFields);
void DELTA_SetSendFlagBits(delta_t *pFields, int *bits, int *bytecount);
qboolean DELTA_IsFieldMarked(delta_t* pFields, int fieldNumber);
void DELTA_WriteMarkedFields(unsigned char *from, unsigned char *to, delta_t *pFields);
qboolean DELTA_CheckDelta(unsigned char *from, unsigned char *to, delta_t *pFields);
#ifdef REHLDS_FIXES //Fix for https://github.com/dreamstalker/rehlds/issues/24
qboolean DELTA_WriteDeltaForceMask(unsigned char *from, unsigned char *to, qboolean force, delta_t *pFields, void(*callback)(void), void* pForceMask);
uint64 DELTA_GetOriginalMask(delta_t* pFields);
uint64 DELTA_GetMaskU64(delta_t* pFields);
#endif
qboolean DELTA_WriteDelta(unsigned char *from, unsigned char *to, qboolean force, delta_t *pFields, void(*callback)(void));
qboolean _DELTA_WriteDelta(unsigned char *from, unsigned char *to, qboolean force, delta_t *pFields, void(*callback)(void), qboolean sendfields);
int DELTA_ParseDelta(unsigned char *from, unsigned char *to, delta_t *pFields);
void DELTA_AddEncoder(const char *name, void(*conditionalencode)(struct delta_s *, const unsigned char *, const unsigned char *));
void DELTA_ClearEncoders(void);
encoder_t DELTA_LookupEncoder(char *name);
int DELTA_CountLinks(delta_link_t *plinks);
void DELTA_ReverseLinks(delta_link_t **plinks);
void DELTA_ClearLinks(delta_link_t **plinks);
delta_t *DELTA_BuildFromLinks(delta_link_t **pplinks);
int DELTA_FindOffset(int count, delta_definition_t *pdef, char *fieldname);
qboolean DELTA_ParseType(delta_description_t *pdelta, char **pstream);
qboolean DELTA_ParseField(int count, delta_definition_t *pdefinition, delta_link_t *pField, char **pstream);
void DELTA_FreeDescription(delta_t **ppdesc);
void DELTA_AddDefinition(char *name, delta_definition_t *pdef, int numelements);
void DELTA_ClearDefinitions(void);
delta_definition_t *DELTA_FindDefinition(char *name, int *count);
void DELTA_SkipDescription(char **pstream);
qboolean DELTA_ParseOneField(char **ppstream, delta_link_t **pplist, int count, delta_definition_t *pdefinition);
qboolean DELTA_ParseDescription(char *name, delta_t **ppdesc, char *pstream);
qboolean DELTA_Load(char *name, delta_t **ppdesc, char *pszFile);
void DELTA_RegisterDescription(char *name);
void DELTA_ClearRegistrations(void);
delta_t **DELTA_LookupRegistration(const char *name);
void DELTA_ClearStats(delta_t *p);
void DELTA_ClearStats_f(void);
void DELTA_PrintStats(const char *name, delta_t *p);
void DELTA_DumpStats_f(void);
void DELTA_Init(void);
void DELTA_Shutdown(void);