2
0
mirror of https://github.com/rehlds/rehlds.git synced 2024-12-27 23:25:45 +03:00

Merge branch 'dreamstalker:master' into master

This commit is contained in:
pepepepito0147 2023-07-07 08:21:27 -04:00 committed by GitHub
commit 0621bef519
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
14 changed files with 87 additions and 34 deletions

View File

@ -277,7 +277,7 @@ jobs:
github.event.action == 'published' && github.event.action == 'published' &&
startsWith(github.ref, 'refs/tags/') startsWith(github.ref, 'refs/tags/')
run: | run: |
7z a -tzip rehlds-bin-${{ env.APP_VERSION }}.zip bin/linux32/ hlsdk/ 7z a -tzip rehlds-bin-${{ env.APP_VERSION }}.zip bin/ hlsdk/
7z a -t7z -m0=lzma2 -mx=9 -mfb=64 -aoa rehlds-dbg-${{ env.APP_VERSION }}.7z debug/ 7z a -t7z -m0=lzma2 -mx=9 -mfb=64 -aoa rehlds-dbg-${{ env.APP_VERSION }}.7z debug/
- name: Publish artifacts - name: Publish artifacts

View File

@ -170,7 +170,7 @@ byte *BSPModel::LeafPVS(mleaf_t *leaf)
byte *BSPModel::DecompressVis(unsigned char *in) byte *BSPModel::DecompressVis(unsigned char *in)
{ {
static unsigned char decompressed[MODEL_MAX_PVS]; static unsigned char decompressed[MAX_MAP_LEAFS / 8];
if (in == nullptr) { if (in == nullptr) {
return m_novis; return m_novis;
} }

View File

@ -32,6 +32,7 @@
#include "l_studio.h" #include "l_studio.h"
#include "edict.h" #include "edict.h"
#include "bspfile.h"
// values for model_t's needload // values for model_t's needload
#define NL_PRESENT 0 #define NL_PRESENT 0
@ -87,9 +88,7 @@ private:
protected: protected:
model_t m_model; model_t m_model;
byte m_novis[MAX_MAP_LEAFS / 8];
enum { MODEL_MAX_PVS = 1024 };
byte m_novis[MODEL_MAX_PVS];
byte *m_base; byte *m_base;
int m_visframecount; int m_visframecount;

View File

@ -31,17 +31,17 @@
unsigned char *gPAS; unsigned char *gPAS;
unsigned char *gPVS; unsigned char *gPVS;
int gPVSRowBytes; int gPVSRowBytes;
unsigned char mod_novis[MODEL_MAX_PVS]; unsigned char mod_novis[MAX_MAP_LEAFS / 8];
void Mod_Init(void) void Mod_Init(void)
{ {
SW_Mod_Init(); SW_Mod_Init();
Q_memset(mod_novis, 255, MODEL_MAX_PVS); Q_memset(mod_novis, 0xFF, MAX_MAP_LEAFS / 8);
} }
unsigned char *Mod_DecompressVis(unsigned char *in, model_t *model) unsigned char *Mod_DecompressVis(unsigned char *in, model_t *model)
{ {
static unsigned char decompressed[MODEL_MAX_PVS]; static unsigned char decompressed[MAX_MAP_LEAFS / 8];
if (in == NULL) if (in == NULL)
{ {

View File

@ -29,15 +29,10 @@
#pragma once #pragma once
#include "maintypes.h" #include "maintypes.h"
#include "model.h"
// Looks like no more than 8096 visibility leafs per world model
const int MODEL_MAX_PVS = 1024;
extern unsigned char *gPAS; extern unsigned char *gPAS;
extern unsigned char *gPVS; extern unsigned char *gPVS;
extern int gPVSRowBytes; extern int gPVSRowBytes;
extern unsigned char mod_novis[MODEL_MAX_PVS];
void Mod_Init(void); void Mod_Init(void);
unsigned char *Mod_DecompressVis(unsigned char *in, model_t *model); unsigned char *Mod_DecompressVis(unsigned char *in, model_t *model);

View File

@ -881,6 +881,15 @@ void EXT_FUNC AnimationAutomove(const edict_t *pEdict, float flTime)
void EXT_FUNC GetBonePosition(const edict_t *pEdict, int iBone, float *rgflOrigin, float *rgflAngles) void EXT_FUNC GetBonePosition(const edict_t *pEdict, int iBone, float *rgflOrigin, float *rgflAngles)
{ {
pstudiohdr = (studiohdr_t *)Mod_Extradata(g_psv.models[pEdict->v.modelindex]); pstudiohdr = (studiohdr_t *)Mod_Extradata(g_psv.models[pEdict->v.modelindex]);
#ifdef REHLDS_FIXES
if (!pstudiohdr)
return;
if (iBone < 0 || iBone >= pstudiohdr->numbones)
return; // invalid bone
#endif
g_pSvBlendingAPI->SV_StudioSetupBones( g_pSvBlendingAPI->SV_StudioSetupBones(
g_psv.models[pEdict->v.modelindex], g_psv.models[pEdict->v.modelindex],
pEdict->v.frame, pEdict->v.frame,
@ -906,14 +915,23 @@ void EXT_FUNC GetAttachment(const edict_t *pEdict, int iAttachment, float *rgflO
mstudioattachment_t *pattachment; mstudioattachment_t *pattachment;
vec3_t angles; vec3_t angles;
pstudiohdr = (studiohdr_t *)Mod_Extradata(g_psv.models[pEdict->v.modelindex]);
#ifdef REHLDS_FIXES
if (!pstudiohdr)
return;
if (iAttachment < 0 || iAttachment >= pstudiohdr->numattachments)
return; // invalid attachment
#endif
pattachment = (mstudioattachment_t *)((char *)pstudiohdr + pstudiohdr->attachmentindex);
pattachment += iAttachment;
angles[0] = -pEdict->v.angles[0]; angles[0] = -pEdict->v.angles[0];
angles[1] = pEdict->v.angles[1]; angles[1] = pEdict->v.angles[1];
angles[2] = pEdict->v.angles[2]; angles[2] = pEdict->v.angles[2];
pstudiohdr = (studiohdr_t *)Mod_Extradata(g_psv.models[pEdict->v.modelindex]);
pattachment = (mstudioattachment_t *)((char *)pstudiohdr + pstudiohdr->attachmentindex);
pattachment += iAttachment;
g_pSvBlendingAPI->SV_StudioSetupBones( g_pSvBlendingAPI->SV_StudioSetupBones(
g_psv.models[pEdict->v.modelindex], g_psv.models[pEdict->v.modelindex],
pEdict->v.frame, pEdict->v.frame,

View File

@ -408,7 +408,6 @@ enum GameType_e
extern GameType_e g_eGameType; extern GameType_e g_eGameType;
extern int fatbytes;
extern int giNextUserMsg; extern int giNextUserMsg;
extern int hashstrings_collisions; extern int hashstrings_collisions;
@ -421,10 +420,6 @@ extern delta_t *g_pweapondelta;
extern delta_t *g_pusercmddelta; extern delta_t *g_pusercmddelta;
#endif #endif
extern unsigned char fatpvs[1024];
extern int fatpasbytes;
extern unsigned char fatpas[1024];
extern int gPacketSuppressed; extern int gPacketSuppressed;
extern char localinfo[MAX_LOCALINFO]; extern char localinfo[MAX_LOCALINFO];

View File

@ -683,22 +683,22 @@ qboolean SV_BuildSoundMsg(edict_t *entity, int channel, const char *sample, int
if (volume < 0 || volume > 255) if (volume < 0 || volume > 255)
{ {
Con_Printf("%s: volume = %i", __func__, volume); Con_Printf("%s: volume = %i\n", __func__, volume);
volume = (volume < 0) ? 0 : 255; volume = (volume < 0) ? 0 : 255;
} }
if (attenuation < 0.0f || attenuation > 4.0f) if (attenuation < 0.0f || attenuation > 4.0f)
{ {
Con_Printf("%s: attenuation = %f", __func__, attenuation); Con_Printf("%s: attenuation = %f\n", __func__, attenuation);
attenuation = (attenuation < 0.0f) ? 0.0f : 4.0f; attenuation = (attenuation < 0.0f) ? 0.0f : 4.0f;
} }
if (channel < 0 || channel > 7) if (channel < 0 || channel > 7)
{ {
Con_Printf("%s: channel = %i", __func__, channel); Con_Printf("%s: channel = %i\n", __func__, channel);
channel = (channel < 0) ? CHAN_AUTO : CHAN_NETWORKVOICE_BASE; channel = (channel < 0) ? CHAN_AUTO : CHAN_NETWORKVOICE_BASE;
} }
if (pitch < 0 || pitch > 255) if (pitch < 0 || pitch > 255)
{ {
Con_Printf("%s: pitch = %i", __func__, pitch); Con_Printf("%s: pitch = %i\n", __func__, pitch);
pitch = (pitch < 0) ? 0 : 255; pitch = (pitch < 0) ? 0 : 255;
} }
@ -710,7 +710,7 @@ qboolean SV_BuildSoundMsg(edict_t *entity, int channel, const char *sample, int
sound_num = Q_atoi(sample + 1); sound_num = Q_atoi(sample + 1);
if (sound_num >= CVOXFILESENTENCEMAX) if (sound_num >= CVOXFILESENTENCEMAX)
{ {
Con_Printf("%s: invalid sentence number: %s", __func__, sample + 1); Con_Printf("%s: invalid sentence number: %s\n", __func__, sample + 1);
return FALSE; return FALSE;
} }
} }
@ -1115,8 +1115,18 @@ void SV_SendServerinfo_internal(sizebuf_t *msg, client_t *client)
else else
MSG_WriteByte(msg, 0); MSG_WriteByte(msg, 0);
COM_FileBase(com_gamedir, message); const char *pszGameDir = message;
MSG_WriteString(msg, message);
#ifdef REHLDS_FIXES
// Give the client a chance to connect in to the server with different game
const char *gd = Info_ValueForKey(client->userinfo, "_gd");
if (gd[0])
pszGameDir = gd;
else
#endif
COM_FileBase(com_gamedir, message);
MSG_WriteString(msg, pszGameDir);
MSG_WriteString(msg, Cvar_VariableString("hostname")); MSG_WriteString(msg, Cvar_VariableString("hostname"));
MSG_WriteString(msg, g_psv.modelname); MSG_WriteString(msg, g_psv.modelname);
@ -4033,9 +4043,10 @@ void SV_EmitEvents_internal(client_t *cl, packet_entities_t *pack, sizebuf_t *ms
} }
int fatbytes; int fatbytes;
unsigned char fatpvs[1024]; unsigned char fatpvs[MAX_MAP_LEAFS / 8];
int fatpasbytes; int fatpasbytes;
unsigned char fatpas[1024]; unsigned char fatpas[MAX_MAP_LEAFS / 8];
void SV_AddToFatPVS(vec_t *org, mnode_t *node) void SV_AddToFatPVS(vec_t *org, mnode_t *node)
{ {
@ -4077,6 +4088,9 @@ unsigned char* EXT_FUNC SV_FatPVS(float *org)
#endif // REHLDS_FIXES #endif // REHLDS_FIXES
fatbytes = (g_psv.worldmodel->numleafs + 31) >> 3; fatbytes = (g_psv.worldmodel->numleafs + 31) >> 3;
if (fatbytes >= (MAX_MAP_LEAFS / 8))
Sys_Error("%s: MAX_MAP_LEAFS limit exceeded\n", __func__);
Q_memset(fatpvs, 0, fatbytes); Q_memset(fatpvs, 0, fatbytes);
SV_AddToFatPVS(org, g_psv.worldmodel->nodes); SV_AddToFatPVS(org, g_psv.worldmodel->nodes);
return fatpvs; return fatpvs;
@ -4134,6 +4148,9 @@ unsigned char* EXT_FUNC SV_FatPAS(float *org)
#endif // REHLDS_FIXES #endif // REHLDS_FIXES
fatpasbytes = (g_psv.worldmodel->numleafs + 31) >> 3; fatpasbytes = (g_psv.worldmodel->numleafs + 31) >> 3;
if (fatpasbytes >= (MAX_MAP_LEAFS / 8))
Sys_Error("%s: MAX_MAP_LEAFS limit exceeded\n", __func__);
Q_memset(fatpas, 0, fatpasbytes); Q_memset(fatpas, 0, fatpasbytes);
SV_AddToFatPAS(org, g_psv.worldmodel->nodes); SV_AddToFatPAS(org, g_psv.worldmodel->nodes);
return fatpas; return fatpas;
@ -6158,7 +6175,7 @@ int SV_SpawnServer(qboolean bIsDemo, char *server, char *startspot)
if (g_psvs.maxclients <= 1) if (g_psvs.maxclients <= 1)
{ {
int row = (g_psv.worldmodel->numleafs + 7) / 8; int row = (g_psv.worldmodel->numleafs + 7) / 8;
if (row < 0 || row > MODEL_MAX_PVS) if (row < 0 || row > (MAX_MAP_LEAFS / 8))
{ {
Sys_Error("%s: oversized g_psv.worldmodel->numleafs: %i", __func__, g_psv.worldmodel->numleafs); Sys_Error("%s: oversized g_psv.worldmodel->numleafs: %i", __func__, g_psv.worldmodel->numleafs);
} }

View File

@ -511,6 +511,14 @@ void SV_CopyEdictToPhysent(physent_t *pe, int e, edict_t *check)
pe->vuser4[2] = check->v.vuser4[2]; pe->vuser4[2] = check->v.vuser4[2];
} }
bool EXT_FUNC SV_AllowPhysent_mod(edict_t* check, edict_t* sv_player) {
return true;
}
bool SV_AllowPhysent(edict_t* check, edict_t* sv_player) {
return g_RehldsHookchains.m_SV_AllowPhysent.callChain(SV_AllowPhysent_mod, check, sv_player);
}
void SV_AddLinksToPM_(areanode_t *node, float *pmove_mins, float *pmove_maxs) void SV_AddLinksToPM_(areanode_t *node, float *pmove_mins, float *pmove_maxs)
{ {
struct link_s *l; struct link_s *l;
@ -547,6 +555,11 @@ void SV_AddLinksToPM_(areanode_t *node, float *pmove_mins, float *pmove_maxs)
if (check->v.solid != SOLID_BSP && check->v.solid != SOLID_BBOX && check->v.solid != SOLID_SLIDEBOX && check->v.solid != SOLID_NOT) if (check->v.solid != SOLID_BSP && check->v.solid != SOLID_BBOX && check->v.solid != SOLID_SLIDEBOX && check->v.solid != SOLID_NOT)
continue; continue;
// Apply our own custom checks
if (!SV_AllowPhysent(check, sv_player)) {
continue;
}
e = NUM_FOR_EDICT(check); e = NUM_FOR_EDICT(check);
ve = &pmove->visents[pmove->numvisent]; ve = &pmove->visents[pmove->numvisent];
pmove->numvisent = pmove->numvisent + 1; pmove->numvisent = pmove->numvisent + 1;

View File

@ -32,6 +32,7 @@
#define HLBSP_VERSION 30 // half-life regular version #define HLBSP_VERSION 30 // half-life regular version
#define MAX_MAP_HULLS 4 #define MAX_MAP_HULLS 4
#define MAX_MAP_LEAFS 32767 // signed short limit
#define CONTENTS_ORIGIN -7 // removed at csg time #define CONTENTS_ORIGIN -7 // removed at csg time
#define CONTENTS_CLIP -8 // changed to contents_solid #define CONTENTS_CLIP -8 // changed to contents_solid

View File

@ -37,7 +37,7 @@
#include "pr_dlls.h" #include "pr_dlls.h"
#define REHLDS_API_VERSION_MAJOR 3 #define REHLDS_API_VERSION_MAJOR 3
#define REHLDS_API_VERSION_MINOR 12 #define REHLDS_API_VERSION_MINOR 13
//Steam_NotifyClientConnect hook //Steam_NotifyClientConnect hook
typedef IHookChain<qboolean, IGameClient*, const void*, unsigned int> IRehldsHook_Steam_NotifyClientConnect; typedef IHookChain<qboolean, IGameClient*, const void*, unsigned int> IRehldsHook_Steam_NotifyClientConnect;
@ -255,6 +255,10 @@ typedef IVoidHookChainRegistry<resourcetype_t, const char *, int, unsigned char,
typedef IVoidHookChain<const char *> IRehldsHook_SV_ClientPrintf; typedef IVoidHookChain<const char *> IRehldsHook_SV_ClientPrintf;
typedef IVoidHookChainRegistry<const char *> IRehldsHookRegistry_SV_ClientPrintf; typedef IVoidHookChainRegistry<const char *> IRehldsHookRegistry_SV_ClientPrintf;
//SV_AllowPhysent hook
typedef IHookChain<bool, edict_t*, edict_t*> IRehldsHook_SV_AllowPhysent;
typedef IHookChainRegistry<bool, edict_t*, edict_t*> IRehldsHookRegistry_SV_AllowPhysent;
class IRehldsHookchains { class IRehldsHookchains {
public: public:
virtual ~IRehldsHookchains() { } virtual ~IRehldsHookchains() { }
@ -313,6 +317,7 @@ public:
virtual IRehldsHookRegistry_EV_Precache* EV_Precache() = 0; virtual IRehldsHookRegistry_EV_Precache* EV_Precache() = 0;
virtual IRehldsHookRegistry_SV_AddResource* SV_AddResource() = 0; virtual IRehldsHookRegistry_SV_AddResource* SV_AddResource() = 0;
virtual IRehldsHookRegistry_SV_ClientPrintf* SV_ClientPrintf() = 0; virtual IRehldsHookRegistry_SV_ClientPrintf* SV_ClientPrintf() = 0;
virtual IRehldsHookRegistry_SV_AllowPhysent* SV_AllowPhysent() = 0;
}; };
struct RehldsFuncs_t { struct RehldsFuncs_t {

View File

@ -879,6 +879,10 @@ IRehldsHookRegistry_SV_ClientPrintf* CRehldsHookchains::SV_ClientPrintf(){
return &m_SV_ClientPrintf; return &m_SV_ClientPrintf;
} }
IRehldsHookRegistry_SV_AllowPhysent* CRehldsHookchains::SV_AllowPhysent() {
return &m_SV_AllowPhysent;
}
int EXT_FUNC CRehldsApi::GetMajorVersion() int EXT_FUNC CRehldsApi::GetMajorVersion()
{ {
return REHLDS_API_VERSION_MAJOR; return REHLDS_API_VERSION_MAJOR;

View File

@ -250,6 +250,10 @@ typedef IVoidHookChainRegistryImpl<resourcetype_t, const char*, int, unsigned ch
typedef IVoidHookChainImpl<const char*> CRehldsHook_SV_ClientPrintf; typedef IVoidHookChainImpl<const char*> CRehldsHook_SV_ClientPrintf;
typedef IVoidHookChainRegistryImpl<const char*> CRehldsHookRegistry_SV_ClientPrintf; typedef IVoidHookChainRegistryImpl<const char*> CRehldsHookRegistry_SV_ClientPrintf;
//SV_AllowPhysent hook
typedef IHookChainImpl<bool, edict_t*, edict_t*> CRehldsHook_SV_AllowPhysent;
typedef IHookChainRegistryImpl<bool, edict_t*, edict_t*> CRehldsHookRegistry_SV_AllowPhysent;
class CRehldsHookchains : public IRehldsHookchains { class CRehldsHookchains : public IRehldsHookchains {
public: public:
CRehldsHookRegistry_Steam_NotifyClientConnect m_Steam_NotifyClientConnect; CRehldsHookRegistry_Steam_NotifyClientConnect m_Steam_NotifyClientConnect;
@ -306,6 +310,7 @@ public:
CRehldsHookRegistry_EV_Precache m_EV_Precache; CRehldsHookRegistry_EV_Precache m_EV_Precache;
CRehldsHookRegistry_SV_AddResource m_SV_AddResource; CRehldsHookRegistry_SV_AddResource m_SV_AddResource;
CRehldsHookRegistry_SV_ClientPrintf m_SV_ClientPrintf; CRehldsHookRegistry_SV_ClientPrintf m_SV_ClientPrintf;
CRehldsHookRegistry_SV_AllowPhysent m_SV_AllowPhysent;
public: public:
EXT_FUNC virtual IRehldsHookRegistry_Steam_NotifyClientConnect* Steam_NotifyClientConnect(); EXT_FUNC virtual IRehldsHookRegistry_Steam_NotifyClientConnect* Steam_NotifyClientConnect();
@ -362,6 +367,7 @@ public:
EXT_FUNC virtual IRehldsHookRegistry_EV_Precache* EV_Precache(); EXT_FUNC virtual IRehldsHookRegistry_EV_Precache* EV_Precache();
EXT_FUNC virtual IRehldsHookRegistry_SV_AddResource* SV_AddResource(); EXT_FUNC virtual IRehldsHookRegistry_SV_AddResource* SV_AddResource();
EXT_FUNC virtual IRehldsHookRegistry_SV_ClientPrintf* SV_ClientPrintf(); EXT_FUNC virtual IRehldsHookRegistry_SV_ClientPrintf* SV_ClientPrintf();
EXT_FUNC virtual IRehldsHookRegistry_SV_AllowPhysent* SV_AllowPhysent();
}; };
extern CRehldsHookchains g_RehldsHookchains; extern CRehldsHookchains g_RehldsHookchains;

View File

@ -6,5 +6,5 @@
#pragma once #pragma once
#define VERSION_MAJOR 3 #define VERSION_MAJOR 3
#define VERSION_MINOR 12 #define VERSION_MINOR 13
#define VERSION_MAINTENANCE 0 #define VERSION_MAINTENANCE 0