forked from CSSZombieEscape/sm-ext-CSSFixes
PhysboxToClientMap
This commit is contained in:
parent
94c4240638
commit
13b3e36e4b
@ -264,13 +264,13 @@ DETOUR_DECL_MEMBER2(DETOUR_KeyValue, bool, const char *, szKeyName, const char *
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Ignore players in +USE trace */
|
/* Ignore players in +USE trace */
|
||||||
bool gv_InFindUseEntity = false;
|
bool g_InFindUseEntity = false;
|
||||||
DETOUR_DECL_MEMBER0(DETOUR_FindUseEntity, CBaseEntity *)
|
DETOUR_DECL_MEMBER0(DETOUR_FindUseEntity, CBaseEntity *)
|
||||||
{
|
{
|
||||||
// Signal CTraceFilterSimple that we are in FindUseEntity
|
// Signal CTraceFilterSimple that we are in FindUseEntity
|
||||||
gv_InFindUseEntity = true;
|
g_InFindUseEntity = true;
|
||||||
CBaseEntity *pEntity = DETOUR_MEMBER_CALL(DETOUR_FindUseEntity)();
|
CBaseEntity *pEntity = DETOUR_MEMBER_CALL(DETOUR_FindUseEntity)();
|
||||||
gv_InFindUseEntity = false;
|
g_InFindUseEntity = false;
|
||||||
return pEntity;
|
return pEntity;
|
||||||
}
|
}
|
||||||
DETOUR_DECL_MEMBER3(DETOUR_CTraceFilterSimple, void, const IHandleEntity *, passedict, int, collisionGroup, ShouldHitFunc_t, pExtraShouldHitFunc)
|
DETOUR_DECL_MEMBER3(DETOUR_CTraceFilterSimple, void, const IHandleEntity *, passedict, int, collisionGroup, ShouldHitFunc_t, pExtraShouldHitFunc)
|
||||||
@ -278,34 +278,37 @@ DETOUR_DECL_MEMBER3(DETOUR_CTraceFilterSimple, void, const IHandleEntity *, pass
|
|||||||
DETOUR_MEMBER_CALL(DETOUR_CTraceFilterSimple)(passedict, collisionGroup, pExtraShouldHitFunc);
|
DETOUR_MEMBER_CALL(DETOUR_CTraceFilterSimple)(passedict, collisionGroup, pExtraShouldHitFunc);
|
||||||
|
|
||||||
// If we're in FindUseEntity right now then switch out the VTable
|
// If we're in FindUseEntity right now then switch out the VTable
|
||||||
if(gv_InFindUseEntity)
|
if(g_InFindUseEntity)
|
||||||
*(uintptr_t *)this = g_CTraceFilterNoNPCsOrPlayer;
|
*(uintptr_t *)this = g_CTraceFilterNoNPCsOrPlayer;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Make bullets ignore teammates */
|
/* Make bullets ignore teammates */
|
||||||
bool gv_InFireBullets = false;
|
char *g_pPhysboxToClientMap = NULL;
|
||||||
int gv_FireBulletPlayerTeam = 0;
|
bool g_InFireBullets = false;
|
||||||
|
int g_FireBulletPlayerTeam = 0;
|
||||||
SH_DECL_HOOK2(CTraceFilterSkipTwoEntities, ShouldHitEntity, SH_NOATTRIB, 0, bool, IHandleEntity *, int);
|
SH_DECL_HOOK2(CTraceFilterSkipTwoEntities, ShouldHitEntity, SH_NOATTRIB, 0, bool, IHandleEntity *, int);
|
||||||
SH_DECL_HOOK2(CTraceFilterSimple, ShouldHitEntity, SH_NOATTRIB, 0, bool, IHandleEntity *, int);
|
SH_DECL_HOOK2(CTraceFilterSimple, ShouldHitEntity, SH_NOATTRIB, 0, bool, IHandleEntity *, int);
|
||||||
bool ShouldHitEntity(IHandleEntity *pHandleEntity, int contentsMask)
|
bool ShouldHitEntity(IHandleEntity *pHandleEntity, int contentsMask)
|
||||||
{
|
{
|
||||||
if(!gv_InFireBullets)
|
if(!g_InFireBullets)
|
||||||
RETURN_META_VALUE(MRES_IGNORED, true);
|
RETURN_META_VALUE(MRES_IGNORED, true);
|
||||||
|
|
||||||
if(META_RESULT_ORIG_RET(bool) == false)
|
if(META_RESULT_ORIG_RET(bool) == false)
|
||||||
RETURN_META_VALUE(MRES_IGNORED, false);
|
RETURN_META_VALUE(MRES_IGNORED, false);
|
||||||
|
|
||||||
IServerUnknown *pUnk = (IServerUnknown *)pHandleEntity;
|
IServerUnknown *pUnk = (IServerUnknown *)pHandleEntity;
|
||||||
|
CBaseHandle hndl = pUnk->GetRefEHandle();
|
||||||
|
int index = hndl.GetEntryIndex();
|
||||||
|
|
||||||
IServerNetworkable *pNetworkAble = pUnk->GetNetworkable();
|
if(index > SM_MAXPLAYERS && g_pPhysboxToClientMap && index < 2048)
|
||||||
if(!pNetworkAble)
|
{
|
||||||
|
index = g_pPhysboxToClientMap[index];
|
||||||
|
}
|
||||||
|
|
||||||
|
if(index < 1 || index > SM_MAXPLAYERS)
|
||||||
RETURN_META_VALUE(MRES_IGNORED, true);
|
RETURN_META_VALUE(MRES_IGNORED, true);
|
||||||
|
|
||||||
edict_t *pEdict = pNetworkAble->GetEdict();
|
IGamePlayer *pPlayer = playerhelpers->GetGamePlayer(index);
|
||||||
if(!pEdict)
|
|
||||||
RETURN_META_VALUE(MRES_IGNORED, true);
|
|
||||||
|
|
||||||
IGamePlayer *pPlayer = playerhelpers->GetGamePlayer(pEdict);
|
|
||||||
if(!pPlayer)
|
if(!pPlayer)
|
||||||
RETURN_META_VALUE(MRES_IGNORED, true);
|
RETURN_META_VALUE(MRES_IGNORED, true);
|
||||||
|
|
||||||
@ -314,7 +317,7 @@ bool ShouldHitEntity(IHandleEntity *pHandleEntity, int contentsMask)
|
|||||||
RETURN_META_VALUE(MRES_IGNORED, true);
|
RETURN_META_VALUE(MRES_IGNORED, true);
|
||||||
|
|
||||||
int iTeam = pInfo->GetTeamIndex();
|
int iTeam = pInfo->GetTeamIndex();
|
||||||
if(iTeam == gv_FireBulletPlayerTeam)
|
if(iTeam == g_FireBulletPlayerTeam)
|
||||||
RETURN_META_VALUE(MRES_SUPERCEDE, false);
|
RETURN_META_VALUE(MRES_SUPERCEDE, false);
|
||||||
|
|
||||||
RETURN_META_VALUE(MRES_IGNORED, true);
|
RETURN_META_VALUE(MRES_IGNORED, true);
|
||||||
@ -333,11 +336,11 @@ DETOUR_DECL_STATIC9(DETOUR_FireBullets, void, int, iPlayerIndex, const Vector *,
|
|||||||
if(!pInfo)
|
if(!pInfo)
|
||||||
return DETOUR_STATIC_CALL(DETOUR_FireBullets)(iPlayerIndex, vOrigin, vAngles, iWeaponID, iMode, iSeed, flSpread, _f1, _f2);
|
return DETOUR_STATIC_CALL(DETOUR_FireBullets)(iPlayerIndex, vOrigin, vAngles, iWeaponID, iMode, iSeed, flSpread, _f1, _f2);
|
||||||
|
|
||||||
gv_FireBulletPlayerTeam = pInfo->GetTeamIndex();
|
g_FireBulletPlayerTeam = pInfo->GetTeamIndex();
|
||||||
|
|
||||||
gv_InFireBullets = true;
|
g_InFireBullets = true;
|
||||||
DETOUR_STATIC_CALL(DETOUR_FireBullets)(iPlayerIndex, vOrigin, vAngles, iWeaponID, iMode, iSeed, flSpread, _f1, _f2);
|
DETOUR_STATIC_CALL(DETOUR_FireBullets)(iPlayerIndex, vOrigin, vAngles, iWeaponID, iMode, iSeed, flSpread, _f1, _f2);
|
||||||
gv_InFireBullets = false;
|
g_InFireBullets = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
DETOUR_DECL_MEMBER1(DETOUR_SwingOrStab, bool, bool, bStab)
|
DETOUR_DECL_MEMBER1(DETOUR_SwingOrStab, bool, bool, bStab)
|
||||||
@ -372,15 +375,25 @@ DETOUR_DECL_MEMBER1(DETOUR_SwingOrStab, bool, bool, bStab)
|
|||||||
if(!pInfo)
|
if(!pInfo)
|
||||||
return DETOUR_MEMBER_CALL(DETOUR_SwingOrStab)(bStab);
|
return DETOUR_MEMBER_CALL(DETOUR_SwingOrStab)(bStab);
|
||||||
|
|
||||||
gv_FireBulletPlayerTeam = pInfo->GetTeamIndex();
|
g_FireBulletPlayerTeam = pInfo->GetTeamIndex();
|
||||||
|
|
||||||
gv_InFireBullets = true;
|
g_InFireBullets = true;
|
||||||
bool bRet = DETOUR_MEMBER_CALL(DETOUR_SwingOrStab)(bStab);
|
bool bRet = DETOUR_MEMBER_CALL(DETOUR_SwingOrStab)(bStab);
|
||||||
gv_InFireBullets = false;
|
g_InFireBullets = false;
|
||||||
|
|
||||||
return bRet;
|
return bRet;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cell_t PhysboxToClientMap(IPluginContext *pContext, const cell_t *params)
|
||||||
|
{
|
||||||
|
if(params[2])
|
||||||
|
pContext->LocalToPhysAddr(params[1], (cell_t **)&g_pPhysboxToClientMap);
|
||||||
|
else
|
||||||
|
g_pPhysboxToClientMap = NULL;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
DETOUR_DECL_STATIC1(DETOUR_RunThinkFunctions, void, bool, simulating)
|
DETOUR_DECL_STATIC1(DETOUR_RunThinkFunctions, void, bool, simulating)
|
||||||
{
|
{
|
||||||
if(g_pOnRunThinkFunctions->GetFunctionCount())
|
if(g_pOnRunThinkFunctions->GetFunctionCount())
|
||||||
@ -463,7 +476,7 @@ void Physics_SimulateEntity_CustomLoop(CBaseEntity **ppList, int Count, float St
|
|||||||
}
|
}
|
||||||
|
|
||||||
int g_TriggerEntityMoved;
|
int g_TriggerEntityMoved;
|
||||||
char *g_aFilterTriggerTouchPlayers = NULL;
|
char *g_pFilterTriggerTouchPlayers = NULL;
|
||||||
int g_FilterTriggerMoved = -1;
|
int g_FilterTriggerMoved = -1;
|
||||||
// void IVEngineServer::TriggerMoved( edict_t *pTriggerEnt, bool testSurroundingBoundsOnly ) = 0;
|
// void IVEngineServer::TriggerMoved( edict_t *pTriggerEnt, bool testSurroundingBoundsOnly ) = 0;
|
||||||
SH_DECL_HOOK2_void(IVEngineServer, TriggerMoved, SH_NOATTRIB, 0, edict_t *, bool);
|
SH_DECL_HOOK2_void(IVEngineServer, TriggerMoved, SH_NOATTRIB, 0, edict_t *, bool);
|
||||||
@ -490,7 +503,7 @@ void TriggerMoved(edict_t *pTriggerEnt, bool testSurroundingBoundsOnly)
|
|||||||
SH_DECL_HOOK1(CTriggerMoved, EnumElement, SH_NOATTRIB, 0, IterationRetval_t, IHandleEntity *);
|
SH_DECL_HOOK1(CTriggerMoved, EnumElement, SH_NOATTRIB, 0, IterationRetval_t, IHandleEntity *);
|
||||||
IterationRetval_t TriggerMoved_EnumElement(IHandleEntity *pHandleEntity)
|
IterationRetval_t TriggerMoved_EnumElement(IHandleEntity *pHandleEntity)
|
||||||
{
|
{
|
||||||
if(g_FilterTriggerMoved <= 0 && !g_aFilterTriggerTouchPlayers)
|
if(g_FilterTriggerMoved <= 0 && !g_pFilterTriggerTouchPlayers)
|
||||||
{
|
{
|
||||||
RETURN_META_VALUE(MRES_IGNORED, ITERATION_CONTINUE);
|
RETURN_META_VALUE(MRES_IGNORED, ITERATION_CONTINUE);
|
||||||
}
|
}
|
||||||
@ -506,7 +519,7 @@ IterationRetval_t TriggerMoved_EnumElement(IHandleEntity *pHandleEntity)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// block touching any clients here if map exists and evaluates to true
|
// block touching any clients here if map exists and evaluates to true
|
||||||
if(g_aFilterTriggerTouchPlayers && g_aFilterTriggerTouchPlayers[g_TriggerEntityMoved])
|
if(g_pFilterTriggerTouchPlayers && g_pFilterTriggerTouchPlayers[g_TriggerEntityMoved])
|
||||||
{
|
{
|
||||||
RETURN_META_VALUE(MRES_SUPERCEDE, ITERATION_CONTINUE);
|
RETURN_META_VALUE(MRES_SUPERCEDE, ITERATION_CONTINUE);
|
||||||
}
|
}
|
||||||
@ -530,9 +543,9 @@ cell_t FilterTriggerMoved(IPluginContext *pContext, const cell_t *params)
|
|||||||
cell_t FilterTriggerTouchPlayers(IPluginContext *pContext, const cell_t *params)
|
cell_t FilterTriggerTouchPlayers(IPluginContext *pContext, const cell_t *params)
|
||||||
{
|
{
|
||||||
if(params[2])
|
if(params[2])
|
||||||
pContext->LocalToPhysAddr(params[1], (cell_t **)&g_aFilterTriggerTouchPlayers);
|
pContext->LocalToPhysAddr(params[1], (cell_t **)&g_pFilterTriggerTouchPlayers);
|
||||||
else
|
else
|
||||||
g_aFilterTriggerTouchPlayers = NULL;
|
g_pFilterTriggerTouchPlayers = NULL;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -892,6 +905,7 @@ const sp_nativeinfo_t MyNatives[] =
|
|||||||
{ "BlockSolidMoved", BlockSolidMoved },
|
{ "BlockSolidMoved", BlockSolidMoved },
|
||||||
{ "FilterClientEntityMap", FilterClientEntityMap },
|
{ "FilterClientEntityMap", FilterClientEntityMap },
|
||||||
{ "FilterTriggerTouchPlayers", FilterTriggerTouchPlayers },
|
{ "FilterTriggerTouchPlayers", FilterTriggerTouchPlayers },
|
||||||
|
{ "PhysboxToClientMap", PhysboxToClientMap },
|
||||||
{ NULL, NULL }
|
{ NULL, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -26,6 +26,10 @@ native void FilterClientEntityMap(char map[MAXPLAYERS + 1][2048], bool set);
|
|||||||
// Block triggers TriggerMoved from touching any client by setting it to 1 for the entity index.
|
// Block triggers TriggerMoved from touching any client by setting it to 1 for the entity index.
|
||||||
native void FilterTriggerTouchPlayers(char map[2048], bool set);
|
native void FilterTriggerTouchPlayers(char map[2048], bool set);
|
||||||
|
|
||||||
|
// Map entities to client entity in FireBullets/SwingOrStab ShouldHitEntity.
|
||||||
|
// Aka. shoot and knife through physboxes that are parented to teammates (white knight, gandalf, horse, etc.)
|
||||||
|
native void PhysboxToClientMap(char map[2048], bool set);
|
||||||
|
|
||||||
public Extension __ext_CSSFixes =
|
public Extension __ext_CSSFixes =
|
||||||
{
|
{
|
||||||
name = "CSSFixes",
|
name = "CSSFixes",
|
||||||
|
@ -40,7 +40,7 @@
|
|||||||
/* Basic information exposed publicly */
|
/* Basic information exposed publicly */
|
||||||
#define SMEXT_CONF_NAME "CSSFixes"
|
#define SMEXT_CONF_NAME "CSSFixes"
|
||||||
#define SMEXT_CONF_DESCRIPTION "Patches bugs in the CSS server binary and more..."
|
#define SMEXT_CONF_DESCRIPTION "Patches bugs in the CSS server binary and more..."
|
||||||
#define SMEXT_CONF_VERSION "1.11"
|
#define SMEXT_CONF_VERSION "1.12"
|
||||||
#define SMEXT_CONF_AUTHOR "BotoX"
|
#define SMEXT_CONF_AUTHOR "BotoX"
|
||||||
#define SMEXT_CONF_URL ""
|
#define SMEXT_CONF_URL ""
|
||||||
#define SMEXT_CONF_LOGTAG "CSSFIXES"
|
#define SMEXT_CONF_LOGTAG "CSSFIXES"
|
||||||
|
Loading…
Reference in New Issue
Block a user