Regamedll API WIP: added some more API functions.

Added new cvar, mp_hegrenade_penetration, mp_nadedrops more details in game.cfg.
Let inflict damage by grenades to breakable objects.
This commit is contained in:
s1lentq 2016-04-08 02:20:45 +06:00
parent 455f0c6118
commit d8b12ee80b
26 changed files with 382 additions and 115 deletions

13
dist/game.cfg vendored
View File

@ -30,3 +30,16 @@ mp_maxmoney 16000
// Example setting: "ae" - blocks round time and bomb round end checks
// Default value: "0"
mp_round_infinite 0
// Disable grenade damage through walls
// 0 - disabled
// 1 - enabled
// Default value: "0"
mp_hegrenade_penetration 0
// Drop a grenade after player death
// 0 - disabled
// 1 - enabled (only the first slot grenades)
// 2 - drop a everyone
// Default value: "0"
mp_nadedrops 0

View File

@ -143,7 +143,8 @@ void setupToolchain(NativeBinarySpec b)
'_vsnprintf': 'vsnprintf',
'_write' : 'write',
'_close' : 'close',
'_vsnwprintf' : 'vswprintf'
'_vsnwprintf' : 'vswprintf',
'_access' : 'access'
])
cfg.linkerOptions.args '-no-opt-class-analysis'

View File

@ -1,5 +1,12 @@
#include "precompiled.h"
#ifdef REGAMEDLL_ADD
// Give 3rd-party to get the virtual table of the object.
// Example: AMXModX module: Hamsandwich
// RegisterHam(Ham_Spawn, "bot", "CCSBot__Spawn", 1);
LINK_ENTITY_TO_CLASS(bot, CCSBot, CAPI_CSBot);
#endif
// Return the number of bots following the given player
int GetBotFollowCount(CBasePlayer *leader)
{

View File

@ -419,6 +419,14 @@ bool BotPhraseManager::Initialize(const char *filename, int bankIndex)
char baseDir[RadioPathLen] = "";
char compositeFilename[RadioPathLen];
#ifdef REGAMEDLL_ADD
char soundDir[MAX_PATH];
char filePath[MAX_PATH];
GET_GAME_DIR(soundDir);
Q_strcat(soundDir, "\\sound\\");
#endif
// Parse the BotChatter.db into BotPhrase collections
while (true)
{
@ -567,8 +575,8 @@ bool BotPhraseManager::Initialize(const char *filename, int bankIndex)
FREE_FILE(phraseDataFile);
return false;
}
token = MP_COM_GetToken();
token = MP_COM_GetToken();
GameEventType event = NameToGameEvent(token);
if (event <= EVENT_START_RADIO_1 || event >= EVENT_END_RADIO)
{
@ -578,7 +586,6 @@ bool BotPhraseManager::Initialize(const char *filename, int bankIndex)
}
radioEvent = event;
continue;
}
@ -593,6 +600,13 @@ bool BotPhraseManager::Initialize(const char *filename, int bankIndex)
if (!Q_stricmp(token, "End"))
break;
#ifdef REGAMEDLL_ADD
Q_snprintf(filePath, sizeof(filePath), "%s%s%s", soundDir, baseDir, token);
if (Q_access(filePath, 0) != 0)
continue;
#endif
// found a phrase - add it to the collection
BotSpeakable *speak = new BotSpeakable;
if (baseDir[0])

View File

