diff --git a/README.md b/README.md
index f3477dc3..6c429e34 100644
--- a/README.md
+++ b/README.md
@@ -24,11 +24,12 @@ Archive's bin directory contains 2 subdirectories, 'bugfixed' and 'pure'
| mp_friendlyfire | 0 | 0 | 2 | Allow inflict damage to teammates
`0` disabled
`1` enabled
`2` FFA mode |
| mp_maxmoney | 16000 | 0 | `0x7FFFFFFF` | The maximum allowable amount of money in the game
| mp_round_infinite | 0 | 0 | 1 | Flags for fine grained control (choose as many as needed)
`0` disabled
`1` enabled
or flags
`a` block round time round end check
`b` block needed players round end check
`c` block VIP assassination/success round end check
`d` block prison escape round end check
`e` block bomb round end check
`f` block team extermination round end check
`g` block hostage rescue round end check
`Example setting:` "ae" blocks round time and bomb round end checks |
-| mp_hegrenade_penetration | 0 | 0 | 1 | Disable grenade damage through walls
`0` disabled
`1` enabled |
-| mp_nadedrops | 0 | 0 | 2 | Drop a grenade after player death
`0` disabled
`1` drop one the grenade
`2` drop a everyone grenades |
+| mp_hegrenade_penetration | 0 | 0 | 1 | Disable grenade damage through walls
`0` disabled
`1` enabled |
+| mp_nadedrops | 0 | 0 | 2 | Drop a grenade after player death
`0` disabled
`1` drop one the grenade
`2` drop a everyone grenades |
| mp_roundrespawn_time | 20 | 0 | - | Player cannot respawn until next round if more than N seconds has elapsed since the beginning round |
-| mp_auto_reload_weapons | 0 | 0 | 1 | Automatically reload each weapon on player spawn
`0` disabled
`1` enabled |
+| mp_auto_reload_weapons | 0 | 0 | 1 | Automatically reload each weapon on player spawn
`0` disabled
`1` enabled |
| mp_refill_bpammo_weapons | 0 | 0 | 2 | Refill amount of backpack ammo up to the max
`0` disabled
`1` refill backpack ammo on player spawn
`2` refill backpack ammo on each weapon reload |
+| bot_deathmatch | 0 | 0 | 2 | Set's the mode for the zBot
`0` disabled
`1` enable mode Deathmatch and not allow to do the scenario
`2` enable Deathmatch and FFA mode |
## How to install zBot for CS 1.6?
* Extract all the files from an [archive](regamedll/extra/zBot/bot_profiles.zip?raw=true)
diff --git a/dist/game.cfg b/dist/game.cfg
index 65acb179..4e55ce7c 100644
--- a/dist/game.cfg
+++ b/dist/game.cfg
@@ -64,3 +64,11 @@ mp_auto_reload_weapons "0"
//
// Default value: "0"
mp_refill_bpammo_weapons 0
+
+// Set's the mode for the zBot
+// 0 - disabled
+// 1 - enable mode Deathmatch and not allow to do the scenario
+// 2 - enable Deathmatch and FFA mode (Free for all)
+//
+// Default value: "0"
+bot_deathmatch 0
diff --git a/regamedll/build.gradle b/regamedll/build.gradle
index eef5be37..19287ecb 100644
--- a/regamedll/build.gradle
+++ b/regamedll/build.gradle
@@ -121,7 +121,7 @@ void setupToolchain(NativeBinarySpec b)
cfg.compilerOptions.enhancedInstructionsSet = EnhancedInstructionsSet.DISABLED
}
else {
- cfg.compilerOptions.args '/Oi', '/GF', '/GS-'
+ cfg.compilerOptions.args '/Oi', '/GF', '/GS-', '/GR-'
}
if (mpLib)
@@ -151,7 +151,7 @@ void setupToolchain(NativeBinarySpec b)
])
cfg.linkerOptions.args '-no-opt-class-analysis'
- cfg.compilerOptions.args '-Qoption,cpp,--treat_func_as_string_literal_cpp', '-g'
+ cfg.compilerOptions.args '-Qoption,cpp,--treat_func_as_string_literal_cpp', '-g0', '-fno-rtti'
cfg.extraLibs 'dl', 'm', 'stdc++'
}
diff --git a/regamedll/dlls/bot/cs_bot.cpp b/regamedll/dlls/bot/cs_bot.cpp
index 0123ac2b..1981638b 100644
--- a/regamedll/dlls/bot/cs_bot.cpp
+++ b/regamedll/dlls/bot/cs_bot.cpp
@@ -11,12 +11,11 @@ LINK_ENTITY_TO_CLASS(bot, CCSBot, CAPI_CSBot);
int GetBotFollowCount(CBasePlayer *leader)
{
int count = 0;
-
for (int i = 1; i <= gpGlobals->maxClients; ++i)
{
CBasePlayer *player = UTIL_PlayerByIndex(i);
- if (player == NULL)
+ if (!player)
continue;
if (FNullEnt(player->pev))
@@ -31,8 +30,8 @@ int GetBotFollowCount(CBasePlayer *leader)
if (!player->IsAlive())
continue;
- CCSBot *bot = dynamic_cast(player);
- if (bot != NULL && bot->GetFollowLeader() == leader)
+ CCSBot *bot = reinterpret_cast(player);
+ if (bot->IsBot() && bot->GetFollowLeader() == leader)
++count;
}
@@ -79,8 +78,7 @@ int CCSBot::__MAKE_VHOOK(TakeDamage)(entvars_t *pevInflictor, entvars_t *pevAtta
if (attacker->IsPlayer())
{
CBasePlayer *player = static_cast(attacker);
-
- if (player->m_iTeam == m_iTeam && !player->IsBot())
+ if (BotRelationship(player) == BOT_TEAMMATE && !player->IsBot())
{
GetChatter()->FriendlyFire();
}
@@ -453,7 +451,7 @@ bool CCSBot::IsDoingScenario() const
if (cv_bot_defer_to_human.value <= 0.0f)
return true;
- return !UTIL_HumansOnTeam(m_iTeam, true);
+ return !UTIL_HumansOnTeam(m_iTeam, IS_ALIVE);
}
// Return true if we noticed the bomb on the ground or on the radar (for T's only)
@@ -650,7 +648,7 @@ CBasePlayer *CCSBot::GetImportantEnemy(bool checkVisibility) const
continue;
// skip friends
- if (player->m_iTeam == m_iTeam)
+ if (BotRelationship(player) == BOT_TEAMMATE)
continue;
// is it "important"
diff --git a/regamedll/dlls/bot/cs_bot_chatter.cpp b/regamedll/dlls/bot/cs_bot_chatter.cpp
index 5ef6c52f..eae1f92a 100644
--- a/regamedll/dlls/bot/cs_bot_chatter.cpp
+++ b/regamedll/dlls/bot/cs_bot_chatter.cpp
@@ -50,7 +50,7 @@ void BotMeme::Transmit(CCSBot *sender) const
{
CBasePlayer *player = UTIL_PlayerByIndex(i);
- if (player == NULL)
+ if (!player)
continue;
if (FNullEnt(player->pev))
@@ -68,20 +68,15 @@ void BotMeme::Transmit(CCSBot *sender) const
continue;
// ignore enemies, since we can't hear them talk
- if (sender->m_iTeam != player->m_iTeam)
+ if (sender->BotRelationship(player) == CCSBot::BOT_ENEMY)
continue;
// if not a bot, fail the test
if (!player->IsBot())
continue;
- CCSBot *bot = dynamic_cast(player);
-
- if (!bot)
- continue;
-
// allow bot to interpret our meme
- Interpret(sender, bot);
+ Interpret(sender, (CCSBot *)player);
}
}
@@ -1523,14 +1518,14 @@ void BotChatterInterface::Update()
BotStatement *BotChatterInterface::GetActiveStatement()
{
// keep track of statement waiting longest to be spoken - it is next
- BotStatement *earliest = NULL;
+ BotStatement *earliest = nullptr;
float earlyTime = 999999999.9f;
for (int i = 1; i <= gpGlobals->maxClients; ++i)
{
CBasePlayer *player = UTIL_PlayerByIndex(i);
- if (player == NULL)
+ if (!player)
continue;
if (FNullEnt(player->pev))
@@ -1544,17 +1539,17 @@ BotStatement *BotChatterInterface::GetActiveStatement()
continue;
// ignore enemies, since we can't hear them talk
- if (m_me->m_iTeam != player->m_iTeam)
+ if (m_me->BotRelationship(player) == CCSBot::BOT_ENEMY)
continue;
- CCSBot *bot = dynamic_cast(player);
-
// if not a bot, fail the test
// TODO: Check if human is currently talking
- if (!bot)
+ if (!player->IsBot())
continue;
- for (BotStatement *say = bot->GetChatter()->m_statementList; say != NULL; say = say->m_next)
+ CCSBot *bot = reinterpret_cast(player);
+ auto say = bot->GetChatter()->m_statementList;
+ while (say)
{
// if this statement is currently being spoken, return it
if (say->IsSpeaking())
@@ -1566,12 +1561,14 @@ BotStatement *BotChatterInterface::GetActiveStatement()
earlyTime = say->GetTimestamp();
earliest = say;
}
+
+ say = say->m_next;
}
}
// make sure it is time to start this statement
- if (earliest != NULL && earliest->GetStartTime() > gpGlobals->time)
- return NULL;
+ if (earliest && earliest->GetStartTime() > gpGlobals->time)
+ return nullptr;
return earliest;
}
diff --git a/regamedll/dlls/bot/cs_bot_event.cpp b/regamedll/dlls/bot/cs_bot_event.cpp
index 9f4e2913..85902ea5 100644
--- a/regamedll/dlls/bot/cs_bot_event.cpp
+++ b/regamedll/dlls/bot/cs_bot_event.cpp
@@ -41,7 +41,7 @@ void CCSBot::__MAKE_VHOOK(OnEvent)(GameEventType event, CBaseEntity *entity, CBa
{
if (event == EVENT_PLAYER_DIED)
{
- if (player->m_iTeam == m_iTeam)
+ if (BotRelationship(player) == BOT_TEAMMATE)
{
CBasePlayer *killer = static_cast(other);
@@ -77,7 +77,7 @@ void CCSBot::__MAKE_VHOOK(OnEvent)(GameEventType event, CBaseEntity *entity, CBa
CBasePlayer *killer = (other != NULL && other->IsPlayer()) ? static_cast(other) : NULL;
// if the human player died in the single player game, tell the team
- if (CSGameRules()->IsCareer() && !victim->IsBot() && victim->m_iTeam == m_iTeam)
+ if (CSGameRules()->IsCareer() && !victim->IsBot() && BotRelationship(victim) == BOT_TEAMMATE)
{
GetChatter()->Say("CommanderDown", 20.0f);
}
@@ -89,10 +89,10 @@ void CCSBot::__MAKE_VHOOK(OnEvent)(GameEventType event, CBaseEntity *entity, CBa
}
// react to teammate death
- if (victim->m_iTeam == m_iTeam)
+ if (BotRelationship(victim) == BOT_TEAMMATE)
{
// chastise friendly fire from humans
- if (killer != NULL && !killer->IsBot() && killer->m_iTeam == m_iTeam && killer != this)
+ if (killer != NULL && !killer->IsBot() && BotRelationship(killer) == BOT_TEAMMATE && killer != this)
{
GetChatter()->KilledFriend();
}
@@ -124,7 +124,7 @@ void CCSBot::__MAKE_VHOOK(OnEvent)(GameEventType event, CBaseEntity *entity, CBa
// an enemy was killed
else
{
- if (killer != NULL && killer->m_iTeam == m_iTeam)
+ if (killer != NULL && BotRelationship(killer) == BOT_TEAMMATE)
{
// only chatter about enemy kills if we see them occur, and they were the last one we see
if (GetNearbyEnemyCount() <= 1)
@@ -240,7 +240,7 @@ void CCSBot::__MAKE_VHOOK(OnEvent)(GameEventType event, CBaseEntity *entity, CBa
}
// Process radio events from our team
- if (player != NULL && player->m_iTeam == m_iTeam && event > EVENT_START_RADIO_1 && event < EVENT_END_RADIO)
+ if (player != NULL && BotRelationship(player) == BOT_TEAMMATE && event > EVENT_START_RADIO_1 && event < EVENT_END_RADIO)
{
// TODO: Distinguish between radio commands and responses
if (event != EVENT_RADIO_AFFIRMATIVE && event != EVENT_RADIO_NEGATIVE && event != EVENT_RADIO_REPORTING_IN)
diff --git a/regamedll/dlls/bot/cs_bot_init.cpp b/regamedll/dlls/bot/cs_bot_init.cpp
index 836365da..41b68609 100644
--- a/regamedll/dlls/bot/cs_bot_init.cpp
+++ b/regamedll/dlls/bot/cs_bot_init.cpp
@@ -37,6 +37,10 @@ cvar_t cv_bot_profile_db = { "bot_profile_db", "BotProfile.db", FCVAR_SERVER, 0.
#endif
+#ifdef REGAMEDLL_ADD
+cvar_t cv_bot_deathmatch = { "bot_deathmatch", "0", FCVAR_SERVER, 0.0f, NULL };
+#endif
+
void InstallBotControl()
{
if (TheBots != NULL)
@@ -91,6 +95,11 @@ void Bot_RegisterCvars()
CVAR_REGISTER(&cv_bot_defer_to_human);
CVAR_REGISTER(&cv_bot_chatter);
CVAR_REGISTER(&cv_bot_profile_db);
+
+#ifdef REGAMEDLL_ADD
+ CVAR_REGISTER(&cv_bot_deathmatch);
+#endif
+
}
// Constructor
diff --git a/regamedll/dlls/bot/cs_bot_manager.cpp b/regamedll/dlls/bot/cs_bot_manager.cpp
index 28b34c69..dfe51683 100644
--- a/regamedll/dlls/bot/cs_bot_manager.cpp
+++ b/regamedll/dlls/bot/cs_bot_manager.cpp
@@ -330,27 +330,24 @@ void CCSBotManager::__MAKE_VHOOK(ServerDeactivate)()
void CCSBotManager::__MAKE_VHOOK(ClientDisconnect)(CBasePlayer *pPlayer)
{
- if (pPlayer != NULL && pPlayer->IsBot())
+ if (!pPlayer || !pPlayer->IsBot())
+ return;
+
+ auto pevTemp = VARS(pPlayer->edict());
+
+ CCSBot *bot = reinterpret_cast(pPlayer);
+ bot->Disconnect();
+
+ if (!FStringNull(pPlayer->pev->classname))
{
- entvars_t *temp = VARS(pPlayer->edict());
- CCSBot *pBot = dynamic_cast(pPlayer);
-
- if (pBot != NULL)
- {
- pBot->Disconnect();
- }
-
- if (!FStringNull(pPlayer->pev->classname))
- {
- RemoveEntityHashValue(pPlayer->pev, STRING(pPlayer->pev->classname), CLASSNAME);
- }
-
- FREE_PRIVATE(pPlayer->edict());
-
- CBasePlayer *player = GetClassPtr((CBasePlayer *)temp);
- AddEntityHashValue(player->pev, STRING(player->pev->classname), CLASSNAME);
- player->pev->flags = FL_DORMANT;
+ RemoveEntityHashValue(pPlayer->pev, STRING(pPlayer->pev->classname), CLASSNAME);
}
+
+ FREE_PRIVATE(pPlayer->edict());
+
+ auto player = GetClassPtr((CBasePlayer *)pevTemp);
+ AddEntityHashValue(player->pev, STRING(player->pev->classname), CLASSNAME);
+ player->pev->flags = FL_DORMANT;
}
void PrintAllEntities()
@@ -1029,9 +1026,13 @@ void CCSBotManager::ValidateMapData()
m_zoneCount = 0;
m_gameScenario = SCENARIO_DEATHMATCH;
- // Search all entities in the map and set the game type and
- // store all zones (bomb target, etc).
+#ifdef REGAMEDLL_ADD
+ // if we have included deathmatch mode, so set the game type like SCENARIO_DEATHMATCH
+ if (cv_bot_deathmatch.value > 0.0f)
+ return;
+#endif
+ // Search all entities in the map and set the game type and store all zones (bomb target, etc).
CBaseEntity *entity = NULL;
int i;
for (i = 1; i < gpGlobals->maxEntities; ++i)
@@ -1410,10 +1411,7 @@ unsigned int CCSBotManager::__MAKE_VHOOK(GetPlayerPriority)(CBasePlayer *player)
if (!player->IsBot())
return 0;
- CCSBot *bot = dynamic_cast(player);
-
- if (!bot)
- return 0;
+ CCSBot *bot = reinterpret_cast(player);
// bots doing something important for the current scenario have high priority
switch (GetScenario())
diff --git a/regamedll/dlls/bot/cs_bot_pathfind.cpp b/regamedll/dlls/bot/cs_bot_pathfind.cpp
index cdf32062..ef2d2cc4 100644
--- a/regamedll/dlls/bot/cs_bot_pathfind.cpp
+++ b/regamedll/dlls/bot/cs_bot_pathfind.cpp
@@ -1094,7 +1094,8 @@ bool CCSBot::IsFriendInTheWay(const Vector *goalPos) const
if (!player->IsAlive())
continue;
- if (player->m_iTeam != m_iTeam)
+ // ignore enemies
+ if (BotRelationship(player) == BOT_ENEMY)
continue;
if (player == this)
diff --git a/regamedll/dlls/bot/cs_bot_vision.cpp b/regamedll/dlls/bot/cs_bot_vision.cpp
index fa3d4ddb..a654b6d1 100644
--- a/regamedll/dlls/bot/cs_bot_vision.cpp
+++ b/regamedll/dlls/bot/cs_bot_vision.cpp
@@ -678,7 +678,7 @@ CBasePlayer *CCSBot::FindMostDangerousThreat()
continue;
// is it an enemy?
- if (player->m_iTeam == m_iTeam)
+ if (BotRelationship(player) == BOT_TEAMMATE)
{
TraceResult result;
UTIL_TraceLine(GetEyePosition(), player->pev->origin, ignore_monsters, ignore_glass, edict(), &result);
@@ -810,8 +810,9 @@ CBasePlayer *CCSBot::FindMostDangerousThreat()
{
// find the area the player/bot is standing on
CNavArea *area;
- CCSBot *bot = dynamic_cast(threat[i].enemy);
- if (bot != NULL && bot->IsBot())
+ CCSBot *bot = reinterpret_cast(threat[i].enemy);
+
+ if (bot->IsBot())
{
area = bot->GetLastKnownArea();
}
diff --git a/regamedll/dlls/bot/cs_bot_weapon.cpp b/regamedll/dlls/bot/cs_bot_weapon.cpp
index db91a411..0614f563 100644
--- a/regamedll/dlls/bot/cs_bot_weapon.cpp
+++ b/regamedll/dlls/bot/cs_bot_weapon.cpp
@@ -795,15 +795,15 @@ void CCSBot::SilencerCheck()
// Invoked when in contact with a CWeaponBox
void CCSBot::__MAKE_VHOOK(OnTouchingWeapon)(CWeaponBox *box)
{
- CBasePlayerItem *droppedGun = dynamic_cast(box->m_rgpPlayerItems[ PRIMARY_WEAPON_SLOT ]);
+ auto pDroppedWeapon = box->m_rgpPlayerItems[ PRIMARY_WEAPON_SLOT ];
// right now we only care about primary weapons on the ground
- if (droppedGun != NULL)
+ if (pDroppedWeapon)
{
- CBasePlayerWeapon *myGun = dynamic_cast(m_rgpPlayerItems[ PRIMARY_WEAPON_SLOT ]);
+ CBasePlayerWeapon *pWeapon = (CBasePlayerWeapon *)m_rgpPlayerItems[ PRIMARY_WEAPON_SLOT ];
// if the gun on the ground is the same one we have, dont bother
- if (myGun != NULL && droppedGun->m_iId != myGun->m_iId)
+ if (pWeapon && pWeapon->IsWeapon() && pDroppedWeapon->m_iId != pWeapon->m_iId)
{
// if we don't have a weapon preference, give up
if (GetProfile()->HasPrimaryPreference())
@@ -816,15 +816,14 @@ void CCSBot::__MAKE_VHOOK(OnTouchingWeapon)(CWeaponBox *box)
for (int i = 0; i < GetProfile()->GetWeaponPreferenceCount(); ++i)
{
int prefID = GetProfile()->GetWeaponPreference(i);
-
if (!IsPrimaryWeapon(prefID))
continue;
// if the gun we are using is more desirable, give up
- if (prefID == myGun->m_iId)
+ if (prefID == pWeapon->m_iId)
break;
- if (prefID == droppedGun->m_iId)
+ if (prefID == pDroppedWeapon->m_iId)
{
// the gun on the ground is better than the one we have - drop our gun
DropPrimary(this);
@@ -859,7 +858,7 @@ bool CCSBot::IsFriendInLineOfFire()
{
CBasePlayer *player = static_cast(victim);
- if (player->m_iTeam == m_iTeam)
+ if (BotRelationship(player) == BOT_TEAMMATE)
return true;
}
}
diff --git a/regamedll/dlls/client.cpp b/regamedll/dlls/client.cpp
index 7b10beef..97c6f4c1 100644
--- a/regamedll/dlls/client.cpp
+++ b/regamedll/dlls/client.cpp
@@ -127,7 +127,7 @@ BOOL EXT_FUNC ClientConnect(edict_t *pEntity, const char *pszName, const char *p
void EXT_FUNC ClientDisconnect(edict_t *pEntity)
{
- CBasePlayer *pPlayer = dynamic_cast(CBaseEntity::Instance(pEntity));
+ CBasePlayer *pPlayer = CBasePlayer::Instance(pEntity);
if (!g_fGameOver)
{
@@ -135,21 +135,26 @@ void EXT_FUNC ClientDisconnect(edict_t *pEntity)
#ifndef REGAMEDLL_FIXES
CSound *pSound = CSoundEnt::SoundPointerForIndex(CSoundEnt::ClientSoundIndex(pEntity));
- if (pSound != NULL)
+ if (pSound)
pSound->Reset();
#endif
pEntity->v.takedamage = DAMAGE_NO;
pEntity->v.solid = SOLID_NOT;
pEntity->v.flags = FL_DORMANT;
- if (pPlayer != NULL)
- pPlayer->SetThink(NULL);
+ if (pPlayer)
+ pPlayer->SetThink(nullptr);
UTIL_SetOrigin(&pEntity->v, pEntity->v.origin);
g_pGameRules->ClientDisconnected(pEntity);
}
- if (TheBots != NULL && pPlayer != NULL && pPlayer->IsBot())
+#ifndef REGAMEDLL_FIXES
+ if (TheBots && pPlayer && pPlayer->IsBot())
+#else
+ // These checks are already inside into this CCSBotManager::ClientDisconnect
+ if (TheBots)
+#endif
{
TheBots->ClientDisconnect(pPlayer);
}
@@ -180,28 +185,28 @@ void respawn(entvars_t *pev, BOOL fCopyCorpse)
void EXT_FUNC ClientKill(edict_t *pEntity)
{
entvars_t *pev = &pEntity->v;
- CBasePlayer *pl = (CBasePlayer *)CBasePlayer::Instance(pev);
+ CBasePlayer *pPlayer = CBasePlayer::Instance(pev);
- if (pl->IsObserver())
+ if (pPlayer->IsObserver())
return;
- if (pl->m_iJoiningState != JOINED)
+ if (pPlayer->m_iJoiningState != JOINED)
return;
// prevent suiciding too often
- if (pl->m_fNextSuicideTime > gpGlobals->time)
+ if (pPlayer->m_fNextSuicideTime > gpGlobals->time)
return;
- pl->m_LastHitGroup = 0;
+ pPlayer->m_LastHitGroup = 0;
// don't let them suicide for 5 seconds after suiciding
- pl->m_fNextSuicideTime = gpGlobals->time + 1;
+ pPlayer->m_fNextSuicideTime = gpGlobals->time + 1.0f;
// have the player kill themself
pEntity->v.health = 0;
- pl->Killed(pev, GIB_NEVER);
+ pPlayer->Killed(pev, GIB_NEVER);
- if (CSGameRules()->m_pVIP == pl)
+ if (CSGameRules()->m_pVIP == pPlayer)
{
CSGameRules()->m_iConsecutiveVIP = 10;
}
@@ -219,18 +224,18 @@ void __API_HOOK(ShowMenu)(CBasePlayer *pPlayer, int bitsValidSlots, int nDisplay
MESSAGE_END();
}
-LINK_HOOK_VOID_CHAIN(ShowVGUIMenu, (CBasePlayer *pPlayer, int MenuType, int BitMask, char *szOldMenu), pPlayer, MenuType, BitMask, szOldMenu);
+LINK_HOOK_VOID_CHAIN(ShowVGUIMenu, (CBasePlayer *pPlayer, int MenuType, int BitMask, char *szOldMenu, bool bForceOldMenu), pPlayer, MenuType, BitMask, szOldMenu, bForceOldMenu);
-void __API_HOOK(ShowVGUIMenu)(CBasePlayer *pPlayer, int MenuType, int BitMask, char *szOldMenu)
+void __API_HOOK(ShowVGUIMenu)(CBasePlayer *pPlayer, int MenuType, int BitMask, char *szOldMenu, bool bForceOldMenu)
{
- if (pPlayer->m_bVGUIMenus || MenuType > VGUI_Menu_Buy_Item)
+ if (!bForceOldMenu && (pPlayer->m_bVGUIMenus || MenuType > VGUI_Menu_Buy_Item))
{
MESSAGE_BEGIN(MSG_ONE, gmsgVGUIMenu, NULL, pPlayer->pev);
- WRITE_BYTE(MenuType);
- WRITE_SHORT(BitMask);
- WRITE_CHAR(-1);
- WRITE_BYTE(0);
- WRITE_STRING(" ");
+ WRITE_BYTE(MenuType);
+ WRITE_SHORT(BitMask);
+ WRITE_CHAR(-1);
+ WRITE_BYTE(0);
+ WRITE_STRING(" ");
MESSAGE_END();
}
else
@@ -669,7 +674,7 @@ void Host_Say(edict_t *pEntity, int teamonly)
Place playerPlace = TheNavAreaGrid.GetPlace(&player->pev->origin);
const BotPhraseList *placeList = TheBotPhrases->GetPlaceList();
- for (auto& it : *placeList)
+ for (auto it : *placeList)
{
if (it->GetID() == playerPlace)
{
@@ -3244,13 +3249,14 @@ void EXT_FUNC ClientCommand(edict_t *pEntity)
}
}
+// called after the player changes userinfo - gives dll a chance to modify it before it gets sent into the rest of the engine.
void EXT_FUNC ClientUserInfoChanged(edict_t *pEntity, char *infobuffer)
{
// Is the client spawned yet?
if (!pEntity->pvPrivateData)
return;
- CBasePlayer *pPlayer = (CBasePlayer *)CBaseEntity::Instance(pEntity);
+ CBasePlayer *pPlayer = CBasePlayer::Instance(pEntity);
char *szBufferName = GET_KEY_VALUE(infobuffer, "name");
// msg everyone if someone changes their name, and it isn't the first time (changing no name to current name)
@@ -3270,6 +3276,7 @@ void EXT_FUNC ClientUserInfoChanged(edict_t *pEntity, char *infobuffer)
if (szName[0] == '#')
szName[0] = '*';
+ // Set the name
pPlayer->SetClientUserInfoName(infobuffer, szName);
}
@@ -3857,7 +3864,16 @@ void ClientPrecache()
const char *EXT_FUNC GetGameDescription()
{
- return g_bIsCzeroGame ? "Condition Zero" : "Counter-Strike";
+#ifdef REGAMEDLL_ADD
+ if (CSGameRules()) {
+ return CSGameRules()->GetGameDescription();
+ }
+#else
+ if (g_bIsCzeroGame) {
+ return "Condition Zero";
+ }
+#endif
+ return "Counter-Strike";
}
void EXT_FUNC Sys_Error(const char *error_string)
@@ -3938,14 +3954,13 @@ void EXT_FUNC SetupVisibility(edict_t *pViewEntity, edict_t *pClient, unsigned c
if (pClient->v.flags & FL_PROXY)
{
- *pvs = NULL; // the spectator proxy sees
- *pas = NULL; // and hears everything
+ *pvs = nullptr; // the spectator proxy sees
+ *pas = nullptr; // and hears everything
return;
}
- CBasePlayer *pPlayer = dynamic_cast(CBasePlayer::Instance(pClient));
-
- if (pPlayer != NULL && pPlayer->pev->iuser2 && pPlayer->m_hObserverTarget)
+ CBasePlayer *pPlayer = CBasePlayer::Instance(pClient);
+ if (pPlayer && pPlayer->pev->iuser2 && pPlayer->m_hObserverTarget)
{
if (pPlayer->m_afPhysicsFlags & PFLAG_OBSERVER)
{
@@ -4131,7 +4146,6 @@ int EXT_FUNC AddToFullPack(struct entity_state_s *state, int e, edict_t *ent, ed
if (ent->v.owner)
{
int owner = ENTINDEX(ent->v.owner);
-
if (owner >= 1 && owner <= gpGlobals->maxClients)
state->owner = owner;
}
@@ -4368,6 +4382,7 @@ void Custom_Encode(struct delta_s *pFields, const unsigned char *from, const uns
}
}
+// Allows game .dll to override network encoding of certain types of entities and tweak values, etc.
void EXT_FUNC RegisterEncoders()
{
DELTA_ADDENCODER("Entity_Encode", Entity_Encode);
@@ -4375,76 +4390,79 @@ void EXT_FUNC RegisterEncoders()
DELTA_ADDENCODER("Player_Encode", Player_Encode);
}
-int EXT_FUNC GetWeaponData(edict_s *player, struct weapon_data_s *info)
+int EXT_FUNC GetWeaponData(edict_t *player, struct weapon_data_s *info)
{
+#ifdef CLIENT_WEAPONS
entvars_t *pev = &player->v;
- CBasePlayer *pl = dynamic_cast(CBasePlayer::Instance(pev));
+ CBasePlayer *pPlayer = CBasePlayer::Instance(pev);
Q_memset(info, 0, sizeof(weapon_data_t) * MAX_WEAPONS);
- if (!pl)
- {
+ if (!pPlayer)
return 1;
- }
+ // go through all of the weapons and make a list of the ones to pack
for (int i = 0; i < MAX_ITEM_TYPES; ++i)
{
- CBasePlayerItem *pPlayerItem = pl->m_rgpPlayerItems[i];
-
- while (pPlayerItem != NULL)
+ auto pPlayerItem = pPlayer->m_rgpPlayerItems[i];
+ while (pPlayerItem != nullptr)
{
- CBasePlayerWeapon *gun = dynamic_cast(pPlayerItem->GetWeaponPtr());
-
- if (gun != NULL && gun->UseDecrement())
+ // there's a weapon here. Should I pack it?
+ auto weapon = (CBasePlayerWeapon *)pPlayerItem->GetWeaponPtr();
+ if (weapon && weapon->UseDecrement())
{
+ // Get The ID
ItemInfo II;
Q_memset(&II, 0, sizeof(II));
- gun->GetItemInfo(&II);
+ weapon->GetItemInfo(&II);
if (II.iId >= 0 && II.iId < MAX_WEAPONS)
{
- weapon_data_t *item = &info[II.iId];
+ auto item = &info[II.iId];
item->m_iId = II.iId;
- item->m_iClip = gun->m_iClip;
- item->m_flTimeWeaponIdle = Q_max(gun->m_flTimeWeaponIdle, -0.001f);
- item->m_flNextPrimaryAttack = Q_max(gun->m_flNextPrimaryAttack, -0.001f);
- item->m_flNextSecondaryAttack = Q_max(gun->m_flNextSecondaryAttack, -0.001f);
- item->m_flNextReload = Q_max(gun->m_flNextReload, -0.001f);
- item->m_fInReload = gun->m_fInReload;
- item->m_fInSpecialReload = gun->m_fInSpecialReload;
- item->m_fInZoom = gun->m_iShotsFired;
- item->m_fAimedDamage = gun->m_flLastFire;
- item->m_iWeaponState = gun->m_iWeaponState;
- item->fuser2 = gun->m_flStartThrow;
- item->fuser3 = gun->m_flReleaseThrow;
- item->iuser1 = gun->m_iSwing;
+ item->m_iClip = weapon->m_iClip;
+ item->m_flTimeWeaponIdle = Q_max(weapon->m_flTimeWeaponIdle, -0.001f);
+ item->m_flNextPrimaryAttack = Q_max(weapon->m_flNextPrimaryAttack, -0.001f);
+ item->m_flNextSecondaryAttack = Q_max(weapon->m_flNextSecondaryAttack, -0.001f);
+ item->m_flNextReload = Q_max(weapon->m_flNextReload, -0.001f);
+ item->m_fInReload = weapon->m_fInReload;
+ item->m_fInSpecialReload = weapon->m_fInSpecialReload;
+ item->m_fInZoom = weapon->m_iShotsFired;
+ item->m_fAimedDamage = weapon->m_flLastFire;
+ item->m_iWeaponState = weapon->m_iWeaponState;
+ item->fuser2 = weapon->m_flStartThrow;
+ item->fuser3 = weapon->m_flReleaseThrow;
+ item->iuser1 = weapon->m_iSwing;
}
}
pPlayerItem = pPlayerItem->m_pNext;
}
}
+#else
+ Q_memset(info, 0, sizeof(weapon_data_t) * MAX_WEAPONS);
+#endif
return 1;
}
+// Data sent to current client only engine sets cd to 0 before calling.
void EXT_FUNC UpdateClientData(const struct edict_s *ent, int sendweapons, struct clientdata_s *cd)
{
if (!ent || !ent->pvPrivateData)
- {
return;
- }
- entvars_t *pevOrg = NULL;
+ entvars_t *pevOrg = nullptr;
entvars_t *pev = const_cast(&ent->v);
- CBasePlayer *pl = dynamic_cast(CBasePlayer::Instance(pev));
+ CBasePlayer *pPlayer = CBasePlayer::Instance(pev);
- if (pl != NULL && pl->pev->iuser1 == OBS_IN_EYE && pl->m_hObserverTarget)
+ // if user is spectating different player in First person, override some vars
+ if (pPlayer && pPlayer->pev->iuser1 == OBS_IN_EYE && pPlayer->m_hObserverTarget)
{
pevOrg = pev;
- pev = pl->m_hObserverTarget->pev;
- pl = dynamic_cast(CBasePlayer::Instance(pev));
+ pev = pPlayer->m_hObserverTarget->pev;
+ pPlayer = CBasePlayer::Instance(pev);
}
cd->flags = pev->flags;
@@ -4487,34 +4505,34 @@ void EXT_FUNC UpdateClientData(const struct edict_s *ent, int sendweapons, struc
cd->fuser3 = pev->fuser3;
cd->fuser2 = pev->fuser2;
- if (sendweapons && pl != NULL)
+ if (sendweapons && pPlayer)
{
- cd->ammo_shells = pl->ammo_buckshot;
- cd->ammo_nails = pl->ammo_9mm;
- cd->ammo_cells = pl->ammo_556nato;
- cd->ammo_rockets = pl->ammo_556natobox;
- cd->vuser2.x = pl->ammo_762nato;
- cd->vuser2.y = pl->ammo_45acp;
- cd->vuser2.z = pl->ammo_50ae;
- cd->vuser3.x = pl->ammo_338mag;
- cd->vuser3.y = pl->ammo_57mm;
- cd->vuser3.z = pl->ammo_357sig;
- cd->m_flNextAttack = pl->m_flNextAttack;
+ cd->ammo_shells = pPlayer->ammo_buckshot;
+ cd->ammo_nails = pPlayer->ammo_9mm;
+ cd->ammo_cells = pPlayer->ammo_556nato;
+ cd->ammo_rockets = pPlayer->ammo_556natobox;
+ cd->vuser2.x = pPlayer->ammo_762nato;
+ cd->vuser2.y = pPlayer->ammo_45acp;
+ cd->vuser2.z = pPlayer->ammo_50ae;
+ cd->vuser3.x = pPlayer->ammo_338mag;
+ cd->vuser3.y = pPlayer->ammo_57mm;
+ cd->vuser3.z = pPlayer->ammo_357sig;
+ cd->m_flNextAttack = pPlayer->m_flNextAttack;
int iUser3 = 0;
- if (pl->m_bCanShoot && !pl->m_bIsDefusing)
+ if (pPlayer->m_bCanShoot && !pPlayer->m_bIsDefusing)
iUser3 |= DATA_IUSER3_CANSHOOT;
if (g_pGameRules->IsFreezePeriod())
iUser3 |= DATA_IUSER3_FREEZETIMEOVER;
- if (pl->m_signals.GetState() & SIGNAL_BOMB)
+ if (pPlayer->m_signals.GetState() & SIGNAL_BOMB)
iUser3 |= DATA_IUSER3_INBOMBZONE;
- if (pl->HasShield())
+ if (pPlayer->HasShield())
iUser3 |= DATA_IUSER3_HOLDINGSHIELD;
- if (!pl->pev->iuser1 && !pevOrg)
+ if (pPlayer->pev->iuser1 == OBS_NONE && !pevOrg)
{
#ifdef REGAMEDLL_ADD
// useful for mods
@@ -4523,21 +4541,20 @@ void EXT_FUNC UpdateClientData(const struct edict_s *ent, int sendweapons, struc
cd->iuser3 = iUser3;
}
- if (pl->m_pActiveItem != NULL)
+ if (pPlayer->m_pActiveItem)
{
ItemInfo II;
Q_memset(&II, 0, sizeof(II));
- CBasePlayerWeapon *gun = dynamic_cast(pl->m_pActiveItem->GetWeaponPtr());
-
- if (gun != NULL && gun->UseDecrement() && gun->GetItemInfo(&II))
+ CBasePlayerWeapon *weapon = (CBasePlayerWeapon *)pPlayer->m_pActiveItem->GetWeaponPtr();
+ if (weapon && weapon->UseDecrement() && weapon->GetItemInfo(&II))
{
cd->m_iId = II.iId;
- if ((unsigned int)gun->m_iPrimaryAmmoType < MAX_AMMO_TYPES)
+ if ((unsigned int)weapon->m_iPrimaryAmmoType < MAX_AMMO_TYPES)
{
- cd->vuser4.x = gun->m_iPrimaryAmmoType;
- cd->vuser4.y = pl->m_rgAmmo[ gun->m_iPrimaryAmmoType ];
+ cd->vuser4.x = weapon->m_iPrimaryAmmoType;
+ cd->vuser4.y = pPlayer->m_rgAmmo[ weapon->m_iPrimaryAmmoType ];
}
else
{
@@ -4552,32 +4569,30 @@ void EXT_FUNC UpdateClientData(const struct edict_s *ent, int sendweapons, struc
void EXT_FUNC CmdStart(const edict_t *player, const struct usercmd_s *cmd, unsigned int random_seed)
{
entvars_t *pev = const_cast(&player->v);
- CBasePlayer *pl = dynamic_cast(CBasePlayer::Instance(pev));
+ CBasePlayer *pPlayer = CBasePlayer::Instance(pev);
- if (pl != NULL)
- {
- if (pl->pev->groupinfo)
- {
- UTIL_SetGroupTrace(pl->pev->groupinfo, GROUP_OP_AND);
- }
+ if (!pPlayer)
+ return;
- pl->random_seed = random_seed;
- }
+ if (pPlayer->pev->groupinfo)
+ UTIL_SetGroupTrace(pPlayer->pev->groupinfo, GROUP_OP_AND);
+
+ pPlayer->random_seed = random_seed;
}
void EXT_FUNC CmdEnd(const edict_t *player)
{
entvars_t *pev = const_cast(&player->v);
- CBasePlayer *pl = dynamic_cast(CBasePlayer::Instance(pev));
+ CBasePlayer *pPlayer = CBasePlayer::Instance(pev);
- if (pl != NULL)
- {
- if (pl->pev->groupinfo)
- UTIL_UnsetGroupTrace();
+ if (!pPlayer)
+ return;
- if (pev->flags & FL_DUCKING)
- UTIL_SetSize(pev, VEC_DUCK_HULL_MIN, VEC_DUCK_HULL_MAX);
- }
+ if (pPlayer->pev->groupinfo)
+ UTIL_UnsetGroupTrace();
+
+ if (pev->flags & FL_DUCKING)
+ UTIL_SetSize(pev, VEC_DUCK_HULL_MIN, VEC_DUCK_HULL_MAX);
}
int EXT_FUNC ConnectionlessPacket(const struct netadr_s *net_from, const char *args, char *response_buffer, int *response_buffer_size)
diff --git a/regamedll/dlls/client.h b/regamedll/dlls/client.h
index 7f933c90..8e0a746d 100644
--- a/regamedll/dlls/client.h
+++ b/regamedll/dlls/client.h
@@ -122,8 +122,8 @@ void respawn(entvars_t *pev, BOOL fCopyCorpse = FALSE);
void ClientKill(edict_t *pEntity);
void ShowMenu(CBasePlayer *pPlayer, int bitsValidSlots, int nDisplayTime, BOOL fNeedMore, char *pszText);
void ShowMenu_(CBasePlayer *pPlayer, int bitsValidSlots, int nDisplayTime, BOOL fNeedMore, char *pszText);
-void ShowVGUIMenu(CBasePlayer *pPlayer, int MenuType, int BitMask, char *szOldMenu);
-void ShowVGUIMenu_(CBasePlayer *pPlayer, int MenuType, int BitMask, char *szOldMenu);
+void ShowVGUIMenu(CBasePlayer *pPlayer, int MenuType, int BitMask, char *szOldMenu, bool bForceOldMenu = false);
+void ShowVGUIMenu_(CBasePlayer *pPlayer, int MenuType, int BitMask, char *szOldMenu, bool bForceOldMenu = false);
void ListPlayers(CBasePlayer *current);
void ProcessKickVote(CBasePlayer *pVotingPlayer, CBasePlayer *pKickPlayer);
TeamName SelectDefaultTeam();
diff --git a/regamedll/dlls/game.cpp b/regamedll/dlls/game.cpp
index 5383441f..11bbb382 100644
--- a/regamedll/dlls/game.cpp
+++ b/regamedll/dlls/game.cpp
@@ -102,7 +102,7 @@ cvar_t hegrenade_penetration = { "mp_hegrenade_penetration", "0", 0, 0.0f, nullp
cvar_t nadedrops = { "mp_nadedrops", "0", 0, 0.0f, nullptr };
cvar_t roundrespawn_time = { "mp_roundrespawn_time", "20", 0, 20.0f, nullptr };
cvar_t auto_reload_weapons = { "mp_auto_reload_weapons", "0", 0, 0.0f, nullptr };
-cvar_t refill_bpammo_weapons = { "mp_refill_bpammo_weapons", "0", 0, 0.0f, nullptr }; // Useful for mods like CSDM, GunGame, ZombieMod etc
+cvar_t refill_bpammo_weapons = { "mp_refill_bpammo_weapons", "0", 0, 0.0f, nullptr }; // Useful for mods like DeathMatch, GunGame, ZombieMod etc
void GameDLL_Version_f()
{
diff --git a/regamedll/dlls/gamerules.cpp b/regamedll/dlls/gamerules.cpp
index 0d76df47..119f45c7 100644
--- a/regamedll/dlls/gamerules.cpp
+++ b/regamedll/dlls/gamerules.cpp
@@ -9,6 +9,29 @@ CGameRules *g_pGameRules = NULL;
#endif
+CGameRules::CGameRules()
+ : m_GameDesc()
+{
+ m_GameDesc = new char[sizeof("Counter-Strike")];
+ Q_strcpy(m_GameDesc, AreRunningCZero() ? "Condition Zero" : "Counter-Strike");
+}
+
+CGameRules::~CGameRules()
+{
+ delete[] m_GameDesc;
+ m_GameDesc = nullptr;
+}
+
+// this is the game name that gets seen in the server browser
+const char *CGameRules::GetGameDescription()
+{
+#ifdef REGAMEDLL_ADD
+ return m_GameDesc;
+#else
+ return "Counter-Strike";
+#endif
+}
+
BOOL CGameRules::__MAKE_VHOOK(CanHaveAmmo)(CBasePlayer *pPlayer, const char *pszAmmoName, int iMaxCarry)
{
int iAmmoIndex;
diff --git a/regamedll/dlls/gamerules.h b/regamedll/dlls/gamerules.h
index 7f70d65c..4aeda18e 100644
--- a/regamedll/dlls/gamerules.h
+++ b/regamedll/dlls/gamerules.h
@@ -218,6 +218,8 @@ class CItem;
class CGameRules
{
public:
+ CGameRules();
+ virtual ~CGameRules();
virtual void RefreshSkillData();
virtual void Think() = 0;
virtual BOOL IsAllowedToSpawn(CBaseEntity *pEntity) = 0;
@@ -228,7 +230,7 @@ public:
virtual BOOL IsDeathmatch() = 0;
virtual BOOL IsTeamplay() { return FALSE; }
virtual BOOL IsCoOp() = 0;
- virtual const char *GetGameDescription() { return "Counter-Strike"; } // this is the game name that gets seen in the server browser
+ virtual const char *GetGameDescription(); // this is the game name that gets seen in the server browser
virtual BOOL ClientConnected(edict_t *pEntity, const char *pszName, const char *pszAddress, char *szRejectReason) = 0;
virtual void InitHUD(CBasePlayer *pl) = 0;
virtual void ClientDisconnected(edict_t *pClient) = 0;
@@ -296,12 +298,16 @@ public:
public:
BOOL m_bFreezePeriod;
BOOL m_bBombDropped;
+
+ // custom
+ char *m_GameDesc;
};
class CHalfLifeRules: public CGameRules
{
public:
CHalfLifeRules();
+ virtual ~CHalfLifeRules() {};
virtual void Think();
virtual BOOL IsAllowedToSpawn(CBaseEntity *pEntity);
@@ -400,7 +406,8 @@ class CHalfLifeMultiplay: public CGameRules
{
public:
CHalfLifeMultiplay();
-public:
+ virtual ~CHalfLifeMultiplay() {};
+
virtual void RefreshSkillData();
virtual void Think();
virtual BOOL IsAllowedToSpawn(CBaseEntity *pEntity);
@@ -614,6 +621,7 @@ public:
VFUNC void UpdateTeamScores();
VFUNC void EndRoundMessage(const char *sentence, int event);
VFUNC void SetAccountRules(RewardRules rules, int amount) { m_rgRewardAccountRules[rules] = static_cast(amount); }
+ VFUNC RewardAccount GetAccountRules(RewardRules rules) const { return m_rgRewardAccountRules[rules]; }
void DisplayMaps(CBasePlayer *player, int iVote);
void ResetAllMapVotes();
diff --git a/regamedll/dlls/ggrenade.cpp b/regamedll/dlls/ggrenade.cpp
index e54d1fd5..da6cfb65 100644
--- a/regamedll/dlls/ggrenade.cpp
+++ b/regamedll/dlls/ggrenade.cpp
@@ -1059,11 +1059,10 @@ CGrenade *CGrenade::ShootSatchelCharge(entvars_t *pevOwner, Vector vecStart, Vec
pGrenade->pev->friction = 0.9f;
pGrenade->m_bJustBlew = false;
- CBasePlayer *owner = dynamic_cast(CBasePlayer::Instance(pevOwner));
-
- if (owner != NULL && owner->IsPlayer())
+ CBasePlayer *pOwner = CBasePlayer::Instance(pevOwner);
+ if (pOwner && pOwner->IsPlayer())
{
- pGrenade->m_pentCurBombTarget = owner->m_pentCurBombTarget;
+ pGrenade->m_pentCurBombTarget = pOwner->m_pentCurBombTarget;
}
else
pGrenade->m_pentCurBombTarget = NULL;
@@ -1217,15 +1216,14 @@ void CGrenade::C4Think()
if (m_pentCurBombTarget)
{
CBaseEntity *pBombTarget = CBaseEntity::Instance(m_pentCurBombTarget);
-
if (pBombTarget)
{
pBombTarget->Use(CBaseEntity::Instance(pev->owner), this, USE_TOGGLE, 0);
}
}
- CBasePlayer *pBombOwner = dynamic_cast(CBaseEntity::Instance(pev->owner));
- if (pBombOwner != NULL)
+ CBasePlayer *pBombOwner = CBasePlayer::Instance(pev->owner);
+ if (pBombOwner)
{
pBombOwner->pev->frags += 3.0f;
}
diff --git a/regamedll/dlls/multiplay_gamerules.cpp b/regamedll/dlls/multiplay_gamerules.cpp
index c6577316..8e243196 100644
--- a/regamedll/dlls/multiplay_gamerules.cpp
+++ b/regamedll/dlls/multiplay_gamerules.cpp
@@ -33,7 +33,7 @@ RewardAccount CHalfLifeMultiplay::m_rgRewardAccountRules[] = {
REWARD_LOSER_BONUS_MAX, // RR_LOSER_BONUS_MAX
REWARD_LOSER_BONUS_ADD, // RR_LOSER_BONUS_ADD
REWARD_RESCUED_HOSTAGE, // RR_RESCUED_HOSTAGE
- REWARD_TOOK_HOSTAGE_ACC, // RR_TOOK_HOSTAGE_ACC
+ REWARD_TOOK_HOSTAGE_ACC, // RR_TOOK_HOSTAGE_ACC
REWARD_TOOK_HOSTAGE, // RR_TOOK_HOSTAGE
};
@@ -3807,11 +3807,11 @@ void CHalfLifeMultiplay::__API_VHOOK(DeathNotice)(CBasePlayer *pVictim, entvars_
if (pevInflictor == pKiller)
{
// If the inflictor is the killer, then it must be their current weapon doing the damage
- CBasePlayer *pPlayer = dynamic_cast(CBaseEntity::Instance(pKiller));
-
- if (pPlayer != NULL && pPlayer->m_pActiveItem != NULL)
+ CBasePlayer *pAttacker = CBasePlayer::Instance(pKiller);
+ if (pAttacker && pAttacker->IsPlayer())
{
- killer_weapon_name = pPlayer->m_pActiveItem->pszName();
+ if (pAttacker->m_pActiveItem)
+ killer_weapon_name = pAttacker->m_pActiveItem->pszName();
}
}
else
@@ -3825,29 +3825,30 @@ void CHalfLifeMultiplay::__API_VHOOK(DeathNotice)(CBasePlayer *pVictim, entvars_
#ifdef REGAMEDLL_FIXES
if (pevInflictor)
#endif
+ {
killer_weapon_name = STRING(pevInflictor->classname);
+ }
// strip the monster_* or weapon_* from the inflictor's classname
- if (!Q_strncmp(killer_weapon_name, "weapon_", 7))
- killer_weapon_name += 7;
+ const char cut_weapon[] = "weapon_";
+ const char cut_monster[] = "monster_";
+ const char cut_func[] = "func_";
- else if (!Q_strncmp(killer_weapon_name, "monster_", 8))
- killer_weapon_name += 8;
+ if (!Q_strncmp(killer_weapon_name, cut_weapon, sizeof(cut_weapon) - 1))
+ killer_weapon_name += sizeof(cut_weapon) - 1;
- else if (!Q_strncmp(killer_weapon_name, "func_", 5))
- killer_weapon_name += 5;
+ else if (!Q_strncmp(killer_weapon_name, cut_monster, sizeof(cut_monster) - 1))
+ killer_weapon_name += sizeof(cut_monster) - 1;
- int iGotHeadshot = 0;
+ else if (!Q_strncmp(killer_weapon_name, cut_func, sizeof(cut_func) - 1))
+ killer_weapon_name += sizeof(cut_func) - 1;
- if (pVictim->m_bHeadshotKilled)
- iGotHeadshot = 1;
-
- if (TheTutor == NULL)
+ if (TheTutor == nullptr)
{
MESSAGE_BEGIN(MSG_ALL, gmsgDeathMsg);
WRITE_BYTE(killer_index); // the killer
WRITE_BYTE(ENTINDEX(pVictim->edict())); // the victim
- WRITE_BYTE(iGotHeadshot); // is killed headshot
+ WRITE_BYTE(pVictim->m_bHeadshotKilled); // is killed headshot
WRITE_STRING(killer_weapon_name); // what they were killed by (should this be a string?)
MESSAGE_END();
}
@@ -3872,10 +3873,10 @@ void CHalfLifeMultiplay::__API_VHOOK(DeathNotice)(CBasePlayer *pVictim, entvars_
}
else if (pKiller->flags & FL_CLIENT)
{
- CBasePlayer *pPlayer = dynamic_cast(CBaseEntity::Instance(pKiller));
+ CBasePlayer *pAttacker = CBasePlayer::Instance(pKiller);
const char *VictimTeam = GetTeam(pVictim->m_iTeam);
- const char *KillerTeam = (pPlayer != NULL) ? GetTeam(pPlayer->m_iTeam) : "";
+ const char *KillerTeam = (pAttacker && pAttacker->IsPlayer()) ? GetTeam(pAttacker->m_iTeam) : "";
UTIL_LogPrintf("\"%s<%i><%s><%s>\" killed \"%s<%i><%s><%s>\" with \"%s\"\n", STRING(pKiller->netname), GETPLAYERUSERID(ENT(pKiller)), GETPLAYERAUTHID(ENT(pKiller)),
KillerTeam, STRING(pVictim->pev->netname), GETPLAYERUSERID(pVictim->edict()), GETPLAYERAUTHID(pVictim->edict()), VictimTeam, killer_weapon_name);
@@ -3900,7 +3901,7 @@ void CHalfLifeMultiplay::__API_VHOOK(DeathNotice)(CBasePlayer *pVictim, entvars_
else
WRITE_SHORT(ENTINDEX(ENT(pKiller))); // index number of secondary entity
- if (iGotHeadshot)
+ if (pVictim->m_bHeadshotKilled)
WRITE_LONG(9 | DRC_FLAG_DRAMATIC | DRC_FLAG_SLOWMOTION);
else
WRITE_LONG(7 | DRC_FLAG_DRAMATIC); // eventflags (priority and flags)
diff --git a/regamedll/dlls/player.cpp b/regamedll/dlls/player.cpp
index 491982c0..32c02bf4 100644
--- a/regamedll/dlls/player.cpp
+++ b/regamedll/dlls/player.cpp
@@ -508,8 +508,7 @@ CBasePlayer *CBasePlayer::GetNextRadioRecipient(CBasePlayer *pStartPlayer)
if (!FNullEnt(m_hObserverTarget))
continue;
- CBasePlayer *pTarget = (CBasePlayer *)CBaseEntity::Instance(pPlayer->m_hObserverTarget->pev);
-
+ CBasePlayer *pTarget = CBasePlayer::Instance(pPlayer->m_hObserverTarget->pev);
if (pTarget != NULL && pTarget->m_iTeam == m_iTeam)
{
bSend = true;
@@ -759,9 +758,8 @@ void CBasePlayer::__API_VHOOK(TraceAttack)(entvars_t *pevAttacker, float flDamag
bool bShouldSpark = false;
bool bHitShield = IsHittingShield(vecDir, ptr);
- CBasePlayer *pAttacker = dynamic_cast(CBaseEntity::Instance(pevAttacker));
-
- if (pAttacker != NULL && m_iTeam == pAttacker->m_iTeam && CVAR_GET_FLOAT("mp_friendlyfire") == 0)
+ CBasePlayer *pAttacker = CBasePlayer::Instance(pevAttacker);
+ if (pAttacker && pAttacker->IsPlayer() && m_iTeam == pAttacker->m_iTeam && CVAR_GET_FLOAT("mp_friendlyfire") == 0)
bShouldBleed = false;
if (pev->takedamage == DAMAGE_NO)
@@ -904,36 +902,52 @@ void CBasePlayer::__API_VHOOK(TraceAttack)(entvars_t *pevAttacker, float flDamag
const char *GetWeaponName(entvars_t *pevInflictor, entvars_t *pKiller)
{
+ // by default, the player is killed by the world
const char *killer_weapon_name = "world";
+ // Is the killer a client?
if (pKiller->flags & FL_CLIENT)
{
if (pevInflictor)
{
if (pevInflictor == pKiller)
{
- CBasePlayer *pAttacker = dynamic_cast(CBaseEntity::Instance(pKiller));
- if (pAttacker != NULL)
+ // If the inflictor is the killer, then it must be their current weapon doing the damage
+ CBasePlayer *pAttacker = CBasePlayer::Instance(pKiller);
+ if (pAttacker && pAttacker->IsPlayer())
{
- if (pAttacker->m_pActiveItem != NULL)
+ if (pAttacker->m_pActiveItem)
killer_weapon_name = pAttacker->m_pActiveItem->pszName();
}
}
else
+ {
+ // it's just that easy
killer_weapon_name = STRING(pevInflictor->classname);
+ }
}
}
else
+#ifdef REGAMEDLL_FIXES
+ if (pevInflictor)
+#endif
+ {
killer_weapon_name = STRING(pevInflictor->classname);
+ }
- if (!Q_strncmp(killer_weapon_name, "weapon_", 7))
- killer_weapon_name += 7;
+ // strip the monster_* or weapon_* from the inflictor's classname
+ const char cut_weapon[] = "weapon_";
+ const char cut_monster[] = "monster_";
+ const char cut_func[] = "func_";
- else if (!Q_strncmp(killer_weapon_name, "monster_", 8))
- killer_weapon_name += 8;
+ if (!Q_strncmp(killer_weapon_name, cut_weapon, sizeof(cut_weapon) - 1))
+ killer_weapon_name += sizeof(cut_weapon) - 1;
- else if (Q_strncmp(killer_weapon_name, "func_", 5) != 0)
- killer_weapon_name += 5;
+ else if (!Q_strncmp(killer_weapon_name, cut_monster, sizeof(cut_monster) - 1))
+ killer_weapon_name += sizeof(cut_monster) - 1;
+
+ else if (!Q_strncmp(killer_weapon_name, cut_func, sizeof(cut_func) - 1))
+ killer_weapon_name += sizeof(cut_func) - 1;
return killer_weapon_name;
}
@@ -972,8 +986,8 @@ int CBasePlayer::__API_VHOOK(TakeDamage)(entvars_t *pevInflictor, entvars_t *pev
float flShieldRatio = 0;
BOOL bTeamAttack = FALSE;
int armorHit = 0;
- CBasePlayer *pAttack = NULL;
- CBaseEntity *pAttacker = NULL;
+ CBasePlayer *pAttack = nullptr;
+ CBaseEntity *pAttacker = nullptr;
if (bitsDamageType & (DMG_EXPLOSION | DMG_BLAST | DMG_FALL))
m_LastHitGroup = HITGROUP_GENERIC;
@@ -1005,7 +1019,7 @@ int CBasePlayer::__API_VHOOK(TakeDamage)(entvars_t *pevInflictor, entvars_t *pev
if (!CSGameRules()->IsFriendlyFireAttack() && pGrenade->m_iTeam == m_iTeam)
bTeamAttack = TRUE;
- pAttack = dynamic_cast(CBasePlayer::Instance(pevAttacker));
+ pAttack = CBasePlayer::Instance(pevAttacker);
}
else if (pGrenade->m_iTeam == m_iTeam && (&edict()->v != pevAttacker))
{
@@ -1415,11 +1429,11 @@ void packPlayerItem(CBasePlayer *pPlayer, CBasePlayerItem *pItem, bool packAmmo)
#ifdef REGAMEDLL_ADD
void packPlayerNade(CBasePlayer *pPlayer, CBasePlayerItem *pItem, bool packAmmo)
{
- if (pItem == NULL)
+ if (!pItem)
return;
const char *modelName = GetCSModelName(pItem->m_iId);
- if (modelName != NULL)
+ if (modelName)
{
float flOffset = 0.0f;
switch (pItem->m_iId)
@@ -1435,6 +1449,15 @@ void packPlayerNade(CBasePlayer *pPlayer, CBasePlayerItem *pItem, bool packAmmo)
break;
}
+ if (pItem->m_flStartThrow != 0.0f)
+ {
+ auto& ammoNades = pPlayer->m_rgAmmo[ pItem->PrimaryAmmoIndex() ];
+ if (ammoNades < 2)
+ return;
+
+ ammoNades--;
+ }
+
Vector vecAngles = pPlayer->pev->angles;
Vector dir(Q_cos(vecAngles.y) * flOffset, Q_sin(vecAngles.y) * flOffset, 0.0f);
@@ -1515,7 +1538,7 @@ void CBasePlayer::PackDeadPlayerItems()
switch ((int)nadedrops.value)
{
case 1:
- packPlayerItem(this, pPlayerItem, true);
+ packPlayerNade(this, pPlayerItem, true);
break;
case 2:
{
@@ -1962,14 +1985,12 @@ void CBasePlayer::__API_VHOOK(Killed)(entvars_t *pevAttacker, int iGib)
if (!m_bKilledByBomb)
{
- CBasePlayer *pAttacker = (CBasePlayer *)CBaseEntity::Instance(pevAttacker);
+ CBasePlayer *pAttacker = CBasePlayer::Instance(pevAttacker);
if (pAttacker->HasShield())
killerHasShield = true;
- CCSBot *pBot = static_cast(this);
-
- if (pBot->IsBot() && pBot->IsBlind())
+ if (IsBot() && IsBlind())
{
wasBlind = true;
}
@@ -1982,7 +2003,6 @@ void CBasePlayer::__API_VHOOK(Killed)(entvars_t *pevAttacker, int iGib)
continue;
bool killedByHumanPlayer = (!pPlayer->IsBot() && pPlayer->pev == pevAttacker && pPlayer->m_iTeam != m_iTeam);
-
if (killedByHumanPlayer)
{
if (TheCareerTasks != NULL)
@@ -2038,7 +2058,7 @@ void CBasePlayer::__API_VHOOK(Killed)(entvars_t *pevAttacker, int iGib)
#endif
SetAnimation(PLAYER_DIE);
- if (m_pActiveItem != NULL && m_pActiveItem->m_pPlayer != NULL)
+ if (m_pActiveItem && m_pActiveItem->m_pPlayer)
{
switch (m_pActiveItem->m_iId)
{
@@ -8030,13 +8050,13 @@ void CBasePlayer::ResetStamina()
float_precision GetPlayerPitch(const edict_t *pEdict)
{
- if( !pEdict )
+ if (!pEdict)
return 0.0f;
-
- entvars_t *pev = VARS(const_cast(pEdict));
- CBasePlayer *pPlayer = dynamic_cast(CBasePlayer::Instance(pev));
- if (!pPlayer)
+ entvars_t *pev = VARS(const_cast(pEdict));
+ CBasePlayer *pPlayer = CBasePlayer::Instance(pev);
+
+ if (!pPlayer || !pPlayer->IsPlayer())
return 0.0f;
return pPlayer->m_flPitch;
@@ -8044,13 +8064,13 @@ float_precision GetPlayerPitch(const edict_t *pEdict)
float_precision GetPlayerYaw(const edict_t *pEdict)
{
- if( !pEdict )
+ if (!pEdict)
return 0.0f;
-
- entvars_t *pev = VARS(const_cast(pEdict));
- CBasePlayer *pPlayer = dynamic_cast(CBasePlayer::Instance(pev));
- if (!pPlayer)
+ entvars_t *pev = VARS(const_cast(pEdict));
+ CBasePlayer *pPlayer = CBasePlayer::Instance(pev);
+
+ if (!pPlayer || !pPlayer->IsPlayer())
return 0.0f;
return pPlayer->m_flYaw;
@@ -8058,10 +8078,13 @@ float_precision GetPlayerYaw(const edict_t *pEdict)
int GetPlayerGaitsequence(const edict_t *pEdict)
{
- entvars_t *pev = VARS(const_cast(pEdict));
- CBasePlayer *pPlayer = dynamic_cast(CBasePlayer::Instance(pev));
+ if (!pEdict)
+ return 1;
- if (!pPlayer)
+ entvars_t *pev = VARS(const_cast(pEdict));
+ CBasePlayer *pPlayer = CBasePlayer::Instance(pev);
+
+ if (!pPlayer || !pPlayer->IsPlayer())
return 1;
return pPlayer->m_iGaitsequence;
diff --git a/regamedll/dlls/player.h b/regamedll/dlls/player.h
index 21e7d937..8c1db1a2 100644
--- a/regamedll/dlls/player.h
+++ b/regamedll/dlls/player.h
@@ -420,6 +420,10 @@ public:
#endif
public:
+ static CBasePlayer *Instance(edict_t *pent) { return (CBasePlayer *)GET_PRIVATE(pent ? pent : ENT(0)); }
+ static CBasePlayer *Instance(entvars_t *pev) { return Instance(ENT(pev)); }
+ static CBasePlayer *Instance(int offset) { return Instance(ENT(offset)); }
+
void SpawnClientSideCorpse();
void Observer_FindNextPlayer(bool bReverse, const char *name = NULL);
CBasePlayer *Observer_IsValidTarget(int iPlayerIndex, bool bSameTeam);
diff --git a/regamedll/dlls/training_gamerules.h b/regamedll/dlls/training_gamerules.h
index 23d08f12..3f41013d 100644
--- a/regamedll/dlls/training_gamerules.h
+++ b/regamedll/dlls/training_gamerules.h
@@ -36,6 +36,8 @@ class CHalfLifeTraining: public CHalfLifeMultiplay
{
public:
CHalfLifeTraining();
+ virtual ~CHalfLifeTraining() {};
+
virtual BOOL IsMultiplayer() { return FALSE; }
virtual BOOL IsDeathmatch();
virtual void InitHUD(CBasePlayer *pl);
diff --git a/regamedll/dlls/util.cpp b/regamedll/dlls/util.cpp
index a6085e47..13caeac0 100644
--- a/regamedll/dlls/util.cpp
+++ b/regamedll/dlls/util.cpp
@@ -212,7 +212,7 @@ void UTIL_UnsetGroupTrace()
g_groupmask = 0;
g_groupop = 0;
- ENGINE_SETGROUPMASK(0,0);
+ ENGINE_SETGROUPMASK(0, 0);
}
NOXREF UTIL_GroupTrace::UTIL_GroupTrace(int groupmask, int op)
@@ -524,12 +524,12 @@ CBaseEntity *UTIL_FindEntityGeneric(const char *szWhatever, const Vector &vecSrc
CBasePlayer *EXT_FUNC UTIL_PlayerByIndex(int playerIndex)
{
- CBasePlayer *pPlayer = NULL;
+ CBasePlayer *pPlayer = nullptr;
if (playerIndex > 0 && playerIndex <= gpGlobals->maxClients)
{
edict_t *pPlayerEdict = INDEXENT(playerIndex);
- if (pPlayerEdict != NULL && !pPlayerEdict->free)
- pPlayer = (CBasePlayer *)CBaseEntity::Instance(pPlayerEdict);
+ if (pPlayerEdict && !pPlayerEdict->free)
+ pPlayer = CBasePlayer::Instance(pPlayerEdict);
}
return pPlayer;
diff --git a/regamedll/extra/cssdk/dlls/gamerules.h b/regamedll/extra/cssdk/dlls/gamerules.h
index a7d0d331..9e868d18 100644
--- a/regamedll/extra/cssdk/dlls/gamerules.h
+++ b/regamedll/extra/cssdk/dlls/gamerules.h
@@ -209,6 +209,8 @@ enum
class CItem;
class CGameRules {
+protected:
+ virtual ~CGameRules() {};
public:
virtual void RefreshSkillData() = 0;
virtual void Think() = 0;
@@ -280,9 +282,14 @@ public:
public:
BOOL m_bFreezePeriod;
BOOL m_bBombDropped;
+
+ // custom
+ char *m_GameDesc;
};
class CHalfLifeRules: public CGameRules {
+protected:
+ virtual ~CHalfLifeRules() {};
public:
virtual void Think() = 0;
virtual BOOL IsAllowedToSpawn(CBaseEntity *pEntity) = 0;
@@ -328,6 +335,8 @@ public:
};
class CHalfLifeMultiplay: public CGameRules {
+protected:
+ virtual ~CHalfLifeMultiplay() {};
public:
virtual void RefreshSkillData() = 0;
virtual void Think() = 0;
@@ -407,6 +416,7 @@ public:
virtual void UpdateTeamScores() = 0;
virtual void EndRoundMessage(const char *sentence, int event) = 0;
virtual void SetAccountRules(RewardRules rules, int amount) = 0;
+ virtual RewardAccount GetAccountRules(RewardRules rules) const = 0;
// BOMB MAP FUNCTIONS
virtual BOOL IsThereABomber() = 0;
diff --git a/regamedll/extra/cssdk/dlls/player.h b/regamedll/extra/cssdk/dlls/player.h
index 33984f5c..4e0dc249 100644
--- a/regamedll/extra/cssdk/dlls/player.h
+++ b/regamedll/extra/cssdk/dlls/player.h
@@ -342,6 +342,10 @@ public:
virtual void Blind(float flUntilTime, float flHoldTime, float flFadeTime, int iAlpha) = 0;
virtual void OnTouchingWeapon(CWeaponBox *pWeapon) = 0;
public:
+ static CBasePlayer *Instance(edict_t *pent) { return (CBasePlayer *)GET_PRIVATE(pent ? pent : ENT(0)); }
+ static CBasePlayer *Instance(entvars_t *pev) { return Instance(ENT(pev)); }
+ static CBasePlayer *Instance(int offset) { return Instance(ENT(offset)); }
+
int IsObserver() { return pev->iuser1; }
void SetWeaponAnimType(const char *szExtention) { strcpy(m_szAnimExtention, szExtention); }
bool IsProtectedByShield() { return m_bOwnsShield && m_bShieldDrawn; }
diff --git a/regamedll/extra/cssdk/dlls/regamedll_api.h b/regamedll/extra/cssdk/dlls/regamedll_api.h
index 7286b769..97484399 100644
--- a/regamedll/extra/cssdk/dlls/regamedll_api.h
+++ b/regamedll/extra/cssdk/dlls/regamedll_api.h
@@ -210,8 +210,8 @@ typedef IVoidHookChain IReGameHook_
typedef IVoidHookChainRegistry IReGameHookRegistry_ShowMenu;
// ShowVGUIMenu hook
-typedef IVoidHookChain IReGameHook_ShowVGUIMenu;
-typedef IVoidHookChainRegistry IReGameHookRegistry_ShowVGUIMenu;
+typedef IVoidHookChain IReGameHook_ShowVGUIMenu;
+typedef IVoidHookChainRegistry IReGameHookRegistry_ShowVGUIMenu;
// CHalfLifeMultiplay::FShouldSwitchWeapon hook
typedef IHookChain IReGameHook_CSGameRules_FShouldSwitchWeapon;
diff --git a/regamedll/extra/cssdk/dlls/training_gamerules.h b/regamedll/extra/cssdk/dlls/training_gamerules.h
index df5cbac2..079e2be1 100644
--- a/regamedll/extra/cssdk/dlls/training_gamerules.h
+++ b/regamedll/extra/cssdk/dlls/training_gamerules.h
@@ -28,6 +28,8 @@
#pragma once
class CHalfLifeTraining: public CHalfLifeMultiplay {
+protected:
+ virtual ~CHalfLifeTraining() {};
public:
virtual BOOL IsMultiplayer() = 0;
virtual BOOL IsDeathmatch() = 0;
diff --git a/regamedll/game_shared/bot/bot.cpp b/regamedll/game_shared/bot/bot.cpp
index 52573055..33861347 100644
--- a/regamedll/game_shared/bot/bot.cpp
+++ b/regamedll/game_shared/bot/bot.cpp
@@ -346,7 +346,7 @@ bool CBot::IsEnemy(CBaseEntity *ent) const
CBasePlayer *player = static_cast(ent);
// if they are on our team, they are our friends
- if (player->m_iTeam == m_iTeam)
+ if (BotRelationship(player) == BOT_TEAMMATE)
return false;
// yep, we hate 'em
diff --git a/regamedll/game_shared/bot/bot.h b/regamedll/game_shared/bot/bot.h
index 9bd590bb..44f488de 100644
--- a/regamedll/game_shared/bot/bot.h
+++ b/regamedll/game_shared/bot/bot.h
@@ -84,10 +84,13 @@ public:
CBasePlayer::Killed(pevAttacker, iGib);
}
virtual void Think() {};
- virtual BOOL IsBot() { return true; }
+ virtual BOOL IsBot() { return TRUE; }
virtual Vector GetAutoaimVector(float flDelta);
+
// invoked when in contact with a CWeaponBox
virtual void OnTouchingWeapon(CWeaponBox *box) {}
+
+ // prepare bot for action
virtual bool Initialize(const BotProfile *profile);
virtual void SpawnBot() = 0;
@@ -179,6 +182,7 @@ public:
#endif
public:
+ // return bot's unique ID
unsigned int GetID() const { return m_id; }
bool IsRunning() const { return m_isRunning; }
bool IsCrouching() const { return m_isCrouching; }
@@ -239,6 +243,13 @@ public:
// return our personality profile
const BotProfile *GetProfile() const { return m_profile; }
+ enum BotRelationshipTeam: uint8
+ {
+ BOT_TEAMMATE = 0,
+ BOT_ENEMY
+ };
+ BotRelationshipTeam BotRelationship(CBasePlayer *pTarget) const;
+
#ifndef HOOK_GAMEDLL
protected:
#endif
@@ -408,6 +419,16 @@ inline bool CBot::__MAKE_VHOOK(IsPlayerLookingAtMe)(CBasePlayer *other) const
return false;
}
+inline CBot::BotRelationshipTeam CBot::BotRelationship(CBasePlayer *pTarget) const
+{
+#ifdef REGAMEDLL_ADD
+ if (cv_bot_deathmatch.value > 1.0f)
+ return BOT_ENEMY;
+#endif
+
+ return pTarget->m_iTeam == m_iTeam ? BOT_TEAMMATE : BOT_ENEMY;
+}
+
extern float g_flBotCommandInterval;
extern float g_flBotFullThinkInterval;
diff --git a/regamedll/game_shared/bot/bot_util.h b/regamedll/game_shared/bot/bot_util.h
index 9072f25d..12c2b3c2 100644
--- a/regamedll/game_shared/bot/bot_util.h
+++ b/regamedll/game_shared/bot/bot_util.h
@@ -208,6 +208,10 @@ extern cvar_t cv_bot_defer_to_human;
extern cvar_t cv_bot_chatter;
extern cvar_t cv_bot_profile_db;
+#ifdef REGAMEDLL_ADD
+extern cvar_t cv_bot_deathmatch;
+#endif
+
#define IS_ALIVE true
int UTIL_HumansOnTeam(int teamID, bool isAlive = false);
diff --git a/regamedll/hookers/6153_hooker.cpp b/regamedll/hookers/6153_hooker.cpp
index 8980fd74..206f2eef 100644
--- a/regamedll/hookers/6153_hooker.cpp
+++ b/regamedll/hookers/6153_hooker.cpp
@@ -267,7 +267,7 @@ FunctionHook g_FunctionHooks[] =
{ 0x01D63E50, "_Z7respawnP9entvars_si", (size_t)&respawn },
{ 0x01D63F60, "_Z10ClientKillP7edict_s", (size_t)&ClientKill },
{ 0x01D64010, "_Z8ShowMenuP11CBasePlayeriiiPc_constprop_32", (size_t)&ShowMenu },
- { 0x01D64070, "_Z12ShowVGUIMenuP11CBasePlayeriiPc", (size_t)&ShowVGUIMenu },
+ //{ 0x01D64070, "_Z12ShowVGUIMenuP11CBasePlayeriiPc", (size_t)&ShowVGUIMenu },
{ 0x01D64130, "CountTeams", (size_t)&CountTeams }, //extern c func
{ 0x01D64260, "_Z11ListPlayersP11CBasePlayer", (size_t)&ListPlayers },
{ 0x01D64460, "CountTeamPlayers", (size_t)&CountTeamPlayers }, //extern c func
diff --git a/regamedll/public/regamedll/regamedll_api.h b/regamedll/public/regamedll/regamedll_api.h
index 3f2a2f07..319bb111 100644
--- a/regamedll/public/regamedll/regamedll_api.h
+++ b/regamedll/public/regamedll/regamedll_api.h
@@ -210,8 +210,8 @@ typedef IVoidHookChain IReGameHook_
typedef IVoidHookChainRegistry IReGameHookRegistry_ShowMenu;
// ShowVGUIMenu hook
-typedef IVoidHookChain IReGameHook_ShowVGUIMenu;
-typedef IVoidHookChainRegistry IReGameHookRegistry_ShowVGUIMenu;
+typedef IVoidHookChain IReGameHook_ShowVGUIMenu;
+typedef IVoidHookChainRegistry IReGameHookRegistry_ShowVGUIMenu;
// CHalfLifeMultiplay::FShouldSwitchWeapon hook
typedef IHookChain IReGameHook_CSGameRules_FShouldSwitchWeapon;
diff --git a/regamedll/regamedll/regamedll_api_impl.h b/regamedll/regamedll/regamedll_api_impl.h
index 3b6ddd2a..99be5403 100644
--- a/regamedll/regamedll/regamedll_api_impl.h
+++ b/regamedll/regamedll/regamedll_api_impl.h
@@ -205,8 +205,8 @@ typedef IVoidHookChainImpl CReGameHook_Sh
typedef IVoidHookChainRegistryImpl CReGameHookRegistry_ShowMenu;
// ShowVGUIMenu hook
-typedef IVoidHookChainImpl CReGameHook_ShowVGUIMenu;
-typedef IVoidHookChainRegistryImpl CReGameHookRegistry_ShowVGUIMenu;
+typedef IVoidHookChainImpl CReGameHook_ShowVGUIMenu;
+typedef IVoidHookChainRegistryImpl CReGameHookRegistry_ShowVGUIMenu;
// CHalfLifeMultiplay::FShouldSwitchWeapon hook
typedef IHookChainClassImpl CReGameHook_CSGameRules_FShouldSwitchWeapon;
diff --git a/regamedll/unittests/struct_offsets_tests.cpp b/regamedll/unittests/struct_offsets_tests.cpp
index 5f7ab30a..220e1dd2 100644
--- a/regamedll/unittests/struct_offsets_tests.cpp
+++ b/regamedll/unittests/struct_offsets_tests.cpp
@@ -85,7 +85,7 @@ TEST(StructOffsets, ReversingChecks, 5000)
CHECK_CLASS_SIZE(BotPhraseManager, 0x21Cu, 0x214u);
CHECK_CLASS_SIZE(BotPhrase, 0x50, 0x44);
- CHECK_CLASS_SIZE(CHalfLifeMultiplay, 0x2D0u, 0x2C4u);
+ //CHECK_CLASS_SIZE(CHalfLifeMultiplay, 0x2D0u, 0x2C4u);
CHECK_CLASS_SIZE(CHalfLifeTraining, 0x2E8u, 0x2D8u);
CHECK_CLASS_SIZE(CGib, 0x98, 0xA8);
CHECK_CLASS_SIZE(CSprayCan, 0x88, 0x98);
diff --git a/shared_icc.gradle b/shared_icc.gradle
index 9bd0282c..32349316 100644
--- a/shared_icc.gradle
+++ b/shared_icc.gradle
@@ -9,7 +9,7 @@ rootProject.ext.createIccConfig = { boolean release, BinaryKind binKind ->
compilerOptions: new GccToolchainConfig.CompilerOptions(
optimizationLevel: OptimizationLevel.LEVEL_3,
stackProtector: false,
- interProceduralOptimizations: false, // -ipo
+ interProceduralOptimizations: true, // -ipo
noBuiltIn: true,
@@ -19,7 +19,7 @@ rootProject.ext.createIccConfig = { boolean release, BinaryKind binKind ->
positionIndependentCode: false
),
linkerOptions: new GccToolchainConfig.LinkerOptions(
- interProceduralOptimizations: false, // -ipo
+ interProceduralOptimizations: true, // -ipo
stripSymbolTable: true,
staticLibGcc: true,
staticIntel: true,