@ -903,6 +903,31 @@ float CBaseMonster::DamageForce(float damage)
return force;
}
void EXT_FUNC PlayerBlind(CBasePlayer *pPlayer, entvars_t *pevInflictor, entvars_t *pevAttacker, float fadeTime, float fadeHold, int alpha, Vector &color)
{
UTIL_ScreenFade(pPlayer, color, fadeTime, fadeHold, alpha, 0);
for (int i = 1; i <= gpGlobals->maxClients; ++i)
{
CBasePlayer *pObserver = static_cast<CBasePlayer *>(UTIL_PlayerByIndex(i));
if (!pObserver || !pObserver->IsObservingPlayer(pPlayer))
continue;
if (!fadetoblack.value)
{
UTIL_ScreenFade(pObserver, color, fadeTime, fadeHold, alpha, 0);
}
}
pPlayer->Blind(fadeTime * 0.33, fadeHold, fadeTime, alpha);
if (TheBots != NULL)
{
TheBots->OnEvent(EVENT_PLAYER_BLINDED_BY_FLASHBANG, pPlayer);
}
}
void RadiusFlash(Vector vecSrc, entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int iClassIgnore, int bitsDamageType)
{
CBaseEntity *pEntity = NULL;
@ -948,12 +973,16 @@ void RadiusFlash(Vector vecSrc, entvars_t *pevInflictor, entvars_t *pevAttacker,
vecSpot = pPlayer->BodyTarget(vecSrc);
UTIL_TraceLine(vecSrc, vecSpot, dont_ignore_monsters, ENT(pevInflictor), &tr);
g_ReGameHookchains.m_RadiusFlash_TraceLine.callChain(NULL, pPlayer, pevInflictor, pevAttacker, vecSrc, vecSpot, &tr);
if (tr.flFraction != 1.0f && tr.pHit != pPlayer->pev->pContainingEntity)
continue;
#ifndef REGAMEDLL_FIXES
UTIL_TraceLine(vecSpot, vecSrc, dont_ignore_monsters, tr.pHit, &tr2);
if (tr2.flFraction >= 1.0)
#endif
{
if (tr.fStartSolid)
{
@ -1000,27 +1029,8 @@ void RadiusFlash(Vector vecSrc, entvars_t *pevInflictor, entvars_t *pevAttacker,
}
}
UTIL_ScreenFade(pPlayer, Vector(255, 255, 255), fadeTime, fadeHold, alpha, 0);
for (int i = 1; i <= gpGlobals->maxClients; ++i)
{
CBasePlayer *pObserver = static_cast<CBasePlayer *>(UTIL_PlayerByIndex(i));
if (!pObserver || !pObserver->IsObservingPlayer(pPlayer))
continue;
if (!fadetoblack.value)
{
UTIL_ScreenFade(pObserver, Vector(255, 255, 255), fadeTime, fadeHold, alpha, 0);
}
}
pPlayer->Blind(fadeTime * 0.33, fadeHold, fadeTime, alpha);
if (TheBots != NULL)
{
TheBots->OnEvent(EVENT_PLAYER_BLINDED_BY_FLASHBANG, pPlayer);
}
Vector color(255, 255, 255);
g_ReGameHookchains.m_PlayerBlind.callChain(PlayerBlind, pPlayer, pevInflictor, pevAttacker, fadeTime, fadeHold, alpha, color);
}
}
}
@ -1030,8 +1040,6 @@ float GetAmountOfPlayerVisible(Vector vecSrc, CBaseEntity *entity)
float retval = 0.0f;
TraceResult tr;
Vector spot;
Vector2D dir;
Vector2D perp;
const float topOfHead = 25.0f;
const float standFeet = 34.0f;
@ -1070,11 +1078,10 @@ float GetAmountOfPlayerVisible(Vector vecSrc, CBaseEntity *entity)
if (tr.flFraction == 1.0f)
retval += 0.2f;
dir = (entity->pev->origin - vecSrc).Make2D();
Vector2D dir = (entity->pev->origin - vecSrc).Make2D();
dir.NormalizeInPlace();
perp.x = -dir.y * edgeOffset;
perp.y = dir.x * edgeOffset;
Vector2D perp(-dir.y * edgeOffset, dir.x * edgeOffset);
spot = entity->pev->origin + Vector(perp.x, perp.y, 0);
@ -1138,7 +1145,16 @@ void RadiusDamage(Vector vecSrc, entvars_t *pevInflictor, entvars_t *pevAttacker
damageRatio = GetAmountOfPlayerVisible(vecSrc, pEntity);
}
float length = (vecSrc - pEntity->pev->origin).Length();
damageRatio = GetAmountOfPlayerVisible(vecSrc, pEntity);
float length;
#ifdef REGAMEDLL_ADD
// allow to damage breakable objects
if (FClassnameIs(pEntity->pev, "func_breakable"))
length = (vecSrc - pEntity->Center()).Length();
else
#endif
length = (vecSrc - pEntity->pev->origin).Length();
if (useLOS)
{
@ -1151,12 +1167,28 @@ void RadiusDamage(Vector vecSrc, entvars_t *pevInflictor, entvars_t *pevAttacker
flAdjustedDamage = (flRadius - length) * (flRadius - length) * 1.25 / (flRadius * flRadius) * (damageRatio * flDamage) * 1.5;
}
else
{
flAdjustedDamage = flDamage - length * falloff;
#ifdef REGAMEDLL_ADD
// disable grenade damage through walls?
if (hegrenade_penetration.string[0] == '1' && (bitsDamageType & DMG_EXPLOSION))
{
UTIL_TraceLine(vecSrc, pEntity->pev->origin, ignore_monsters, NULL, &tr);
if (tr.flFraction != 1.0f)
flAdjustedDamage = 0.0f;
}
#endif
}
if (flAdjustedDamage < 0)
flAdjustedDamage = 0;
pEntity->TakeDamage(pevInflictor, pevAttacker, flAdjustedDamage, bitsDamageType);
#ifdef REGAMEDLL_FIXES
if (flAdjustedDamage > 0)
#endif
pEntity->TakeDamage(pevInflictor, pevAttacker, flAdjustedDamage, bitsDamageType);
}
}
}

View File

@ -95,9 +95,11 @@ cvar_t sk_scientist_heal3 = { "sk_scientist_heal3", "0", 0, 0.0f, NULL };
#ifdef REGAMEDLL_ADD
cvar_t game_version = { "game_version", APP_VERSION_STRD, FCVAR_SERVER, 0.0f, NULL };
cvar_t maxmoney = { "mp_maxmoney", "16000", FCVAR_SERVER, 0.0f, NULL };
cvar_t round_infinite = { "mp_round_infinite", "0", FCVAR_SERVER, 0.0f, NULL };
cvar_t game_version = { "game_version", APP_VERSION_STRD, FCVAR_SERVER, 0.0f, nullptr };
cvar_t maxmoney = { "mp_maxmoney", "16000", FCVAR_SERVER, 0.0f, nullptr };
cvar_t round_infinite = { "mp_round_infinite", "0", FCVAR_SERVER, 0.0f, nullptr };
cvar_t hegrenade_penetration = { "mp_hegrenade_penetration", "0", 0, 0.0f, nullptr };
cvar_t nadedrops = { "mp_nadedrops", "0", 0, 0.0f, nullptr };
void GameDLL_Version_f()
{
@ -222,6 +224,8 @@ void EXT_FUNC GameDLLInit()
CVAR_REGISTER(&game_version);
CVAR_REGISTER(&maxmoney);
CVAR_REGISTER(&round_infinite);
CVAR_REGISTER(&hegrenade_penetration);
CVAR_REGISTER(&nadedrops);
// print version
CONSOLE_ECHO("ReGameDLL build: " __TIME__ " " __DATE__ " (" APP_VERSION_STRD ")\n");

View File

@ -135,6 +135,8 @@ extern cvar_t sk_scientist_heal3;
extern cvar_t maxmoney;
extern cvar_t round_infinite;
extern cvar_t hegrenade_penetration;
extern cvar_t nadedrops;
#endif

View File

@ -2,7 +2,7 @@
LINK_HOOK_CHAIN(int, GetForceCamera, (CBasePlayer *pObserver), pObserver);
int GetForceCamera_internal(CBasePlayer *pObserver)
int __API_HOOK(GetForceCamera)(CBasePlayer *pObserver)
{
int retVal;

View File

@ -37,7 +37,7 @@
#define CAMERA_MODE_SPEC_ONLY_FRIST_PERSON 2
int GetForceCamera(CBasePlayer *pObserver);
int GetForceCamera_internal(CBasePlayer *pObserver);
int GetForceCamera_(CBasePlayer *pObserver);
void UpdateClientEffects(CBasePlayer *pObserver, int oldMode);
#endif // OBSERVER_H

View File

@ -706,7 +706,7 @@ bool CBasePlayer::IsHittingShield(Vector &vecDirection, TraceResult *ptr)
LINK_HOOK_CLASS_VOID_CHAIN(CBasePlayer, TraceAttack, (entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType), pevAttacker, flDamage, vecDir, ptr, bitsDamageType);
void CBasePlayer::__API_VHOOK(TraceAttack)(entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType)
void CBasePlayer::__API_VHOOK(TraceAttack)(entvars_t *pevAttacker, float flDamage, VectorRef vecDir, TraceResult *ptr, int bitsDamageType)
{
bool bShouldBleed = true;
bool bShouldSpark = false;
@ -1348,7 +1348,7 @@ void packPlayerItem(CBasePlayer *pPlayer, CBasePlayerItem *pItem, bool packAmmo)
pWeaponBox->pev->angles.x = 0;
pWeaponBox->pev->angles.z = 0;
pWeaponBox->pev->velocity = pPlayer->pev->velocity * 0.75;
pWeaponBox->pev->velocity = pPlayer->pev->velocity * 0.75f;
pWeaponBox->SetThink(&CWeaponBox::Kill);
pWeaponBox->pev->nextthink = gpGlobals->time + 300.0f;
@ -1362,6 +1362,55 @@ void packPlayerItem(CBasePlayer *pPlayer, CBasePlayerItem *pItem, bool packAmmo)
}
}
#ifdef REGAMEDLL_ADD
void packPlayerNade(CBasePlayer *pPlayer, CBasePlayerItem *pItem, bool packAmmo)
{
if (pItem == NULL)
return;
const char *modelName = GetCSModelName(pItem->m_iId);
if (modelName != NULL)
{
float flOffset = 0.0f;
switch (pItem->m_iId)
{
case WEAPON_HEGRENADE:
flOffset = 14.0f;
break;
case WEAPON_FLASHBANG:
flOffset = 0.0f;
break;
case WEAPON_SMOKEGRENADE:
flOffset = -14.0f;
break;
}
Vector vecAngles = pPlayer->pev->angles;
Vector dir(Q_cos(vecAngles.y) * flOffset, Q_sin(vecAngles.y) * flOffset, 0.0f);
vecAngles.x = 0.0f;
vecAngles.y += 45.0f;
CWeaponBox *pWeaponBox = (CWeaponBox *)CBaseEntity::Create("weaponbox", pPlayer->pev->origin + dir, vecAngles, ENT(pPlayer->pev));
pWeaponBox->pev->angles.x = 0;
pWeaponBox->pev->angles.z = 0;
pWeaponBox->pev->velocity = pPlayer->pev->velocity * 0.75f;
pWeaponBox->SetThink(&CWeaponBox::Kill);
pWeaponBox->pev->nextthink = gpGlobals->time + 300.0f;
pWeaponBox->PackWeapon(pItem);
if (packAmmo)
{
pWeaponBox->PackAmmo(MAKE_STRING(IMPL_CLASS(CBasePlayerItem, ItemInfoArray)[pItem->m_iId].pszAmmo1), pPlayer->m_rgAmmo[pItem->PrimaryAmmoIndex()]);
}
SET_MODEL(ENT(pWeaponBox->pev), modelName);
}
}
#endif
void CBasePlayer::PackDeadPlayerItems()
{
bool bPackGun = (g_pGameRules->DeadPlayerWeapons(this) != GR_PLR_DROP_GUN_NO);
@ -1379,7 +1428,7 @@ void CBasePlayer::PackDeadPlayerItems()
int nBestWeight = 0;
CBasePlayerItem *pBestItem = NULL;
for (int n = 0; n < MAX_ITEM_TYPES; n++)
for (int n = 0; n < MAX_ITEM_TYPES; ++n)
{
CBasePlayerItem *pPlayerItem = m_rgpPlayerItems[ n ];
@ -1398,19 +1447,47 @@ void CBasePlayer::PackDeadPlayerItems()
}
}
// drop a grenade after death
else if (pPlayerItem->iItemSlot() == GRENADE_SLOT && g_bIsCzeroGame)
packPlayerItem(this, pPlayerItem, true);
else if (pPlayerItem->iItemSlot() == GRENADE_SLOT)
{
if (g_bIsCzeroGame)
packPlayerItem(this, pPlayerItem, true);
#ifdef REGAMEDLL_ADD
else
{
switch ((int)nadedrops.value)
{
case 1:
packPlayerItem(this, pPlayerItem, true);
break;
case 2:
{
CBasePlayerItem *pNade = pPlayerItem;
while (pNade != nullptr)
{
CBasePlayerItem *pTemp = pNade->m_pNext;
packPlayerNade(this, pNade, true);
pNade = pTemp;
}
break;
}
}
}
#endif
}
pPlayerItem = pPlayerItem->m_pNext;
}
}
packPlayerItem(this, pBestItem, bPackAmmo);
}
RemoveAllItems(TRUE);
}
void CBasePlayer::GiveDefaultItems()
LINK_HOOK_CLASS_VOID_CHAIN2(CBasePlayer, GiveDefaultItems);
void CBasePlayer::__API_HOOK(GiveDefaultItems)()
{
RemoveAllItems(FALSE);
m_bHasPrimary = false;
@ -2113,7 +2190,9 @@ BOOL CBasePlayer::IsBombGuy()
return m_bHasC4;
}
void CBasePlayer::SetAnimation(PLAYER_ANIM playerAnim)
LINK_HOOK_CLASS_VOID_CHAIN(CBasePlayer, SetAnimation, (PLAYER_ANIM playerAnim), playerAnim);
void CBasePlayer::__API_HOOK(SetAnimation)(PLAYER_ANIM playerAnim)
{
int animDesired;
float speed;
@ -2870,7 +2949,9 @@ void CWShield::__MAKE_VHOOK(Touch)(CBaseEntity *pOther)
}
}
void CBasePlayer::GiveShield(bool bDeploy)
LINK_HOOK_CLASS_VOID_CHAIN(CBasePlayer, GiveShield, (bool bDeploy), bDeploy);
void CBasePlayer::__API_HOOK(GiveShield)(bool bDeploy)
{
m_bOwnsShield = true;
m_bHasPrimary = true;
@ -2983,7 +3064,9 @@ NOXREF void CBasePlayer::ThrowPrimary()
DropShield();
}
void CBasePlayer::AddAccount(int amount, bool bTrackChange)
LINK_HOOK_CLASS_VOID_CHAIN(CBasePlayer, AddAccount, (int amount, bool bTrackChange), amount, bTrackChange);
void CBasePlayer::__API_HOOK(AddAccount)(int amount, bool bTrackChange)
{
m_iAccount += amount;
@ -5714,7 +5797,9 @@ void CBloodSplat::Spray()
pev->nextthink = gpGlobals->time + 0.1f;
}
void CBasePlayer::GiveNamedItem(const char *pszName)
LINK_HOOK_CLASS_VOID_CHAIN(CBasePlayer, GiveNamedItem, (const char *pszName), pszName);
void CBasePlayer::__API_HOOK(GiveNamedItem)(const char *pszName)
{
string_t istr = MAKE_STRING(pszName);
edict_t *pent = CREATE_NAMED_ENTITY(istr);
@ -6764,7 +6849,7 @@ void CBasePlayer::__API_VHOOK(UpdateClientData)()
m_tmNextRadarUpdate = gpGlobals->time + 1.0f;
#ifdef REGAMEDLL_ADD
if (friendlyfire.string[0] == '2')
if (CSGameRules()->IsFriendlyFireAttack())
vecOrigin = g_vecZero;
#endif

View File

@ -371,12 +371,14 @@ public:
virtual void Blind(float flUntilTime, float flHoldTime, float flFadeTime, int iAlpha);
virtual void OnTouchingWeapon(CWeaponBox *pWeapon) { }
#ifdef REGAMEDLL_API
#if defined(REGAMEDLL_API) || defined(HOOK_GAMEDLL)
void Spawn_();
void Precache_();
int ObjectCaps_();
int Classify_();
void TraceAttack_(entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType);
int Save_(CSave &save);
int Restore_(CRestore &restore);
void TraceAttack_(entvars_t *pevAttacker, float flDamage, VectorRef vecDir, TraceResult *ptr, int bitsDamageType);
int TakeDamage_(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType);
int TakeHealth_(float flHealth, int bitsDamageType);
void Killed_(entvars_t *pevAttacker, int iGib);
@ -394,11 +396,6 @@ public:
void ImpulseCommands_();
void RoundRespawn_();
void Blind_(float flUntilTime, float flHoldTime, float flFadeTime, int iAlpha);
#endif // REGAMEDLL_API
#ifdef HOOK_GAMEDLL
int Save_(CSave &save);
int Restore_(CRestore &restore);
const char *TeamID_();
BOOL FBecomeProne_();
int Illumination_();
@ -424,6 +421,7 @@ public:
void ThrowWeapon(char *pszItemName);
void ThrowPrimary();
void AddAccount(int amount, bool bTrackChange = true);
void AddAccount_(int amount, bool bTrackChange = true);
void Disappear();
void MakeVIP();
bool CanPlayerBuy(bool display = false);
@ -437,6 +435,7 @@ public:
void RenewItems();
void PackDeadPlayerItems();
void GiveDefaultItems();
void GiveDefaultItems_();
void RemoveAllItems(BOOL removeSuit);
void SetBombIcon(BOOL bFlash = FALSE);
void SetProgressBarTime(int time);
@ -463,6 +462,7 @@ public:
void UpdatePlayerSound();
void DeathSound();
void SetAnimation(PLAYER_ANIM playerAnim);
void SetAnimation_(PLAYER_ANIM playerAnim);
void SetWeaponAnimType(const char *szExtention) { Q_strcpy(m_szAnimExtention, szExtention); }
void CheatImpulseCommands(int iImpulse);
void StartDeathCam();
@ -479,6 +479,7 @@ public:
void ItemPreFrame();
void ItemPostFrame();
void GiveNamedItem(const char *pszName);
void GiveNamedItem_(const char *pszName);
void EnableControl(BOOL fControl);
bool HintMessage(const char *pMessage, BOOL bDisplayIfPlayerDead = FALSE, BOOL bOverride = FALSE);
void SendAmmoUpdate();
@ -526,6 +527,7 @@ public:
void RemoveShield();
void DropShield(bool bDeploy = true);
void GiveShield(bool bDeploy = true);
void GiveShield_(bool bDeploy = true);
bool IsHittingShield(Vector &vecDirection, TraceResult *ptr);
bool SelectSpawnSpot(const char *pEntClassName, CBaseEntity* &pSpot);
bool IsReloading()

View File

@ -1816,6 +1816,11 @@ void CWeaponBox::__MAKE_VHOOK(Touch)(CBaseEntity *pOther)
{
if (!FStringNull(m_rgiszAmmo[n]))
{
#ifdef REGAMEDLL_FIXES
if (m_rgAmmo[n] < MaxAmmoCarry(m_rgiszAmmo[n]))
continue;
#endif
// there's some ammo of this type.
pPlayer->GiveAmmo(m_rgAmmo[n], (char *)STRING(m_rgiszAmmo[n]), MaxAmmoCarry(m_rgiszAmmo[n]));

View File

@ -91,6 +91,7 @@ typedef struct incomingtransfer_s
#define Q_alloca alloca
#define Q_free free
#define Q_access _access
#define Q_close _close
#define Q_write _write
#define Q_memset memset

View File

@ -429,6 +429,7 @@ void CNavArea::Load(SteamFile *file, unsigned int version)
file->Read(&pos, sizeof(float));
}
}
return;
}

View File

@ -6093,7 +6093,7 @@ AddressRef g_DataRefs[] =
{ 0x01E23470, "cv_tutor_hint_interval_time", (size_t)&pcv_tutor_hint_interval_time },
{ 0x01E11EE4, "cv_hostage_debug", (size_t)&pcv_hostage_debug },
{ 0x01E11EF8, "cv_hostage_stop", (size_t)&pcv_hostage_stop },
//{ 0x0, "_ZL14placeDirectory", (size_t)&pplaceDirectory }, // DONT USE - NOXREF
//{ 0x01E2A228, "_ZL14placeDirectory", (size_t)&pplaceDirectory }, // DONT USE - NOXREF
{ 0x01E2A0E4, "TheNavLadderList", (size_t)&pTheNavLadderList },
{ 0x01E2A0F0, "TheHidingSpotList", (size_t)&pTheHidingSpotList },
{ 0x01E14C5C, "sPlayerModelFiles", (size_t)&psPlayerModelFiles },

View File

@ -1288,6 +1288,7 @@ void CGunTarget::Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE use
void CBasePlayer::Spawn() { Spawn_(); }
void CBasePlayer::Precache() { Precache_(); }
int CBasePlayer::Save(CSave &save) { return Save_(save); }
int CBasePlayer::ObjectCaps() { return ObjectCaps_(); }
int CBasePlayer::Restore(CRestore &restore) { return Restore_(restore); }
int CBasePlayer::Classify() { return Classify_(); }
void CBasePlayer::TraceAttack(entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType) { TraceAttack_(pevAttacker, flDamage, vecDir, ptr, bitsDamageType); }

View File

@ -63,6 +63,8 @@ class CGraph;
class CRestore;
class CSaveRestoreBuffer;
typedef Vector VectorRef;
#define __API_HOOK(fname)\
fname
@ -78,9 +80,10 @@ class CSaveRestoreBuffer;
#define IMPL_CLASS(baseClass,var)\
(*baseClass::p##var)
#define LINK_CLASS_HOOK_VOID_CHAIN(...)
#define LINK_CLASS_HOOK_CHAIN(...)
#define LINK_CLASS_HOOK_API_CHAIN(...)
#define LINK_HOOK_CLASS_VOID_CHAIN(...)
#define LINK_HOOK_CLASS_VOID_CHAIN2(...)
#define LINK_HOOK_CLASS_CHAIN(...)
#define LINK_HOOK_CLASS_CHAIN2(...)
#define LINK_HOOK_VOID_CHAIN(...)
#define LINK_HOOK_CHAIN(...)

View File

@ -5,6 +5,8 @@
#include <cwchar>
#include <xstddef>
#pragma warning(disable : 4348)
#ifdef _MSC_VER
#pragma pack(push, 8)
#endif // _MSC_VER

View File

@ -74,7 +74,7 @@ public:
return (*this); }
void reserve(size_type _N)
{if (capacity() < _N)
{iterator_ _S = allocator.allocate(_N, (void *)0);
{iterator _S = allocator.allocate(_N, (void *)0);
_Ucopy(_First, _Last, _S);
__Destroy(_First, _Last);
allocator.deallocate(_First, _End - _First);

View File

@ -51,8 +51,8 @@ typedef IHookChain<int> IReGameHook_CBasePlayer_Classify;
typedef IHookChainRegistryClass<int, class CBasePlayer> IReGameHookRegistry_CBasePlayer_Classify;
// CBasePlayer::TraceAttack hook
typedef IVoidHookChain<struct entvars_s *, float, Vector, struct TraceResult *, int> IReGameHook_CBasePlayer_TraceAttack;
typedef IVoidHookChainRegistryClass<class CBasePlayer, struct entvars_s *, float, Vector, struct TraceResult *, int> IReGameHookRegistry_CBasePlayer_TraceAttack;
typedef IVoidHookChain<struct entvars_s *, float, Vector &, struct TraceResult *, int> IReGameHook_CBasePlayer_TraceAttack;
typedef IVoidHookChainRegistryClass<class CBasePlayer, struct entvars_s *, float, Vector &, struct TraceResult *, int> IReGameHookRegistry_CBasePlayer_TraceAttack;
// CBasePlayer::TakeDamage hook
typedef IHookChain<int, struct entvars_s *, struct entvars_s *, float, int> IReGameHook_CBasePlayer_TakeDamage;
@ -123,20 +123,50 @@ typedef IVoidHookChain<float, float, float, int> IReGameHook_CBasePlayer_Blind;
typedef IVoidHookChainRegistryClass<class CBasePlayer, float, float, float, int> IReGameHookRegistry_CBasePlayer_Blind;
// Observer_IsValidTarget hook
// CBasePlayer::Observer_IsValidTarget hook
typedef IHookChain<class CBaseEntity *, int, bool> IReGameHook_CBasePlayer_Observer_IsValidTarget;
typedef IHookChainRegistryClass<class CBaseEntity *, class CBasePlayer, int, bool> IReGameHookRegistry_CBasePlayer_Observer_IsValidTarget;
// CBasePlayer::SetAnimation hook
typedef IVoidHookChain<PLAYER_ANIM> IReGameHook_CBasePlayer_SetAnimation;
typedef IVoidHookChainRegistryClass<class CBasePlayer, PLAYER_ANIM> IReGameHookRegistry_CBasePlayer_SetAnimation;
// CBasePlayer::GiveDefaultItems hook
typedef IVoidHookChain<> IReGameHook_CBasePlayer_GiveDefaultItems;
typedef IVoidHookChainRegistryClass<class CBasePlayer> IReGameHookRegistry_CBasePlayer_GiveDefaultItems;
// CBasePlayer::GiveNamedItem hook
typedef IVoidHookChain<const char *> IReGameHook_CBasePlayer_GiveNamedItem;
typedef IVoidHookChainRegistryClass<class CBasePlayer, const char *> IReGameHookRegistry_CBasePlayer_GiveNamedItem;
// CBasePlayer::AddAccount hook
typedef IVoidHookChain<int, bool> IReGameHook_CBasePlayer_AddAccount;
typedef IVoidHookChainRegistryClass<class CBasePlayer, int, bool> IReGameHookRegistry_CBasePlayer_AddAccount;
// CBasePlayer::GiveShield hook
typedef IVoidHookChain<bool> IReGameHook_CBasePlayer_GiveShield;
typedef IVoidHookChainRegistryClass<class CBasePlayer, bool> IReGameHookRegistry_CBasePlayer_GiveShield;
// GetForceCamera hook
typedef IHookChain<int, class CBasePlayer *> IReGameHook_GetForceCamera;
typedef IHookChainRegistry<int, class CBasePlayer *> IReGameHookRegistry_GetForceCamera;
// PlayerBlind hook
typedef IVoidHookChain<class CBasePlayer *, struct entvars_s *, struct entvars_s *, float, float, int, Vector &> IReGameHook_PlayerBlind;
typedef IVoidHookChainRegistry<class CBasePlayer *, struct entvars_s *, struct entvars_s *, float, float, int, Vector &> IReGameHookRegistry_PlayerBlind;
// RadiusFlash_TraceLine hook
typedef IVoidHookChain<class CBasePlayer *, struct entvars_s *, struct entvars_s *, Vector &, Vector &, struct TraceResult *> IReGameHook_RadiusFlash_TraceLine;
typedef IVoidHookChainRegistry<class CBasePlayer *, struct entvars_s *, struct entvars_s *, Vector &, Vector &, struct TraceResult *> IReGameHookRegistry_RadiusFlash_TraceLine;
class IReGameHookchains {
public:
virtual ~IReGameHookchains() {}
@ -164,13 +194,18 @@ public:
virtual IReGameHookRegistry_CBasePlayer_RoundRespawn* CBasePlayer_RoundRespawn() = 0;
virtual IReGameHookRegistry_CBasePlayer_Blind* CBasePlayer_Blind() = 0;
virtual IReGameHookRegistry_CBasePlayer_Observer_IsValidTarget* CBasePlayer_Observer_IsValidTarget() = 0;
virtual IReGameHookRegistry_CBasePlayer_SetAnimation* CBasePlayer_SetAnimation() = 0;
virtual IReGameHookRegistry_CBasePlayer_GiveDefaultItems* CBasePlayer_GiveDefaultItems() = 0;
virtual IReGameHookRegistry_CBasePlayer_GiveNamedItem* CBasePlayer_GiveNamedItem() = 0;
virtual IReGameHookRegistry_CBasePlayer_AddAccount* CBasePlayer_AddAccount() = 0;
virtual IReGameHookRegistry_CBasePlayer_GiveShield* CBasePlayer_GiveShield() = 0;
virtual IReGameHookRegistry_GetForceCamera* GetForceCamera() = 0;
virtual IReGameHookRegistry_PlayerBlind* PlayerBlind() = 0;
virtual IReGameHookRegistry_RadiusFlash_TraceLine* RadiusFlash_TraceLine() = 0;
};
@ -181,6 +216,8 @@ struct ReGameFuncs_t {
class ICSPlayer *(*INDEX_TO_CSPLAYER)(int iPlayerIndex);
class ICSEntity *(*INDEX_TO_CSENTITY)(int iEntityIndex);
struct edict_s *(*CREATE_NAMED_ENTITY2)(string_t iClass);
void (*CopyString)(char *dest, const char *source);
};
class IReGameApi {

View File

@ -293,6 +293,12 @@ public:
virtual void OnTouchingWeapon(CCSWeaponBox *pWeapon) = 0;
public:
virtual bool IsConnected() const = 0;
virtual void SetAnimation(PLAYER_ANIM playerAnim) = 0;
virtual void AddAccount(int amount, bool bTrackChange = true) = 0;
virtual void GiveNamedItem(const char *pszName) = 0;
virtual void GiveDefaultItems() = 0;
virtual void GiveShield(bool bDeploy = true) = 0;
};
class IAPI_Bot: public virtual ICSPlayer {

View File

@ -32,6 +32,8 @@
// declared virtual function's and globals for hooks
#ifdef HOOK_GAMEDLL
#include "hooker_impl.h"
#else
typedef Vector& VectorRef;
#endif // HOOK_GAMEDLL
#include "h_export.h"

View File

@ -37,6 +37,8 @@ ReGameFuncs_t g_ReGameApiFuncs = {
&INDEX_TO_CSPLAYER,
&INDEX_TO_CSENTITY,
&CREATE_NAMED_ENTITY,
&Regamedll_CopyString_api,
};
IReGameHookRegistry_CBasePlayer_Spawn* CReGameHookchains::CBasePlayer_Spawn() { return &m_CBasePlayer_Spawn; }
@ -62,10 +64,17 @@ IReGameHookRegistry_CBasePlayer_ImpulseCommands* CReGameHookchains::CBasePlayer_
IReGameHookRegistry_CBasePlayer_RoundRespawn* CReGameHookchains::CBasePlayer_RoundRespawn() { return &m_CBasePlayer_RoundRespawn; }
IReGameHookRegistry_CBasePlayer_Blind* CReGameHookchains::CBasePlayer_Blind() { return &m_CBasePlayer_Blind; }
IReGameHookRegistry_CBasePlayer_Observer_IsValidTarget* CReGameHookchains::CBasePlayer_Observer_IsValidTarget() { return &m_CBasePlayer_Observer_IsValidTarget; }
IReGameHookRegistry_CBasePlayer_SetAnimation* CReGameHookchains::CBasePlayer_SetAnimation() { return &m_CBasePlayer_SetAnimation; }
IReGameHookRegistry_CBasePlayer_GiveDefaultItems* CReGameHookchains::CBasePlayer_GiveDefaultItems() { return &m_CBasePlayer_GiveDefaultItems; }
IReGameHookRegistry_CBasePlayer_GiveNamedItem* CReGameHookchains::CBasePlayer_GiveNamedItem() { return &m_CBasePlayer_GiveNamedItem; }
IReGameHookRegistry_CBasePlayer_AddAccount* CReGameHookchains::CBasePlayer_AddAccount() { return &m_CBasePlayer_AddAccount; }
IReGameHookRegistry_CBasePlayer_GiveShield* CReGameHookchains::CBasePlayer_GiveShield() { return &m_CBasePlayer_GiveShield; }
IReGameHookRegistry_GetForceCamera* CReGameHookchains::GetForceCamera() { return &m_GetForceCamera; }
IReGameHookRegistry_PlayerBlind* CReGameHookchains::PlayerBlind() { return &m_PlayerBlind; }
IReGameHookRegistry_RadiusFlash_TraceLine* CReGameHookchains::RadiusFlash_TraceLine() { return &m_RadiusFlash_TraceLine; }
int CReGameApi::GetMajorVersion()
{
@ -92,4 +101,15 @@ IReGameData *CReGameApi::GetGameData()
return &g_ReGameData;
}
void EXT_FUNC Regamedll_CopyString_api(char *dest, const char *source)
{
size_t len = Q_strlen(source);
if (dest == nullptr || Q_strlen(dest) != len) {
delete [] dest;
dest = new char [len + 1];
}
Q_strcpy(dest, source);
}
EXPOSE_SINGLE_INTERFACE(CReGameApi, IReGameApi, VRE_GAMEDLL_API_VERSION);

View File

@ -48,20 +48,13 @@ typedef IHookChainClassImpl<int, CBasePlayer> CRegameHook_CBasePlayer_Classify;
typedef IHookChainRegistryClassImpl<int, CBasePlayer> CReGameHookRegistry_CBasePlayer_Classify;
// CBasePlayer::TraceAttack hook
typedef IVoidHookChainClassImpl<CBasePlayer, entvars_t *, float, Vector, TraceResult *, int> CRegameHook_CBasePlayer_TraceAttack;
typedef IVoidHookChainRegistryClassImpl<CBasePlayer, entvars_t *, float, Vector, TraceResult *, int> CReGameHookRegistry_CBasePlayer_TraceAttack;
typedef IVoidHookChainClassImpl<CBasePlayer, entvars_t *, float, Vector &, TraceResult *, int> CRegameHook_CBasePlayer_TraceAttack;
typedef IVoidHookChainRegistryClassImpl<CBasePlayer, entvars_t *, float, Vector &, TraceResult *, int> CReGameHookRegistry_CBasePlayer_TraceAttack;
// CBasePlayer::TakeDamage hook
typedef IHookChainClassImpl<int, CBasePlayer, entvars_t *, entvars_t *, float, int> CRegameHook_CBasePlayer_TakeDamage;
typedef IHookChainRegistryClassImpl<int, CBasePlayer, entvars_t *, entvars_t *, float, int> CReGameHookRegistry_CBasePlayer_TakeDamage;
// CBasePlayer::TakeHealth hook
typedef IHookChainClassImpl<int, CBasePlayer, float, int> CRegameHook_CBasePlayer_TakeHealth;
typedef IHookChainRegistryClassImpl<int, CBasePlayer, float, int> CReGameHookRegistry_CBasePlayer_TakeHealth;
@ -127,19 +120,45 @@ typedef IVoidHookChainClassImpl<CBasePlayer, float, float, float, int> CRegameHo
typedef IVoidHookChainRegistryClassImpl<CBasePlayer, float, float, float, int> CReGameHookRegistry_CBasePlayer_Blind;
// CBasePlayer::Observer_IsValidTarget
// CBasePlayer::Observer_IsValidTarget hook
typedef IHookChainClassImpl<CBaseEntity *, CBasePlayer, int, bool> CReGameHook_CBasePlayer_Observer_IsValidTarget;
typedef IHookChainRegistryClassImpl<CBaseEntity *, CBasePlayer, int, bool> CReGameHookRegistry_CBasePlayer_Observer_IsValidTarget;
// GetForceCamera
// CBasePlayer::SetAnimation hook
typedef IVoidHookChainClassImpl<CBasePlayer, PLAYER_ANIM> CRegameHook_CBasePlayer_SetAnimation;
typedef IVoidHookChainRegistryClassImpl<CBasePlayer, PLAYER_ANIM> CReGameHookRegistry_CBasePlayer_SetAnimation;
// CBasePlayer::GiveDefaultItems hook
typedef IVoidHookChainClassImpl<CBasePlayer> CRegameHook_CBasePlayer_GiveDefaultItems;
typedef IVoidHookChainRegistryClassImpl<CBasePlayer> CReGameHookRegistry_CBasePlayer_GiveDefaultItems;
// CBasePlayer::GiveNamedItem hook
typedef IVoidHookChainClassImpl<CBasePlayer, const char *> CRegameHook_CBasePlayer_GiveNamedItem;
typedef IVoidHookChainRegistryClassImpl<CBasePlayer, const char *> CReGameHookRegistry_CBasePlayer_GiveNamedItem;
// CBasePlayer::AddAccount hook
typedef IVoidHookChainClassImpl<CBasePlayer, int, bool> CRegameHook_CBasePlayer_AddAccount;
typedef IVoidHookChainRegistryClassImpl<CBasePlayer, int, bool> CReGameHookRegistry_CBasePlayer_AddAccount;
// CBasePlayer::AddAccount hook
typedef IVoidHookChainClassImpl<CBasePlayer, bool> CRegameHook_CBasePlayer_GiveShield;
typedef IVoidHookChainRegistryClassImpl<CBasePlayer, bool> CReGameHookRegistry_CBasePlayer_GiveShield;
// GetForceCamera hook
typedef IHookChainImpl<int, class CBasePlayer *> CReGameHook_GetForceCamera;
typedef IHookChainRegistryImpl<int, class CBasePlayer *> CReGameHookRegistry_GetForceCamera;
// PlayerBlind hook
typedef IVoidHookChainImpl<CBasePlayer *, entvars_t *, entvars_t *, float, float, int, Vector &> CReGameHook_PlayerBlind;
typedef IVoidHookChainRegistryImpl<CBasePlayer *, entvars_t *, entvars_t *, float, float, int, Vector &> CReGameHookRegistry_PlayerBlind;
// RadiusFlash_TraceLine hook
typedef IVoidHookChainImpl<CBasePlayer *, entvars_t *, entvars_t *, Vector &, Vector &, TraceResult *> CReGameHook_RadiusFlash_TraceLine;
typedef IVoidHookChainRegistryImpl<CBasePlayer *, entvars_t *, entvars_t *, Vector &, Vector &, TraceResult *> CReGameHookRegistry_RadiusFlash_TraceLine;
class CReGameHookchains: public IReGameHookchains {
public:
// CBasePlayer virtual
@ -166,16 +185,17 @@ public:
CReGameHookRegistry_CBasePlayer_RoundRespawn m_CBasePlayer_RoundRespawn;
CReGameHookRegistry_CBasePlayer_Blind m_CBasePlayer_Blind;
CReGameHookRegistry_CBasePlayer_Observer_IsValidTarget m_CBasePlayer_Observer_IsValidTarget;
CReGameHookRegistry_CBasePlayer_SetAnimation m_CBasePlayer_SetAnimation;
CReGameHookRegistry_CBasePlayer_GiveDefaultItems m_CBasePlayer_GiveDefaultItems;
CReGameHookRegistry_CBasePlayer_GiveNamedItem m_CBasePlayer_GiveNamedItem;
CReGameHookRegistry_CBasePlayer_AddAccount m_CBasePlayer_AddAccount;
CReGameHookRegistry_CBasePlayer_GiveShield m_CBasePlayer_GiveShield;
CReGameHookRegistry_GetForceCamera m_GetForceCamera;
CReGameHookRegistry_PlayerBlind m_PlayerBlind;
CReGameHookRegistry_RadiusFlash_TraceLine m_RadiusFlash_TraceLine;
public:
virtual IReGameHookRegistry_CBasePlayer_Spawn* CBasePlayer_Spawn();
@ -201,16 +221,19 @@ public:
virtual IReGameHookRegistry_CBasePlayer_RoundRespawn* CBasePlayer_RoundRespawn();
virtual IReGameHookRegistry_CBasePlayer_Blind* CBasePlayer_Blind();
virtual IReGameHookRegistry_CBasePlayer_Observer_IsValidTarget* CBasePlayer_Observer_IsValidTarget();
virtual IReGameHookRegistry_CBasePlayer_SetAnimation* CBasePlayer_SetAnimation();
virtual IReGameHookRegistry_CBasePlayer_GiveDefaultItems* CBasePlayer_GiveDefaultItems();
virtual IReGameHookRegistry_CBasePlayer_GiveNamedItem* CBasePlayer_GiveNamedItem();
virtual IReGameHookRegistry_CBasePlayer_AddAccount* CBasePlayer_AddAccount();
virtual IReGameHookRegistry_CBasePlayer_GiveShield* CBasePlayer_GiveShield();
virtual IReGameHookRegistry_GetForceCamera* GetForceCamera();
virtual IReGameHookRegistry_PlayerBlind* PlayerBlind();
virtual IReGameHookRegistry_RadiusFlash_TraceLine* RadiusFlash_TraceLine();
};
@ -227,3 +250,5 @@ public:
virtual IReGameHookchains *GetHookchains();
virtual IReGameData* GetGameData();
};
extern void Regamedll_CopyString_api(char *dest, const char *source);

View File

@ -92,7 +92,7 @@ void Regamedll_MonitorEntities()
++nCount;
}
CONSOLE_ECHO(__FUNCTION__":: nCount: (%d) (%d)\n", nCount, gpGlobals->maxEntities);
}

View File

@ -45,10 +45,9 @@ extern ICSEntity *INDEX_TO_CSENTITY(int iEntityIndex);
#define __API_VHOOK(fname)\
fname##_
#define __API_HOOK __API_VHOOK
#ifndef HOOK_GAMEDLL
#define __API_HOOK __API_VHOOK
#define __MAKE_VHOOK(fname)\
fname
@ -72,13 +71,14 @@ extern ICSEntity *INDEX_TO_CSENTITY(int iEntityIndex);
#define LINK_HOOK_VOID_CHAIN(functionName, args, ...)\
void functionName args {\
g_ReGameHookchains.m_##functionName.callChain(functionName##_internal, __VA_ARGS__);\
g_ReGameHookchains.m_##functionName.callChain(functionName##_, __VA_ARGS__);\
}
#define LINK_HOOK_CHAIN(ret, functionName, args, ...)\
ret functionName args {\
return g_ReGameHookchains.m_##functionName.callChain(functionName##_internal, __VA_ARGS__);\
return g_ReGameHookchains.m_##functionName.callChain(functionName##_, __VA_ARGS__);\
}
#endif
// Implementation interfaces
@ -198,8 +198,6 @@ public:
virtual ICSPlayerItem *GetWeaponPtr() { ((CBasePlayerItem *)m_pEntity)->GetWeaponPtr(); }
virtual float GetMaxSpeed() { ((CBasePlayerItem *)m_pEntity)->GetMaxSpeed(); }
virtual int iItemSlot() { ((CBasePlayerItem *)m_pEntity)->iItemSlot(); }
public:
virtual CBasePlayerItem *GetEntity() const { return (CBasePlayerItem *)m_pEntity; }
};
class CCSToggle: public CCSAnimating {
@ -311,7 +309,13 @@ public:
virtual void OnTouchingWeapon(CCSWeaponBox *pWeapon) { ((CBasePlayer *)m_pEntity)->OnTouchingWeapon((CWeaponBox *)pWeapon->m_pEntity); }
public:
virtual bool IsConnected() const { return m_pEntity->has_disconnected == false; }
virtual CBasePlayer *GetEntity() const { return (CBasePlayer *)m_pEntity; }
virtual void SetAnimation(PLAYER_ANIM playerAnim) { ((CBasePlayer *)m_pEntity)->SetAnimation(playerAnim); }
virtual void AddAccount(int amount, bool bTrackChange = true) { ((CBasePlayer *)m_pEntity)->AddAccount(amount, bTrackChange); }
virtual void GiveNamedItem(const char *pszName) { ((CBasePlayer *)m_pEntity)->GiveNamedItem(pszName); }
virtual void GiveDefaultItems() { ((CBasePlayer *)m_pEntity)->GiveDefaultItems(); }
virtual void GiveShield(bool bDeploy = true) { ((CBasePlayer *)m_pEntity)->GiveShield(bDeploy); }
};
class CAPI_Bot: public CCSPlayer {