From ec55436344ee30138f5d1d4390e020859944676e Mon Sep 17 00:00:00 2001 From: StevenKal Date: Wed, 27 Oct 2021 12:44:53 +0200 Subject: [PATCH 001/100] Update item_airbox.cpp --- regamedll/dlls/addons/item_airbox.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/regamedll/dlls/addons/item_airbox.cpp b/regamedll/dlls/addons/item_airbox.cpp index a3637ea99..d53961d6e 100644 --- a/regamedll/dlls/addons/item_airbox.cpp +++ b/regamedll/dlls/addons/item_airbox.cpp @@ -63,6 +63,11 @@ void CItemAirBox::Touch(CBaseEntity *pOther) pev->nextthink = 0; SetThink(nullptr); + + if(m_flyup < 0) + { + m_flyup = -m_flyup; + } } } @@ -70,6 +75,7 @@ void CItemAirBox::Restart() { CArmoury::Restart(); UTIL_SetOrigin(pev, pev->oldorigin); + pev->velocity.z = 0; if (m_flyup > 0 && m_delay > 0.01f) { From 5991f003ae0b27de45c034edb6ff2112ee1b59c6 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Wed, 27 Oct 2021 12:45:39 +0200 Subject: [PATCH 002/100] Update wpn_c4.cpp --- regamedll/dlls/wpn_shared/wpn_c4.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/regamedll/dlls/wpn_shared/wpn_c4.cpp b/regamedll/dlls/wpn_shared/wpn_c4.cpp index 63736adef..293ab024d 100644 --- a/regamedll/dlls/wpn_shared/wpn_c4.cpp +++ b/regamedll/dlls/wpn_shared/wpn_c4.cpp @@ -101,6 +101,10 @@ void CC4::Holster(int skiplocal) m_pPlayer->pev->gamestate = HITGROUP_SHIELD_ENABLED; m_bHasShield = false; } + +#ifdef REGAMEDLL_FIXES + CBasePlayerWeapon::Holster(); +#endif } void CC4::PrimaryAttack() From 44ee1f39b30cbfb1e3c3f4b0b7299a417354c793 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Wed, 27 Oct 2021 12:46:08 +0200 Subject: [PATCH 003/100] Update wpn_flashbang.cpp --- regamedll/dlls/wpn_shared/wpn_flashbang.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/regamedll/dlls/wpn_shared/wpn_flashbang.cpp b/regamedll/dlls/wpn_shared/wpn_flashbang.cpp index c5462e49b..a60a498c4 100644 --- a/regamedll/dlls/wpn_shared/wpn_flashbang.cpp +++ b/regamedll/dlls/wpn_shared/wpn_flashbang.cpp @@ -83,6 +83,10 @@ void CFlashbang::Holster(int skiplocal) m_flStartThrow = 0; m_flReleaseThrow = -1.0f; + +#ifdef REGAMEDLL_FIXES + CBasePlayerWeapon::Holster(); +#endif } void CFlashbang::PrimaryAttack() From d47071b37d478ff1399e3b8abac4c3780939efdc Mon Sep 17 00:00:00 2001 From: StevenKal Date: Wed, 27 Oct 2021 12:47:00 +0200 Subject: [PATCH 004/100] Update wpn_hegrenade.cpp --- regamedll/dlls/wpn_shared/wpn_hegrenade.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/regamedll/dlls/wpn_shared/wpn_hegrenade.cpp b/regamedll/dlls/wpn_shared/wpn_hegrenade.cpp index 3f17e7254..d93470eb6 100644 --- a/regamedll/dlls/wpn_shared/wpn_hegrenade.cpp +++ b/regamedll/dlls/wpn_shared/wpn_hegrenade.cpp @@ -87,6 +87,10 @@ void CHEGrenade::Holster(int skiplocal) m_flStartThrow = 0; m_flReleaseThrow = -1.0f; + +#ifdef REGAMEDLL_FIXES + CBasePlayerWeapon::Holster(); +#endif } void CHEGrenade::PrimaryAttack() From 52b32ffb6a6abfb2c5b55f1b0137676dd0522e38 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Wed, 27 Oct 2021 12:47:33 +0200 Subject: [PATCH 005/100] Update wpn_knife.cpp --- regamedll/dlls/wpn_shared/wpn_knife.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/regamedll/dlls/wpn_shared/wpn_knife.cpp b/regamedll/dlls/wpn_shared/wpn_knife.cpp index 18275c047..57054857e 100644 --- a/regamedll/dlls/wpn_shared/wpn_knife.cpp +++ b/regamedll/dlls/wpn_shared/wpn_knife.cpp @@ -80,9 +80,7 @@ BOOL CKnife::Deploy() m_pPlayer->m_bShieldDrawn = false; if (m_pPlayer->HasShield()) - { return DefaultDeploy("models/shield/v_shield_knife.mdl", "models/shield/p_shield_knife.mdl", KNIFE_SHIELD_DRAW, "shieldknife", UseDecrement() != FALSE); - } else return DefaultDeploy("models/v_knife.mdl", "models/p_knife.mdl", KNIFE_DRAW, "knife", UseDecrement() != FALSE); } @@ -90,6 +88,10 @@ BOOL CKnife::Deploy() void CKnife::Holster(int skiplocal) { m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 0.5f; + +#ifdef REGAMEDLL_FIXES + CBasePlayerWeapon::Holster(); +#endif } NOXREF void CKnife::WeaponAnimation(int iAnimation) From ee50cf63f2e250431d62d0203d5af8ef3bd396dd Mon Sep 17 00:00:00 2001 From: StevenKal Date: Wed, 27 Oct 2021 12:47:51 +0200 Subject: [PATCH 006/100] Update wpn_smokegrenade.cpp --- regamedll/dlls/wpn_shared/wpn_smokegrenade.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/regamedll/dlls/wpn_shared/wpn_smokegrenade.cpp b/regamedll/dlls/wpn_shared/wpn_smokegrenade.cpp index d63fe3a69..b92d6e81d 100644 --- a/regamedll/dlls/wpn_shared/wpn_smokegrenade.cpp +++ b/regamedll/dlls/wpn_shared/wpn_smokegrenade.cpp @@ -88,6 +88,10 @@ void CSmokeGrenade::Holster(int skiplocal) m_flStartThrow = 0; m_flReleaseThrow = -1; + +#ifdef REGAMEDLL_FIXES + CBasePlayerWeapon::Holster(); +#endif } void CSmokeGrenade::PrimaryAttack() From bd8c02b253753de7abf46aed6b97f6958ae656d2 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Wed, 27 Oct 2021 12:48:55 +0200 Subject: [PATCH 007/100] Update client.cpp --- regamedll/dlls/client.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/regamedll/dlls/client.cpp b/regamedll/dlls/client.cpp index 5ddf63adb..3d79df07c 100644 --- a/regamedll/dlls/client.cpp +++ b/regamedll/dlls/client.cpp @@ -753,7 +753,11 @@ void Host_Say(edict_t *pEntity, BOOL teamonly) { int j; char *p; +#ifdef REGAMEDLL_FIXES + char text[140]; +#else char text[128]; +#endif char szTemp[256]; const char *cpSay = "say"; const char *cpSayTeam = "say_team"; From be40000e201f92449c07edebcd2dd9a35148790e Mon Sep 17 00:00:00 2001 From: StevenKal Date: Wed, 27 Oct 2021 12:49:30 +0200 Subject: [PATCH 008/100] Update func_tank.cpp --- regamedll/dlls/func_tank.cpp | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/regamedll/dlls/func_tank.cpp b/regamedll/dlls/func_tank.cpp index 1ca0e966e..acb772d1b 100644 --- a/regamedll/dlls/func_tank.cpp +++ b/regamedll/dlls/func_tank.cpp @@ -208,8 +208,12 @@ BOOL CFuncTank::OnControls(entvars_t *pevTest) if (!(pev->spawnflags & SF_TANK_CANCONTROL)) return FALSE; +#ifdef REGAMEDLL_FIXES + if((pev->origin - pevTest->origin).Length() < (m_vecControllerUsePos.x + m_vecControllerUsePos.y)) +#else Vector offset = pevTest->origin - pev->origin; if ((m_vecControllerUsePos - pevTest->origin).Length() < 30.0f) +#endif { return TRUE; } @@ -254,7 +258,12 @@ BOOL CFuncTank::StartControl(CBasePlayer *pController) } m_pController->m_iHideHUD |= HIDEHUD_WEAPONS; +#ifdef REGAMEDLL_FIXES + m_vecControllerUsePos.x = (pev->origin - m_pController->pev->origin).Length(); + m_vecControllerUsePos.y = MAX_PLAYER_USE_TANK_RADIUS; +#else m_vecControllerUsePos = m_pController->pev->origin; +#endif pev->nextthink = pev->ltime + 0.1f; @@ -876,6 +885,25 @@ void CFuncTankControls::Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_T if (m_pTank) { m_pTank->Use(pActivator, pCaller, useType, value); + +#ifdef REGAMEDLL_FIXES + m_pTank->m_vecControllerUsePos.x = (m_pTank->pev->origin - pActivator->pev->origin).Length(); + + // Extended distance setting, up to "MAX_PLAYER_USE_TANK_RADIUS" units or more depending on how close we were in "PlayerUse", or if we did not used it. + if(pActivator && pActivator->IsPlayer() && (((CBasePlayer *)pActivator)->m_afButtonPressed & IN_USE)) + { + m_pTank->m_vecControllerUsePos.y = MAX_PLAYER_USE_RADIUS - (this->Center() - pActivator->pev->origin).Length(); + + if(m_pTank->m_vecControllerUsePos.y < 0) // Since radius function can get and higher range, so fix it to avoid "StartControl" followed by "StopControl" on a next think! + { + m_pTank->m_vecControllerUsePos.y = -m_pTank->m_vecControllerUsePos.y; + } + } + else + { + m_pTank->m_vecControllerUsePos.y = MAX_PLAYER_USE_TANK_RADIUS; + } +#endif } // if this fails, most likely means save/restore hasn't worked properly From 31262febdc463ba27e27d5db37e218c69b667a93 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Wed, 27 Oct 2021 12:50:17 +0200 Subject: [PATCH 009/100] Update func_tank.h --- regamedll/dlls/func_tank.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/regamedll/dlls/func_tank.h b/regamedll/dlls/func_tank.h index d30acdb7a..d93e6b330 100644 --- a/regamedll/dlls/func_tank.h +++ b/regamedll/dlls/func_tank.h @@ -105,6 +105,10 @@ class CFuncTank: public CBaseEntity static Vector m_TankSpread[]; protected: +#ifdef REGAMEDLL_FIXES + friend class CFuncTankControls; +#endif + CBasePlayer *m_pController; float m_flNextAttack; Vector m_vecControllerUsePos; From f4618ea37c70afa445d0c7b78377209e707487b3 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Wed, 27 Oct 2021 12:50:46 +0200 Subject: [PATCH 010/100] Update game.cpp --- regamedll/dlls/game.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/regamedll/dlls/game.cpp b/regamedll/dlls/game.cpp index de055fd75..0fa99b703 100644 --- a/regamedll/dlls/game.cpp +++ b/regamedll/dlls/game.cpp @@ -162,6 +162,9 @@ cvar_t allchat = { "sv_allchat", "0", 0, 0.0f, nullptr cvar_t sv_autobunnyhopping = { "sv_autobunnyhopping", "0", 0, 0.0f, nullptr }; cvar_t sv_enablebunnyhopping = { "sv_enablebunnyhopping", "0", 0, 0.0f, nullptr }; +// Note: Just for my plugins & cie. +cvar_t game_version_personnal = { "game_version_personnal", "1", FCVAR_SERVER, 0.0f, nullptr }; + void GameDLL_Version_f() { if (Q_stricmp(CMD_ARGV(1), "version") != 0) @@ -392,6 +395,8 @@ void EXT_FUNC GameDLLInit() CVAR_REGISTER(&sv_autobunnyhopping); CVAR_REGISTER(&sv_enablebunnyhopping); + CVAR_REGISTER(&game_version_personnal); + // print version CONSOLE_ECHO("ReGameDLL version: " APP_VERSION "\n"); From 5f9a4e1da72cc7e09bfc4d4a9d6ea2a1aaa53ec7 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Wed, 27 Oct 2021 12:51:09 +0200 Subject: [PATCH 011/100] Update game.h --- regamedll/dlls/game.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/regamedll/dlls/game.h b/regamedll/dlls/game.h index 2f362c050..f746c4dc8 100644 --- a/regamedll/dlls/game.h +++ b/regamedll/dlls/game.h @@ -188,6 +188,8 @@ extern cvar_t allchat; extern cvar_t sv_autobunnyhopping; extern cvar_t sv_enablebunnyhopping; +extern cvar_t game_version_personnal; + #endif extern cvar_t scoreboard_showmoney; From 0c74f58155d8d9a864081a2280a13c2b48d1da3d Mon Sep 17 00:00:00 2001 From: StevenKal Date: Wed, 27 Oct 2021 12:52:20 +0200 Subject: [PATCH 012/100] Update player.cpp --- regamedll/dlls/player.cpp | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/regamedll/dlls/player.cpp b/regamedll/dlls/player.cpp index 6b1adfa6a..a08a92321 100644 --- a/regamedll/dlls/player.cpp +++ b/regamedll/dlls/player.cpp @@ -569,7 +569,13 @@ Vector CBasePlayer::GetGunPosition() bool CBasePlayer::IsHittingShield(Vector &vecDirection, TraceResult *ptr) { +#ifdef REGAMEDLL_FIXES + if (!HasShield() + || pev->gamestate == HITGROUP_SHIELD_DISABLED + || (m_pActiveItem && m_pActiveItem->m_iId == WEAPON_C4)) +#else if ((m_pActiveItem && m_pActiveItem->m_iId == WEAPON_C4) || !HasShield()) +#endif return false; if (ptr->iHitgroup == HITGROUP_SHIELD) @@ -2431,7 +2437,11 @@ void EXT_FUNC CBasePlayer::__API_HOOK(SetAnimation)(PLAYER_ANIM playerAnim) if (!pev->modelindex) return; +#ifdef REGAMEDLL_FIXES + if ((playerAnim == PLAYER_FLINCH || playerAnim == PLAYER_LARGE_FLINCH) && HasShield() && pev->gamestate == HITGROUP_SHIELD_ENABLED) +#else if ((playerAnim == PLAYER_FLINCH || playerAnim == PLAYER_LARGE_FLINCH) && HasShield()) +#endif return; if (playerAnim != PLAYER_FLINCH && playerAnim != PLAYER_LARGE_FLINCH && m_flFlinchTime > gpGlobals->time && pev->health > 0.0f) @@ -5040,6 +5050,11 @@ void EXT_FUNC CBasePlayer::__API_HOOK(PostThink)() } } +#ifdef REGAMEDLL_FIXES + // Handle use events + PlayerUse(); + ImpulseCommands(); +#endif // do weapon stuff ItemPostFrame(); @@ -6296,8 +6311,10 @@ void EXT_FUNC CBasePlayer::__API_HOOK(ImpulseCommands)() { TraceResult tr; +#ifndef REGAMEDLL_FIXES // Handle use events PlayerUse(); +#endif int iImpulse = pev->impulse; @@ -6904,7 +6921,9 @@ void CBasePlayer::ItemPostFrame() #endif return; +#ifndef REGAMEDLL_FIXES ImpulseCommands(); +#endif if (m_pActiveItem) m_pActiveItem->ItemPostFrame(); @@ -6912,7 +6931,7 @@ void CBasePlayer::ItemPostFrame() int CBasePlayer::AmmoInventory(int iAmmoIndex) { - if (iAmmoIndex == -1) + if (iAmmoIndex <= -1) return -1; return m_rgAmmo[iAmmoIndex]; From fad8a242107ff91d0fd4923dc078c908da231a4f Mon Sep 17 00:00:00 2001 From: StevenKal Date: Wed, 27 Oct 2021 12:52:38 +0200 Subject: [PATCH 013/100] Update player.h --- regamedll/dlls/player.h | 1 + 1 file changed, 1 insertion(+) diff --git a/regamedll/dlls/player.h b/regamedll/dlls/player.h index e62c1b730..54c341fca 100644 --- a/regamedll/dlls/player.h +++ b/regamedll/dlls/player.h @@ -61,6 +61,7 @@ const float SUIT_FIRST_UPDATE_TIME = 0.1f; const float MAX_PLAYER_FATAL_FALL_SPEED = 1100.0f; const float MAX_PLAYER_SAFE_FALL_SPEED = 500.0f; const float MAX_PLAYER_USE_RADIUS = 64.0f; +const float MAX_PLAYER_USE_TANK_RADIUS = 30.0f; const float ARMOR_RATIO = 0.5f; // Armor Takes 50% of the damage const float ARMOR_BONUS = 0.5f; // Each Point of Armor is work 1/x points of health From b633bdf16218f598763a339749911c12ec719c46 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Wed, 27 Oct 2021 12:53:04 +0200 Subject: [PATCH 014/100] Update weapons.cpp --- regamedll/dlls/weapons.cpp | 41 +++++++++++++++++++++++++++++++++----- 1 file changed, 36 insertions(+), 5 deletions(-) diff --git a/regamedll/dlls/weapons.cpp b/regamedll/dlls/weapons.cpp index 22d61fc9f..205234a4c 100644 --- a/regamedll/dlls/weapons.cpp +++ b/regamedll/dlls/weapons.cpp @@ -1154,8 +1154,19 @@ void CBasePlayerItem::Kill() void CBasePlayerItem::Holster(int skiplocal) { - m_pPlayer->pev->viewmodel = 0; - m_pPlayer->pev->weaponmodel = 0; + if(m_pPlayer) + { + m_pPlayer->pev->viewmodel = 0; + m_pPlayer->pev->weaponmodel = 0; + +#ifdef REGAMEDLL_FIXES + if(m_pPlayer->HasShield()) + { + m_pPlayer->m_bShieldDrawn = false; + m_pPlayer->pev->gamestate = HITGROUP_SHIELD_DISABLED; + } +#endif + } } void CBasePlayerItem::AttachToPlayer(CBasePlayer *pPlayer) @@ -1371,7 +1382,7 @@ BOOL EXT_FUNC CBasePlayerWeapon::__API_HOOK(DefaultDeploy)(char *szViewModel, ch return FALSE; m_pPlayer->TabulateAmmo(); -#ifdef REGAMEDLL_API +#ifdef REGAMEDLL_FIXES m_pPlayer->pev->viewmodel = ALLOC_STRING(szViewModel); m_pPlayer->pev->weaponmodel = ALLOC_STRING(szWeaponModel); #else @@ -1392,6 +1403,13 @@ BOOL EXT_FUNC CBasePlayerWeapon::__API_HOOK(DefaultDeploy)(char *szViewModel, ch m_pPlayer->m_iLastZoom = DEFAULT_FOV; m_pPlayer->m_bResumeZoom = false; +#ifdef REGAMEDLL_FIXES + if(m_pPlayer->HasShield() && m_iId != WEAPON_C4) + { + m_pPlayer->pev->gamestate = HITGROUP_SHIELD_ENABLED; + } +#endif + return TRUE; } @@ -1550,8 +1568,21 @@ void CBasePlayerWeapon::Holster(int skiplocal) { // cancel any reload in progress. m_fInReload = FALSE; - m_pPlayer->pev->viewmodel = 0; - m_pPlayer->pev->weaponmodel = 0; + + if(m_pPlayer) + { + m_pPlayer->pev->viewmodel = 0; + m_pPlayer->pev->weaponmodel = 0; + +#ifdef REGAMEDLL_FIXES + if(m_pPlayer->HasShield()) + { + m_iWeaponState &= ~WPNSTATE_SHIELD_DRAWN; + m_pPlayer->m_bShieldDrawn = false; + m_pPlayer->pev->gamestate = HITGROUP_SHIELD_DISABLED; + } +#endif + } } // called by the new item with the existing item as parameter From dbefd54733ea138fc6ee7b677a5d756c69ea9901 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Wed, 27 Oct 2021 15:25:00 +0200 Subject: [PATCH 015/100] Update item_airbox.cpp --- regamedll/dlls/addons/item_airbox.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/regamedll/dlls/addons/item_airbox.cpp b/regamedll/dlls/addons/item_airbox.cpp index d53961d6e..00df617de 100644 --- a/regamedll/dlls/addons/item_airbox.cpp +++ b/regamedll/dlls/addons/item_airbox.cpp @@ -63,11 +63,6 @@ void CItemAirBox::Touch(CBaseEntity *pOther) pev->nextthink = 0; SetThink(nullptr); - - if(m_flyup < 0) - { - m_flyup = -m_flyup; - } } } @@ -76,6 +71,10 @@ void CItemAirBox::Restart() CArmoury::Restart(); UTIL_SetOrigin(pev, pev->oldorigin); pev->velocity.z = 0; + if(m_flyup < 0) + { + m_flyup = -m_flyup; + } if (m_flyup > 0 && m_delay > 0.01f) { From 1c000638df63c47e1ea667b6109299143f452047 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Wed, 27 Oct 2021 15:34:16 +0200 Subject: [PATCH 016/100] Update item_airbox.cpp --- regamedll/dlls/addons/item_airbox.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/regamedll/dlls/addons/item_airbox.cpp b/regamedll/dlls/addons/item_airbox.cpp index 00df617de..a5bf31c82 100644 --- a/regamedll/dlls/addons/item_airbox.cpp +++ b/regamedll/dlls/addons/item_airbox.cpp @@ -71,6 +71,7 @@ void CItemAirBox::Restart() CArmoury::Restart(); UTIL_SetOrigin(pev, pev->oldorigin); pev->velocity.z = 0; + if(m_flyup < 0) { m_flyup = -m_flyup; From 55ce6f5f541ddb103856b89a170a07ef1890dfdc Mon Sep 17 00:00:00 2001 From: StevenKal Date: Wed, 27 Oct 2021 16:02:59 +0200 Subject: [PATCH 017/100] Update weapons.cpp --- regamedll/dlls/weapons.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/regamedll/dlls/weapons.cpp b/regamedll/dlls/weapons.cpp index 205234a4c..17284f7ed 100644 --- a/regamedll/dlls/weapons.cpp +++ b/regamedll/dlls/weapons.cpp @@ -1404,7 +1404,7 @@ BOOL EXT_FUNC CBasePlayerWeapon::__API_HOOK(DefaultDeploy)(char *szViewModel, ch m_pPlayer->m_bResumeZoom = false; #ifdef REGAMEDLL_FIXES - if(m_pPlayer->HasShield() && m_iId != WEAPON_C4) + if(m_pPlayer->HasShield() && m_iId != WEAPON_C4 && m_pPlayer->pev->weaponmodel) { m_pPlayer->pev->gamestate = HITGROUP_SHIELD_ENABLED; } From a5534333e262d5fd6722d8f1d89b8e09784af831 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Wed, 27 Oct 2021 17:09:15 +0200 Subject: [PATCH 018/100] Update weapons.cpp --- regamedll/dlls/weapons.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/regamedll/dlls/weapons.cpp b/regamedll/dlls/weapons.cpp index 17284f7ed..cd28197a1 100644 --- a/regamedll/dlls/weapons.cpp +++ b/regamedll/dlls/weapons.cpp @@ -1119,6 +1119,12 @@ void CBasePlayerItem::DestroyItem() if ((m_pPlayer->pev->weapons & ~(1 << WEAPON_SUIT)) == 0) { m_pPlayer->m_iHideHUD |= HIDEHUD_WEAPONS; } + // Fix problem when we throw our last grenade right before using a tank and when we unuse it + // we no longer have an active item and we are unable to select another via mouse wheel. + else if(m_pTank && m_pPlayer->HasWeapons()) + { + g_pGameRules->GetNextBestWeapon(m_pPlayer, this); + } #endif } From e72832ee70b5ed2c7723b261a0c4b8a22b44c772 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Wed, 27 Oct 2021 17:25:46 +0200 Subject: [PATCH 019/100] Update weapons.cpp --- regamedll/dlls/weapons.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/regamedll/dlls/weapons.cpp b/regamedll/dlls/weapons.cpp index cd28197a1..6c6615161 100644 --- a/regamedll/dlls/weapons.cpp +++ b/regamedll/dlls/weapons.cpp @@ -1108,10 +1108,12 @@ void CBasePlayerItem::DestroyItem() { if (m_pPlayer) { +#ifdef REGAMEDLL_FIXES + bool bShouldCallGetNextBestWeapon = (this == m_pPlayer->m_pActiveItem); +#endif // if attached to a player, remove. if (m_pPlayer->RemovePlayerItem(this)) { - #ifdef REGAMEDLL_FIXES m_pPlayer->pev->weapons &= ~(1 << m_iId); @@ -1119,15 +1121,18 @@ void CBasePlayerItem::DestroyItem() if ((m_pPlayer->pev->weapons & ~(1 << WEAPON_SUIT)) == 0) { m_pPlayer->m_iHideHUD |= HIDEHUD_WEAPONS; } - // Fix problem when we throw our last grenade right before using a tank and when we unuse it + // Helps to fix problem when we throw our last grenade right before using a tank (< 0.5 seconds) and when we unuse it, // we no longer have an active item and we are unable to select another via mouse wheel. - else if(m_pTank && m_pPlayer->HasWeapons()) + else if(bShouldCallGetNextBestWeapon) { g_pGameRules->GetNextBestWeapon(m_pPlayer, this); } #endif - } +#ifdef REGAMEDLL_FIXES + else if(!(pev->flags & FL_KILLME)) // Do not kill the item when unable to unhook from player's inventory (as if we manually refused this). + return; +#endif } Kill(); From d9c8bd11e9c44d9f87919c8f199c7640b1de58f6 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Wed, 27 Oct 2021 19:21:04 +0200 Subject: [PATCH 020/100] Update game.cpp --- regamedll/dlls/game.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/regamedll/dlls/game.cpp b/regamedll/dlls/game.cpp index 0fa99b703..0c0c45b66 100644 --- a/regamedll/dlls/game.cpp +++ b/regamedll/dlls/game.cpp @@ -163,7 +163,7 @@ cvar_t sv_autobunnyhopping = { "sv_autobunnyhopping", "0", 0, 0.0f cvar_t sv_enablebunnyhopping = { "sv_enablebunnyhopping", "0", 0, 0.0f, nullptr }; // Note: Just for my plugins & cie. -cvar_t game_version_personnal = { "game_version_personnal", "1", FCVAR_SERVER, 0.0f, nullptr }; +cvar_t game_version_personnal = { "game_version_personnal", "1.0.0-AMXModDev", FCVAR_SERVER, 0.0f, nullptr }; void GameDLL_Version_f() { From 9b8626bc0a03ac38c3132493988225cf38678819 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Wed, 27 Oct 2021 20:42:20 +0200 Subject: [PATCH 021/100] Update game.cpp --- regamedll/dlls/game.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/regamedll/dlls/game.cpp b/regamedll/dlls/game.cpp index 0c0c45b66..b886e1c84 100644 --- a/regamedll/dlls/game.cpp +++ b/regamedll/dlls/game.cpp @@ -163,7 +163,7 @@ cvar_t sv_autobunnyhopping = { "sv_autobunnyhopping", "0", 0, 0.0f cvar_t sv_enablebunnyhopping = { "sv_enablebunnyhopping", "0", 0, 0.0f, nullptr }; // Note: Just for my plugins & cie. -cvar_t game_version_personnal = { "game_version_personnal", "1.0.0-AMXModDev", FCVAR_SERVER, 0.0f, nullptr }; +cvar_t game_version_personnal = { "game_version_personnal", "1.0.0-public-AMXModDev", FCVAR_SERVER, 0.0f, nullptr }; void GameDLL_Version_f() { From 812a3206b2911a5f4082de718d5cff059781f681 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Thu, 28 Oct 2021 01:50:06 +0200 Subject: [PATCH 022/100] Update item_airbox.cpp --- regamedll/dlls/addons/item_airbox.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/regamedll/dlls/addons/item_airbox.cpp b/regamedll/dlls/addons/item_airbox.cpp index a5bf31c82..a42f91a76 100644 --- a/regamedll/dlls/addons/item_airbox.cpp +++ b/regamedll/dlls/addons/item_airbox.cpp @@ -63,6 +63,7 @@ void CItemAirBox::Touch(CBaseEntity *pOther) pev->nextthink = 0; SetThink(nullptr); + pev->velocity = g_vecZero; } } @@ -70,7 +71,7 @@ void CItemAirBox::Restart() { CArmoury::Restart(); UTIL_SetOrigin(pev, pev->oldorigin); - pev->velocity.z = 0; + pev->velocity = g_vecZero; if(m_flyup < 0) { From a47f2eea207f0bc18a0ab25f5f4b00c274311f77 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Wed, 3 Nov 2021 17:19:18 +0100 Subject: [PATCH 023/100] Update weapons.cpp --- regamedll/dlls/weapons.cpp | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/regamedll/dlls/weapons.cpp b/regamedll/dlls/weapons.cpp index 6c6615161..edb8b10c1 100644 --- a/regamedll/dlls/weapons.cpp +++ b/regamedll/dlls/weapons.cpp @@ -1108,12 +1108,10 @@ void CBasePlayerItem::DestroyItem() { if (m_pPlayer) { -#ifdef REGAMEDLL_FIXES - bool bShouldCallGetNextBestWeapon = (this == m_pPlayer->m_pActiveItem); -#endif // if attached to a player, remove. if (m_pPlayer->RemovePlayerItem(this)) { + #ifdef REGAMEDLL_FIXES m_pPlayer->pev->weapons &= ~(1 << m_iId); @@ -1121,18 +1119,8 @@ void CBasePlayerItem::DestroyItem() if ((m_pPlayer->pev->weapons & ~(1 << WEAPON_SUIT)) == 0) { m_pPlayer->m_iHideHUD |= HIDEHUD_WEAPONS; } - // Helps to fix problem when we throw our last grenade right before using a tank (< 0.5 seconds) and when we unuse it, - // we no longer have an active item and we are unable to select another via mouse wheel. - else if(bShouldCallGetNextBestWeapon) - { - g_pGameRules->GetNextBestWeapon(m_pPlayer, this); - } #endif } -#ifdef REGAMEDLL_FIXES - else if(!(pev->flags & FL_KILLME)) // Do not kill the item when unable to unhook from player's inventory (as if we manually refused this). - return; -#endif } Kill(); From 9feb8e8ef2dd0dc6ba5a14d3d23000a9ac29e8da Mon Sep 17 00:00:00 2001 From: StevenKal Date: Wed, 3 Nov 2021 18:41:30 +0100 Subject: [PATCH 024/100] Update weapons.cpp --- regamedll/dlls/weapons.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/regamedll/dlls/weapons.cpp b/regamedll/dlls/weapons.cpp index edb8b10c1..cb8d9d82c 100644 --- a/regamedll/dlls/weapons.cpp +++ b/regamedll/dlls/weapons.cpp @@ -1121,6 +1121,10 @@ void CBasePlayerItem::DestroyItem() } #endif } +#ifdef REGAMEDLL_FIXES + else if(!(pev->flags & FL_KILLME)) // Do not kill the item when unable to unhook from player's inventory (as if we manually refused this). + return; +#endif } Kill(); From 8e758b3ec24d60c1b3d378873f2feb3f1c8bd05a Mon Sep 17 00:00:00 2001 From: StevenKal Date: Wed, 3 Nov 2021 18:41:50 +0100 Subject: [PATCH 025/100] Update func_tank.cpp --- regamedll/dlls/func_tank.cpp | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/regamedll/dlls/func_tank.cpp b/regamedll/dlls/func_tank.cpp index acb772d1b..95784a201 100644 --- a/regamedll/dlls/func_tank.cpp +++ b/regamedll/dlls/func_tank.cpp @@ -239,14 +239,30 @@ BOOL CFuncTank::StartControl(CBasePlayer *pController) m_pController = pController; - if (m_pController->m_pActiveItem) + CBasePlayerItem *pActiveItem = m_pController->m_pActiveItem; + + if (pActiveItem) { - m_pController->m_pActiveItem->Holster(); - m_pController->pev->weaponmodel = 0; +#ifdef REGAMEDLL_FIXES + if (pActiveItem->m_flStartThrow == 0 + && pActiveItem->m_flReleaseThrow > 0 + && pActiveItem->m_pPlayer == m_pController + && m_pController->m_rgAmmo[pActiveItem->m_iPrimaryAmmoType] <= 0) + { + pActiveItem->RetireWeapon(); + } + else +#endif + { + pActiveItem->Holster(); + } +#ifndef REGAMEDLL_FIXES + m_pController->pev->weaponmodel = 0; #ifdef BUILD_LATEST_FIXES m_pController->pev->viewmodel = 0; #endif +#endif #ifdef REGAMEDLL_FIXES // if (m_pController->m_iFOV != DEFAULT_FOV) From 72868ecd5699dbb4c27fa5d886291052060ddc9e Mon Sep 17 00:00:00 2001 From: StevenKal Date: Wed, 3 Nov 2021 18:49:07 +0100 Subject: [PATCH 026/100] Update func_tank.cpp --- regamedll/dlls/func_tank.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/regamedll/dlls/func_tank.cpp b/regamedll/dlls/func_tank.cpp index 95784a201..71807b913 100644 --- a/regamedll/dlls/func_tank.cpp +++ b/regamedll/dlls/func_tank.cpp @@ -239,22 +239,22 @@ BOOL CFuncTank::StartControl(CBasePlayer *pController) m_pController = pController; - CBasePlayerItem *pActiveItem = m_pController->m_pActiveItem; + CBasePlayerWeapon *pActiveWeapon = static_cast(m_pController->m_pActiveItem); - if (pActiveItem) + if (pActiveWeapon) { #ifdef REGAMEDLL_FIXES - if (pActiveItem->m_flStartThrow == 0 - && pActiveItem->m_flReleaseThrow > 0 - && pActiveItem->m_pPlayer == m_pController - && m_pController->m_rgAmmo[pActiveItem->m_iPrimaryAmmoType] <= 0) + if (pActiveWeapon->m_flStartThrow == 0 + && pActiveWeapon->m_flReleaseThrow > 0 + && pActiveWeapon->m_pPlayer == m_pController + && m_pController->m_rgAmmo[pActiveWeapon->m_iPrimaryAmmoType] <= 0) { - pActiveItem->RetireWeapon(); + pActiveWeapon->RetireWeapon(); } else #endif { - pActiveItem->Holster(); + pActiveWeapon->Holster(); } #ifndef REGAMEDLL_FIXES From 1b27292878247305294fdb60226c93c8492833f5 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Wed, 3 Nov 2021 19:59:42 +0100 Subject: [PATCH 027/100] Update player.cpp --- regamedll/dlls/player.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/regamedll/dlls/player.cpp b/regamedll/dlls/player.cpp index a08a92321..247ba6ac4 100644 --- a/regamedll/dlls/player.cpp +++ b/regamedll/dlls/player.cpp @@ -4015,6 +4015,11 @@ void CBasePlayer::PlayerUse() if (!((pev->button | m_afButtonPressed | m_afButtonReleased) & IN_USE)) return; +#ifdef REGAMEDLL_FIXES + if (IsReloading()) + return; +#endif + // Hit Use on a train? if (m_afButtonPressed & IN_USE) { From 277301e744be7204b693e2ce95f0fc3422882080 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Wed, 3 Nov 2021 20:00:45 +0100 Subject: [PATCH 028/100] Update CAPI_Impl.cpp --- regamedll/dlls/API/CAPI_Impl.cpp | 66 +++++++++----------------------- 1 file changed, 19 insertions(+), 47 deletions(-) diff --git a/regamedll/dlls/API/CAPI_Impl.cpp b/regamedll/dlls/API/CAPI_Impl.cpp index 0fe10a490..47532642b 100644 --- a/regamedll/dlls/API/CAPI_Impl.cpp +++ b/regamedll/dlls/API/CAPI_Impl.cpp @@ -30,12 +30,15 @@ CReGameHookchains g_ReGameHookchains; -int EXT_FUNC Cmd_Argc_api() { - return CMD_ARGC_(); -} +void Regamedll_ChangeString_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]; + } -const char *EXT_FUNC Cmd_Argv_api(int i) { - return CMD_ARGV_(i); + Q_strcpy(dest, source); } CGrenade *PlantBomb_api(entvars_t *pevOwner, Vector &vecStart, Vector &vecVelocity) { @@ -51,22 +54,22 @@ void SpawnRandomGibs_api(entvars_t *pevVictim, int cGibs, int human) { } ReGameFuncs_t g_ReGameApiFuncs = { - &CREATE_NAMED_ENTITY, + CREATE_NAMED_ENTITY, - &Regamedll_ChangeString_api, + Regamedll_ChangeString_api, - &RadiusDamage_api, - &ClearMultiDamage_api, - &ApplyMultiDamage_api, - &AddMultiDamage_api, + RadiusDamage, + ClearMultiDamage, + ApplyMultiDamage, + AddMultiDamage, - &UTIL_FindEntityByString, + UTIL_FindEntityByString, - &AddEntityHashValue, - &RemoveEntityHashValue, + AddEntityHashValue, + RemoveEntityHashValue, - Cmd_Argc_api, - Cmd_Argv_api, + CMD_ARGC_, + CMD_ARGV_, PlantBomb_api, @@ -265,35 +268,4 @@ bool CReGameApi::BGetIGameRules(const char *pchVersion) const return false; } -EXT_FUNC void Regamedll_ChangeString_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); -} - -EXT_FUNC void RadiusDamage_api(Vector vecSrc, entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, float flRadius, int iClassIgnore, int bitsDamageType) -{ - RadiusDamage(vecSrc, pevInflictor, pevAttacker, flDamage, flRadius, iClassIgnore, bitsDamageType); -} - -EXT_FUNC void ClearMultiDamage_api() -{ - ClearMultiDamage(); -} - -EXT_FUNC void ApplyMultiDamage_api(entvars_t *pevInflictor, entvars_t *pevAttacker) -{ - ApplyMultiDamage(pevInflictor, pevAttacker); -} - -EXT_FUNC void AddMultiDamage_api(entvars_t *pevInflictor, CBaseEntity *pEntity, float flDamage, int bitsDamageType) -{ - AddMultiDamage(pevInflictor, pEntity, flDamage, bitsDamageType); -} - EXPOSE_SINGLE_INTERFACE(CReGameApi, IReGameApi, VRE_GAMEDLL_API_VERSION); From 165ec3ceb5d53b741fc1e35cfaf7cc92a27d3307 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Wed, 3 Nov 2021 20:01:36 +0100 Subject: [PATCH 029/100] Update CAPI_Impl.h --- regamedll/dlls/API/CAPI_Impl.h | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/regamedll/dlls/API/CAPI_Impl.h b/regamedll/dlls/API/CAPI_Impl.h index 1be3dd232..311f612ed 100644 --- a/regamedll/dlls/API/CAPI_Impl.h +++ b/regamedll/dlls/API/CAPI_Impl.h @@ -906,8 +906,8 @@ class CReGameHookchains: public IReGameHookchains { virtual IReGameHookRegistry_CBasePlayer_JoiningThink *CBasePlayer_JoiningThink(); }; -extern CReGameHookchains g_ReGameHookchains; -extern ReGameFuncs_t g_ReGameApiFuncs; +C_DLLEXPORT CReGameHookchains g_ReGameHookchains; +C_DLLEXPORT ReGameFuncs_t g_ReGameApiFuncs; class CReGameApi: public IReGameApi { public: @@ -930,10 +930,3 @@ class CReGameApi: public IReGameApi { EXT_FUNC virtual bool BGetICSEntity(const char *pchVersion) const; EXT_FUNC virtual bool BGetIGameRules(const char *pchVersion) const; }; - -void Regamedll_ChangeString_api(char *&dest, const char *source); -void RadiusDamage_api(Vector vecSrc, entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, float flRadius, int iClassIgnore, int bitsDamageType); - -void ClearMultiDamage_api(); -void ApplyMultiDamage_api(entvars_t *pevInflictor, entvars_t *pevAttacker); -void AddMultiDamage_api(entvars_t *pevInflictor, CBaseEntity *pEntity, float flDamage, int bitsDamageType); From 63abc4256801422a8e161aa78043628adbcb9a26 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Thu, 4 Nov 2021 03:20:09 +0100 Subject: [PATCH 030/100] Update func_tank.cpp --- regamedll/dlls/func_tank.cpp | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/regamedll/dlls/func_tank.cpp b/regamedll/dlls/func_tank.cpp index 71807b913..060932aa8 100644 --- a/regamedll/dlls/func_tank.cpp +++ b/regamedll/dlls/func_tank.cpp @@ -244,18 +244,23 @@ BOOL CFuncTank::StartControl(CBasePlayer *pController) if (pActiveWeapon) { #ifdef REGAMEDLL_FIXES - if (pActiveWeapon->m_flStartThrow == 0 - && pActiveWeapon->m_flReleaseThrow > 0 - && pActiveWeapon->m_pPlayer == m_pController - && m_pController->m_rgAmmo[pActiveWeapon->m_iPrimaryAmmoType] <= 0) - { - pActiveWeapon->RetireWeapon(); - } - else + // Fix problem when we holster a granada before its "RetireWeapon" code call, to avoid having no new weapon/HUD selection when we stop controlling the tank. + // This happens when we throw our last granada and we quickly use the tank, + // the "GetNextBestWeapon" code inside "RetireWeapon" will not be called, since "m_flReleaseThrow" will be reset to -1. + bool bShouldCallGetNextBestWeapon = + ((pActiveWeapon->m_iId & ((1<m_flStartThrow == 0 + && pActiveWeapon->m_flReleaseThrow > 0 + && pActiveWeapon->m_pPlayer == m_pController + && m_pController->m_rgAmmo[pActiveWeapon->m_iPrimaryAmmoType] <= 0); #endif + pActiveWeapon->Holster(); +#ifdef REGAMEDLL_FIXES + if (bShouldCallGetNextBestWeapon && !m_pController->m_pActiveItem) { - pActiveWeapon->Holster(); + g_pGameRules->GetNextBestWeapon(m_pController, pActiveWeapon); } +#endif #ifndef REGAMEDLL_FIXES m_pController->pev->weaponmodel = 0; @@ -910,7 +915,7 @@ void CFuncTankControls::Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_T { m_pTank->m_vecControllerUsePos.y = MAX_PLAYER_USE_RADIUS - (this->Center() - pActivator->pev->origin).Length(); - if(m_pTank->m_vecControllerUsePos.y < 0) // Since radius function can get and higher range, so fix it to avoid "StartControl" followed by "StopControl" on a next think! + if(m_pTank->m_vecControllerUsePos.y < 0) // Since radius function can get a higher range, so fix it to avoid "StartControl" followed by "StopControl" on a next think! { m_pTank->m_vecControllerUsePos.y = -m_pTank->m_vecControllerUsePos.y; } From 4ec7e6cb76dfaa649ab1c5699fd3cc6cfa8ce1a7 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Thu, 4 Nov 2021 03:20:28 +0100 Subject: [PATCH 031/100] Update game.cpp --- regamedll/dlls/game.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/regamedll/dlls/game.cpp b/regamedll/dlls/game.cpp index b886e1c84..c9a01affc 100644 --- a/regamedll/dlls/game.cpp +++ b/regamedll/dlls/game.cpp @@ -163,7 +163,7 @@ cvar_t sv_autobunnyhopping = { "sv_autobunnyhopping", "0", 0, 0.0f cvar_t sv_enablebunnyhopping = { "sv_enablebunnyhopping", "0", 0, 0.0f, nullptr }; // Note: Just for my plugins & cie. -cvar_t game_version_personnal = { "game_version_personnal", "1.0.0-public-AMXModDev", FCVAR_SERVER, 0.0f, nullptr }; +cvar_t game_version_personnal = { "game_version_personnal", "1.1.0-public-AMXModDev", FCVAR_SERVER, 0.0f, nullptr }; void GameDLL_Version_f() { From b2480ed66407095b6d48683dc4aa3b87ba0e5737 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Thu, 4 Nov 2021 03:21:01 +0100 Subject: [PATCH 032/100] Update weapons.cpp --- regamedll/dlls/weapons.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/regamedll/dlls/weapons.cpp b/regamedll/dlls/weapons.cpp index cb8d9d82c..7cf20947c 100644 --- a/regamedll/dlls/weapons.cpp +++ b/regamedll/dlls/weapons.cpp @@ -1111,7 +1111,6 @@ void CBasePlayerItem::DestroyItem() // if attached to a player, remove. if (m_pPlayer->RemovePlayerItem(this)) { - #ifdef REGAMEDLL_FIXES m_pPlayer->pev->weapons &= ~(1 << m_iId); From 18c328d023c3712bdab136476f3a06f4e86b17a8 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Thu, 4 Nov 2021 03:23:04 +0100 Subject: [PATCH 033/100] Update CSPlayer.cpp --- regamedll/dlls/API/CSPlayer.cpp | 57 ++++++++++++++++++--------------- 1 file changed, 32 insertions(+), 25 deletions(-) diff --git a/regamedll/dlls/API/CSPlayer.cpp b/regamedll/dlls/API/CSPlayer.cpp index 6b11725fe..ba5de367a 100644 --- a/regamedll/dlls/API/CSPlayer.cpp +++ b/regamedll/dlls/API/CSPlayer.cpp @@ -43,6 +43,11 @@ EXT_FUNC bool CCSPlayer::JoinTeam(TeamName team) pPlayer->pev->deadflag = DEAD_DEAD; pPlayer->pev->health = 0; + // Drop the C4 when we move toward spectator! + if(pPlayer->m_bHasC4) + { + pPlayer->DropPlayerItem("weapon_c4"); + } pPlayer->RemoveAllItems(TRUE); pPlayer->m_bHasC4 = false; @@ -200,7 +205,6 @@ EXT_FUNC bool CCSPlayer::RemovePlayerItemEx(const char* pszItemName, bool bRemov return true; } - else if (FStrEq(pszItemName, "weapon_shield")) { return RemoveShield(); @@ -209,33 +213,35 @@ EXT_FUNC bool CCSPlayer::RemovePlayerItemEx(const char* pszItemName, bool bRemov auto pItem = GetItemByName(pszItemName); if (pItem) { - if (FClassnameIs(pItem->pev, "weapon_c4")) { - pPlayer->m_bHasC4 = false; - pPlayer->pev->body = 0; - pPlayer->SetBombIcon(FALSE); - pPlayer->SetProgressBarTime(0); - } - - if (pItem->IsWeapon()) - { - if (pItem == pPlayer->m_pActiveItem) { - ((CBasePlayerWeapon *)pItem)->RetireWeapon(); - } - - if (bRemoveAmmo) { - pPlayer->m_rgAmmo[ pItem->PrimaryAmmoIndex() ] = 0; - } - } + CBasePlayerItem *pActiveItem = pPlayer->m_pActiveItem; if (pPlayer->RemovePlayerItem(pItem)) { pPlayer->pev->weapons &= ~(1 << pItem->m_iId); - // No more weapon + // No more weapon. if ((pPlayer->pev->weapons & ~(1 << WEAPON_SUIT)) == 0) { pPlayer->m_iHideHUD |= HIDEHUD_WEAPONS; } pItem->Kill(); + if (pItem->IsWeapon()) { + if (pItem == pActiveItem) { + g_pGameRules->GetNextBestWeapon(pPlayer, pActiveItem); + } + + // Critical if we share BP ammo with others, a mode like <0|1|2> where "1" check if no other weapon use such ammo type would have been better. + if (bRemoveAmmo) { + pPlayer->m_rgAmmo[ pItem->PrimaryAmmoIndex() ] = 0; + } + } + + if (FClassnameIs(pItem->pev, "weapon_c4")) { + pPlayer->m_bHasC4 = false; + pPlayer->pev->body = 0; + pPlayer->SetBombIcon(FALSE); + pPlayer->SetProgressBarTime(0); + } + if (!pPlayer->m_rgpPlayerItems[PRIMARY_WEAPON_SLOT]) { pPlayer->m_bHasPrimary = false; } @@ -303,14 +309,14 @@ EXT_FUNC void CCSPlayer::GiveShield(bool bDeploy) BasePlayer()->GiveShield(bDeploy); } -EXT_FUNC void CCSPlayer::DropShield(bool bDeploy) +EXT_FUNC CBaseEntity *CCSPlayer::DropShield(bool bDeploy) { - BasePlayer()->DropShield(bDeploy); + return BasePlayer()->DropShield(bDeploy); } -EXT_FUNC void CCSPlayer::DropPlayerItem(const char *pszItemName) +EXT_FUNC CBaseEntity *CCSPlayer::DropPlayerItem(const char *pszItemName) { - BasePlayer()->DropPlayerItem(pszItemName); + return BasePlayer()->DropPlayerItem(pszItemName); } EXT_FUNC bool CCSPlayer::RemoveShield() @@ -531,8 +537,8 @@ void CCSPlayer::Reset() m_szModel[0] = '\0'; m_bForceShowMenu = false; - m_flRespawnPending = - m_flSpawnProtectionEndTime = 0.0f; + m_flRespawnPending = 0.0f; + m_flSpawnProtectionEndTime = 0.0f; m_vecOldvAngle = g_vecZero; m_iWeaponInfiniteAmmo = 0; @@ -541,6 +547,7 @@ void CCSPlayer::Reset() m_bGameForcingRespawn = false; m_bAutoBunnyHopping = false; m_bMegaBunnyJumping = false; + m_bPlantC4Anywhere = false; } void CCSPlayer::OnSpawn() From 6caeb16bd151c3decaf007715e236260e5d1bebe Mon Sep 17 00:00:00 2001 From: StevenKal Date: Thu, 4 Nov 2021 03:23:50 +0100 Subject: [PATCH 034/100] Update CSPlayer.h --- regamedll/public/regamedll/API/CSPlayer.h | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/regamedll/public/regamedll/API/CSPlayer.h b/regamedll/public/regamedll/API/CSPlayer.h index 4bee3ce02..4e7d1e93e 100644 --- a/regamedll/public/regamedll/API/CSPlayer.h +++ b/regamedll/public/regamedll/API/CSPlayer.h @@ -48,7 +48,8 @@ class CCSPlayer: public CCSMonster { m_bCanShootOverride(false), m_bGameForcingRespawn(false), m_bAutoBunnyHopping(false), - m_bMegaBunnyJumping(false) + m_bMegaBunnyJumping(false), + m_bPlantC4Anywhere(false) { m_szModel[0] = '\0'; } @@ -60,8 +61,8 @@ class CCSPlayer: public CCSMonster { virtual CBaseEntity *GiveNamedItemEx(const char *pszName); virtual void GiveDefaultItems(); virtual void GiveShield(bool bDeploy = true); - virtual void DropShield(bool bDeploy = true); - virtual void DropPlayerItem(const char *pszItemName); + virtual CBaseEntity *DropShield(bool bDeploy = true); + virtual CBaseEntity *DropPlayerItem(const char *pszItemName); virtual bool RemoveShield(); virtual void RemoveAllItems(bool bRemoveSuit); virtual bool RemovePlayerItem(const char* pszItemName); @@ -129,6 +130,7 @@ class CCSPlayer: public CCSMonster { bool m_bGameForcingRespawn; bool m_bAutoBunnyHopping; bool m_bMegaBunnyJumping; + bool m_bPlantC4Anywhere; }; // Inlines From b3c4a72f26a5d15b4b007b6af713fe68c16272e9 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Thu, 4 Nov 2021 03:24:20 +0100 Subject: [PATCH 035/100] Update regamedll_api.h --- regamedll/public/regamedll/regamedll_api.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/regamedll/public/regamedll/regamedll_api.h b/regamedll/public/regamedll/regamedll_api.h index ba7a8517c..79aec7c5c 100644 --- a/regamedll/public/regamedll/regamedll_api.h +++ b/regamedll/public/regamedll/regamedll_api.h @@ -38,7 +38,7 @@ #include #define REGAMEDLL_API_VERSION_MAJOR 5 -#define REGAMEDLL_API_VERSION_MINOR 21 +#define REGAMEDLL_API_VERSION_MINOR 22 // CBasePlayer::Spawn hook typedef IHookChainClass IReGameHook_CBasePlayer_Spawn; From a1e9788bacea4d7d89eb24b8d5397a8616a5b6b7 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Thu, 4 Nov 2021 03:24:46 +0100 Subject: [PATCH 036/100] Update version.h --- regamedll/version/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/regamedll/version/version.h b/regamedll/version/version.h index ba22bb751..b65ba1ab2 100644 --- a/regamedll/version/version.h +++ b/regamedll/version/version.h @@ -6,5 +6,5 @@ #pragma once #define VERSION_MAJOR 5 -#define VERSION_MINOR 21 +#define VERSION_MINOR 22 #define VERSION_MAINTENANCE 0 From d25792865a2d76f0bd3f687c71d9fc8c3aad4e04 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Thu, 4 Nov 2021 03:29:34 +0100 Subject: [PATCH 037/100] Update func_tank.cpp --- regamedll/dlls/func_tank.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/regamedll/dlls/func_tank.cpp b/regamedll/dlls/func_tank.cpp index 060932aa8..0cd6d753f 100644 --- a/regamedll/dlls/func_tank.cpp +++ b/regamedll/dlls/func_tank.cpp @@ -248,7 +248,7 @@ BOOL CFuncTank::StartControl(CBasePlayer *pController) // This happens when we throw our last granada and we quickly use the tank, // the "GetNextBestWeapon" code inside "RetireWeapon" will not be called, since "m_flReleaseThrow" will be reset to -1. bool bShouldCallGetNextBestWeapon = - ((pActiveWeapon->m_iId & ((1<m_iId & ((1<m_flStartThrow == 0 && pActiveWeapon->m_flReleaseThrow > 0 && pActiveWeapon->m_pPlayer == m_pController From ee2979f1b4bf7ececde68c233aabdea8f4df68c3 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Thu, 4 Nov 2021 03:53:52 +0100 Subject: [PATCH 038/100] Update CSPlayer.cpp --- regamedll/dlls/API/CSPlayer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/regamedll/dlls/API/CSPlayer.cpp b/regamedll/dlls/API/CSPlayer.cpp index ba5de367a..dd5dda750 100644 --- a/regamedll/dlls/API/CSPlayer.cpp +++ b/regamedll/dlls/API/CSPlayer.cpp @@ -230,7 +230,7 @@ EXT_FUNC bool CCSPlayer::RemovePlayerItemEx(const char* pszItemName, bool bRemov } // Critical if we share BP ammo with others, a mode like <0|1|2> where "1" check if no other weapon use such ammo type would have been better. - if (bRemoveAmmo) { + if (bRemoveAmmo || (pItem->iFlags() & ITEM_FLAG_EXHAUSTIBLE)) { pPlayer->m_rgAmmo[ pItem->PrimaryAmmoIndex() ] = 0; } } From 587a5dad07e0b208dd24668e746a465e3d5f046d Mon Sep 17 00:00:00 2001 From: StevenKal Date: Thu, 4 Nov 2021 03:54:19 +0100 Subject: [PATCH 039/100] Update func_tank.cpp --- regamedll/dlls/func_tank.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/regamedll/dlls/func_tank.cpp b/regamedll/dlls/func_tank.cpp index 0cd6d753f..37264abfe 100644 --- a/regamedll/dlls/func_tank.cpp +++ b/regamedll/dlls/func_tank.cpp @@ -248,7 +248,7 @@ BOOL CFuncTank::StartControl(CBasePlayer *pController) // This happens when we throw our last granada and we quickly use the tank, // the "GetNextBestWeapon" code inside "RetireWeapon" will not be called, since "m_flReleaseThrow" will be reset to -1. bool bShouldCallGetNextBestWeapon = - ((pActiveWeapon->m_iId & ((1<m_iId == WEAPON_HEGRENADE || pActiveWeapon->m_iId == WEAPON_FLASHBANG || pActiveWeapon->m_iId == WEAPON_SMOKEGRENADE) && pActiveWeapon->m_flStartThrow == 0 && pActiveWeapon->m_flReleaseThrow > 0 && pActiveWeapon->m_pPlayer == m_pController From 37a469d86a90682664eb95690dbeff3e0d673c47 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Thu, 4 Nov 2021 04:13:48 +0100 Subject: [PATCH 040/100] Update func_tank.cpp --- regamedll/dlls/func_tank.cpp | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/regamedll/dlls/func_tank.cpp b/regamedll/dlls/func_tank.cpp index 37264abfe..c97f08672 100644 --- a/regamedll/dlls/func_tank.cpp +++ b/regamedll/dlls/func_tank.cpp @@ -247,20 +247,19 @@ BOOL CFuncTank::StartControl(CBasePlayer *pController) // Fix problem when we holster a granada before its "RetireWeapon" code call, to avoid having no new weapon/HUD selection when we stop controlling the tank. // This happens when we throw our last granada and we quickly use the tank, // the "GetNextBestWeapon" code inside "RetireWeapon" will not be called, since "m_flReleaseThrow" will be reset to -1. - bool bShouldCallGetNextBestWeapon = - ((pActiveWeapon->m_iId == WEAPON_HEGRENADE || pActiveWeapon->m_iId == WEAPON_FLASHBANG || pActiveWeapon->m_iId == WEAPON_SMOKEGRENADE) - && pActiveWeapon->m_flStartThrow == 0 - && pActiveWeapon->m_flReleaseThrow > 0 - && pActiveWeapon->m_pPlayer == m_pController - && m_pController->m_rgAmmo[pActiveWeapon->m_iPrimaryAmmoType] <= 0); -#endif - pActiveWeapon->Holster(); -#ifdef REGAMEDLL_FIXES - if (bShouldCallGetNextBestWeapon && !m_pController->m_pActiveItem) + if ((pActiveWeapon->m_iId == WEAPON_HEGRENADE || pActiveWeapon->m_iId == WEAPON_FLASHBANG || pActiveWeapon->m_iId == WEAPON_SMOKEGRENADE) + && pActiveWeapon->m_flStartThrow == 0 + && pActiveWeapon->m_flReleaseThrow > 0 + && pActiveWeapon->m_pPlayer == m_pController + && m_pController->m_rgAmmo[pActiveWeapon->m_iPrimaryAmmoType] <= 0) { - g_pGameRules->GetNextBestWeapon(m_pController, pActiveWeapon); + pActiveWeapon->RetireWeapon(); } + else #endif + { + pActiveWeapon->Holster(); + } #ifndef REGAMEDLL_FIXES m_pController->pev->weaponmodel = 0; From f85d0b4bbfce1ae279956467ef1d2a34d3d6c21f Mon Sep 17 00:00:00 2001 From: StevenKal Date: Thu, 4 Nov 2021 04:23:14 +0100 Subject: [PATCH 041/100] Update wpn_hegrenade.cpp --- regamedll/dlls/wpn_shared/wpn_hegrenade.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/regamedll/dlls/wpn_shared/wpn_hegrenade.cpp b/regamedll/dlls/wpn_shared/wpn_hegrenade.cpp index d93470eb6..f522b8c59 100644 --- a/regamedll/dlls/wpn_shared/wpn_hegrenade.cpp +++ b/regamedll/dlls/wpn_shared/wpn_hegrenade.cpp @@ -230,13 +230,20 @@ void CHEGrenade::WeaponIdle() // we've finished the throw, restart. m_flStartThrow = 0; - if (m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType]) + if (m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] > 0) { SendWeaponAnim(HEGRENADE_DRAW, UseDecrement() != FALSE); } else { - RetireWeapon(); +#ifdef REGAMEDLL_API + if ((m_pPlayer->pev->weapons & ~(1 << CSW_SUIT | 1 << m_iID )) == 0) + { + m_pPlayer->CSPlayer()->RemovePlayerItem(STRING(pev->classname)); +#endif + { + RetireWeapon(); + } return; } From a58e8d66ceddc068dd7c1d9880c5645bfc3509cd Mon Sep 17 00:00:00 2001 From: StevenKal Date: Thu, 4 Nov 2021 04:31:41 +0100 Subject: [PATCH 042/100] Update wpn_hegrenade.cpp --- regamedll/dlls/wpn_shared/wpn_hegrenade.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/regamedll/dlls/wpn_shared/wpn_hegrenade.cpp b/regamedll/dlls/wpn_shared/wpn_hegrenade.cpp index f522b8c59..4a1266e1d 100644 --- a/regamedll/dlls/wpn_shared/wpn_hegrenade.cpp +++ b/regamedll/dlls/wpn_shared/wpn_hegrenade.cpp @@ -237,7 +237,7 @@ void CHEGrenade::WeaponIdle() else { #ifdef REGAMEDLL_API - if ((m_pPlayer->pev->weapons & ~(1 << CSW_SUIT | 1 << m_iID )) == 0) + if ((m_pPlayer->pev->weapons & ~(1 << WEAPON_SUIT | 1 << m_iID )) == 0) { m_pPlayer->CSPlayer()->RemovePlayerItem(STRING(pev->classname)); #endif From 0ed8eba9c50352e4d96ad0ec230d86916c006dcc Mon Sep 17 00:00:00 2001 From: StevenKal Date: Thu, 4 Nov 2021 04:35:23 +0100 Subject: [PATCH 043/100] Update wpn_hegrenade.cpp --- regamedll/dlls/wpn_shared/wpn_hegrenade.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/regamedll/dlls/wpn_shared/wpn_hegrenade.cpp b/regamedll/dlls/wpn_shared/wpn_hegrenade.cpp index 4a1266e1d..f152a2386 100644 --- a/regamedll/dlls/wpn_shared/wpn_hegrenade.cpp +++ b/regamedll/dlls/wpn_shared/wpn_hegrenade.cpp @@ -237,7 +237,7 @@ void CHEGrenade::WeaponIdle() else { #ifdef REGAMEDLL_API - if ((m_pPlayer->pev->weapons & ~(1 << WEAPON_SUIT | 1 << m_iID )) == 0) + if ((m_pPlayer->pev->weapons & ~(1 << WEAPON_SUIT | 1 << m_iId )) == 0) { m_pPlayer->CSPlayer()->RemovePlayerItem(STRING(pev->classname)); #endif From 506f16788f31f0906878a9b71c28de4294aab320 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Thu, 4 Nov 2021 04:39:44 +0100 Subject: [PATCH 044/100] Update wpn_hegrenade.cpp --- regamedll/dlls/wpn_shared/wpn_hegrenade.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/regamedll/dlls/wpn_shared/wpn_hegrenade.cpp b/regamedll/dlls/wpn_shared/wpn_hegrenade.cpp index f152a2386..0a234f593 100644 --- a/regamedll/dlls/wpn_shared/wpn_hegrenade.cpp +++ b/regamedll/dlls/wpn_shared/wpn_hegrenade.cpp @@ -240,6 +240,8 @@ void CHEGrenade::WeaponIdle() if ((m_pPlayer->pev->weapons & ~(1 << WEAPON_SUIT | 1 << m_iId )) == 0) { m_pPlayer->CSPlayer()->RemovePlayerItem(STRING(pev->classname)); + } + else #endif { RetireWeapon(); From 3a5e6db5edbb2d306af78ed14d04c08932266655 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Thu, 4 Nov 2021 04:55:04 +0100 Subject: [PATCH 045/100] Update wpn_c4.cpp --- regamedll/dlls/wpn_shared/wpn_c4.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/regamedll/dlls/wpn_shared/wpn_c4.cpp b/regamedll/dlls/wpn_shared/wpn_c4.cpp index 293ab024d..f84ea269d 100644 --- a/regamedll/dlls/wpn_shared/wpn_c4.cpp +++ b/regamedll/dlls/wpn_shared/wpn_c4.cpp @@ -233,7 +233,16 @@ void CC4::PrimaryAttack() if (--m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0) { - RetireWeapon(); +#ifdef REGAMEDLL_API + if ((m_pPlayer->pev->weapons & ~(1 << WEAPON_SUIT | 1 << m_iId )) == 0) + { + m_pPlayer->CSPlayer()->RemovePlayerItem(STRING(pev->classname)); + } + else +#endif + { + RetireWeapon(); + } return; } } From cae784efe2122d1de09fd40be6c628b8bda1e266 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Thu, 4 Nov 2021 04:57:07 +0100 Subject: [PATCH 046/100] Update wpn_flashbang.cpp --- regamedll/dlls/wpn_shared/wpn_flashbang.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/regamedll/dlls/wpn_shared/wpn_flashbang.cpp b/regamedll/dlls/wpn_shared/wpn_flashbang.cpp index a60a498c4..7795ec426 100644 --- a/regamedll/dlls/wpn_shared/wpn_flashbang.cpp +++ b/regamedll/dlls/wpn_shared/wpn_flashbang.cpp @@ -227,7 +227,16 @@ void CFlashbang::WeaponIdle() { // we've finished the throw, restart. m_flStartThrow = 0; - RetireWeapon(); +#ifdef REGAMEDLL_API + if ((m_pPlayer->pev->weapons & ~(1 << WEAPON_SUIT | 1 << m_iId )) == 0) + { + m_pPlayer->CSPlayer()->RemovePlayerItem(STRING(pev->classname)); + } + else +#endif + { + RetireWeapon(); + } } else if (m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType]) { From f3b9d7b0d680349fbd81dbe8734d3f87378dadec Mon Sep 17 00:00:00 2001 From: StevenKal Date: Thu, 4 Nov 2021 04:57:34 +0100 Subject: [PATCH 047/100] Update wpn_smokegrenade.cpp --- regamedll/dlls/wpn_shared/wpn_smokegrenade.cpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/regamedll/dlls/wpn_shared/wpn_smokegrenade.cpp b/regamedll/dlls/wpn_shared/wpn_smokegrenade.cpp index b92d6e81d..2cc9c77ef 100644 --- a/regamedll/dlls/wpn_shared/wpn_smokegrenade.cpp +++ b/regamedll/dlls/wpn_shared/wpn_smokegrenade.cpp @@ -231,13 +231,22 @@ void CSmokeGrenade::WeaponIdle() // we've finished the throw, restart. m_flStartThrow = 0; - if (m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType]) + if (m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] > 0) { SendWeaponAnim(SMOKEGRENADE_DRAW, UseDecrement() != FALSE); } else { - RetireWeapon(); +#ifdef REGAMEDLL_API + if ((m_pPlayer->pev->weapons & ~(1 << WEAPON_SUIT | 1 << m_iId )) == 0) + { + m_pPlayer->CSPlayer()->RemovePlayerItem(STRING(pev->classname)); + } + else +#endif + { + RetireWeapon(); + } return; } From d9514989957e99540ebca64f063a9205e7caa113 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Thu, 4 Nov 2021 04:58:35 +0100 Subject: [PATCH 048/100] Update wpn_c4.cpp --- regamedll/dlls/wpn_shared/wpn_c4.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/regamedll/dlls/wpn_shared/wpn_c4.cpp b/regamedll/dlls/wpn_shared/wpn_c4.cpp index f84ea269d..eaf93f856 100644 --- a/regamedll/dlls/wpn_shared/wpn_c4.cpp +++ b/regamedll/dlls/wpn_shared/wpn_c4.cpp @@ -312,7 +312,16 @@ void CC4::WeaponIdle() { if (m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0) { - RetireWeapon(); +#ifdef REGAMEDLL_API + if ((m_pPlayer->pev->weapons & ~(1 << WEAPON_SUIT | 1 << m_iId )) == 0) + { + m_pPlayer->CSPlayer()->RemovePlayerItem(STRING(pev->classname)); + } + else +#endif + { + RetireWeapon(); + } return; } From ddf2f7920fcce3062da29b381407454fece279fd Mon Sep 17 00:00:00 2001 From: StevenKal Date: Thu, 4 Nov 2021 05:05:57 +0100 Subject: [PATCH 049/100] Update wpn_flashbang.cpp --- regamedll/dlls/wpn_shared/wpn_flashbang.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/regamedll/dlls/wpn_shared/wpn_flashbang.cpp b/regamedll/dlls/wpn_shared/wpn_flashbang.cpp index 7795ec426..c7219c243 100644 --- a/regamedll/dlls/wpn_shared/wpn_flashbang.cpp +++ b/regamedll/dlls/wpn_shared/wpn_flashbang.cpp @@ -227,8 +227,9 @@ void CFlashbang::WeaponIdle() { // we've finished the throw, restart. m_flStartThrow = 0; + #ifdef REGAMEDLL_API - if ((m_pPlayer->pev->weapons & ~(1 << WEAPON_SUIT | 1 << m_iId )) == 0) + if (m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0 && (m_pPlayer->pev->weapons & ~(1 << WEAPON_SUIT | 1 << m_iId )) == 0) { m_pPlayer->CSPlayer()->RemovePlayerItem(STRING(pev->classname)); } From b48eb6ab3726286d8e6db242679cc97573007ab7 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Thu, 4 Nov 2021 05:18:55 +0100 Subject: [PATCH 050/100] Update wpn_flashbang.cpp --- regamedll/dlls/wpn_shared/wpn_flashbang.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/regamedll/dlls/wpn_shared/wpn_flashbang.cpp b/regamedll/dlls/wpn_shared/wpn_flashbang.cpp index c7219c243..58d198d63 100644 --- a/regamedll/dlls/wpn_shared/wpn_flashbang.cpp +++ b/regamedll/dlls/wpn_shared/wpn_flashbang.cpp @@ -236,7 +236,7 @@ void CFlashbang::WeaponIdle() else #endif { - RetireWeapon(); + g_pGameRules->GetNextBestWeapon(m_pPlayer, this); } } else if (m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType]) From 327973d3c86241ee844eaf4a945e01ea68163dee Mon Sep 17 00:00:00 2001 From: StevenKal Date: Thu, 4 Nov 2021 05:48:03 +0100 Subject: [PATCH 051/100] Update wpn_flashbang.cpp --- regamedll/dlls/wpn_shared/wpn_flashbang.cpp | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/regamedll/dlls/wpn_shared/wpn_flashbang.cpp b/regamedll/dlls/wpn_shared/wpn_flashbang.cpp index 58d198d63..b7be91ad8 100644 --- a/regamedll/dlls/wpn_shared/wpn_flashbang.cpp +++ b/regamedll/dlls/wpn_shared/wpn_flashbang.cpp @@ -238,6 +238,26 @@ void CFlashbang::WeaponIdle() { g_pGameRules->GetNextBestWeapon(m_pPlayer, this); } + + if ((m_pPlayer->pev->weapons & ~(1 << WEAPON_SUIT | 1 << m_iId )) == 0) + { + if (m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0) + { +#ifdef REGAMEDLL_API + m_pPlayer->CSPlayer()->RemovePlayerItem(STRING(pev->classname)); +#else + RetireWeapon(); +#endif + } + else + { + SendWeaponAnim(FLASHBANG_DRAW, UseDecrement() != FALSE); + } + } + else + { + RetireWeapon(); + } } else if (m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType]) { From c8e0361329bc8a2579981efe29a8fde198d219c9 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Thu, 4 Nov 2021 06:12:09 +0100 Subject: [PATCH 052/100] Update func_tank.cpp --- regamedll/dlls/func_tank.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/regamedll/dlls/func_tank.cpp b/regamedll/dlls/func_tank.cpp index c97f08672..d3d27b165 100644 --- a/regamedll/dlls/func_tank.cpp +++ b/regamedll/dlls/func_tank.cpp @@ -251,7 +251,8 @@ BOOL CFuncTank::StartControl(CBasePlayer *pController) && pActiveWeapon->m_flStartThrow == 0 && pActiveWeapon->m_flReleaseThrow > 0 && pActiveWeapon->m_pPlayer == m_pController - && m_pController->m_rgAmmo[pActiveWeapon->m_iPrimaryAmmoType] <= 0) + && m_pController->m_rgAmmo[pActiveWeapon->m_iPrimaryAmmoType] <= 0 + && (m_pController->pev->weapons & ~(1 << WEAPON_SUIT | 1 << pActiveWeapon->m_iId ))) { pActiveWeapon->RetireWeapon(); } From 426e9ee771ade4023890b50166bdef31a533a1cd Mon Sep 17 00:00:00 2001 From: StevenKal Date: Thu, 4 Nov 2021 06:16:49 +0100 Subject: [PATCH 053/100] Update wpn_flashbang.cpp --- regamedll/dlls/wpn_shared/wpn_flashbang.cpp | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/regamedll/dlls/wpn_shared/wpn_flashbang.cpp b/regamedll/dlls/wpn_shared/wpn_flashbang.cpp index b7be91ad8..b4527cb8d 100644 --- a/regamedll/dlls/wpn_shared/wpn_flashbang.cpp +++ b/regamedll/dlls/wpn_shared/wpn_flashbang.cpp @@ -228,26 +228,11 @@ void CFlashbang::WeaponIdle() // we've finished the throw, restart. m_flStartThrow = 0; -#ifdef REGAMEDLL_API - if (m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0 && (m_pPlayer->pev->weapons & ~(1 << WEAPON_SUIT | 1 << m_iId )) == 0) - { - m_pPlayer->CSPlayer()->RemovePlayerItem(STRING(pev->classname)); - } - else -#endif - { - g_pGameRules->GetNextBestWeapon(m_pPlayer, this); - } - if ((m_pPlayer->pev->weapons & ~(1 << WEAPON_SUIT | 1 << m_iId )) == 0) { if (m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0) { -#ifdef REGAMEDLL_API - m_pPlayer->CSPlayer()->RemovePlayerItem(STRING(pev->classname)); -#else - RetireWeapon(); -#endif + Holster(); } else { From b39ddd2b15614ff58c7c8967517991c510627b37 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Thu, 4 Nov 2021 06:18:35 +0100 Subject: [PATCH 054/100] Update wpn_c4.cpp --- regamedll/dlls/wpn_shared/wpn_c4.cpp | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/regamedll/dlls/wpn_shared/wpn_c4.cpp b/regamedll/dlls/wpn_shared/wpn_c4.cpp index eaf93f856..752287c3d 100644 --- a/regamedll/dlls/wpn_shared/wpn_c4.cpp +++ b/regamedll/dlls/wpn_shared/wpn_c4.cpp @@ -233,13 +233,11 @@ void CC4::PrimaryAttack() if (--m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0) { -#ifdef REGAMEDLL_API if ((m_pPlayer->pev->weapons & ~(1 << WEAPON_SUIT | 1 << m_iId )) == 0) { - m_pPlayer->CSPlayer()->RemovePlayerItem(STRING(pev->classname)); + Holster(); } else -#endif { RetireWeapon(); } @@ -312,13 +310,11 @@ void CC4::WeaponIdle() { if (m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0) { -#ifdef REGAMEDLL_API if ((m_pPlayer->pev->weapons & ~(1 << WEAPON_SUIT | 1 << m_iId )) == 0) { - m_pPlayer->CSPlayer()->RemovePlayerItem(STRING(pev->classname)); + Holster(); } else -#endif { RetireWeapon(); } From 6d8c8abcbee41308ced65992bd809d146ef2bbd2 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Thu, 4 Nov 2021 06:19:18 +0100 Subject: [PATCH 055/100] Update wpn_hegrenade.cpp --- regamedll/dlls/wpn_shared/wpn_hegrenade.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/regamedll/dlls/wpn_shared/wpn_hegrenade.cpp b/regamedll/dlls/wpn_shared/wpn_hegrenade.cpp index 0a234f593..534b8a5ca 100644 --- a/regamedll/dlls/wpn_shared/wpn_hegrenade.cpp +++ b/regamedll/dlls/wpn_shared/wpn_hegrenade.cpp @@ -236,13 +236,11 @@ void CHEGrenade::WeaponIdle() } else { -#ifdef REGAMEDLL_API if ((m_pPlayer->pev->weapons & ~(1 << WEAPON_SUIT | 1 << m_iId )) == 0) { - m_pPlayer->CSPlayer()->RemovePlayerItem(STRING(pev->classname)); + Holster(); } else -#endif { RetireWeapon(); } From eea3f8373502ef06801c019d908d3c27e469ff2d Mon Sep 17 00:00:00 2001 From: StevenKal Date: Thu, 4 Nov 2021 06:19:50 +0100 Subject: [PATCH 056/100] Update wpn_smokegrenade.cpp --- regamedll/dlls/wpn_shared/wpn_smokegrenade.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/regamedll/dlls/wpn_shared/wpn_smokegrenade.cpp b/regamedll/dlls/wpn_shared/wpn_smokegrenade.cpp index 2cc9c77ef..6616841cf 100644 --- a/regamedll/dlls/wpn_shared/wpn_smokegrenade.cpp +++ b/regamedll/dlls/wpn_shared/wpn_smokegrenade.cpp @@ -237,13 +237,11 @@ void CSmokeGrenade::WeaponIdle() } else { -#ifdef REGAMEDLL_API if ((m_pPlayer->pev->weapons & ~(1 << WEAPON_SUIT | 1 << m_iId )) == 0) { - m_pPlayer->CSPlayer()->RemovePlayerItem(STRING(pev->classname)); + Holster(); } else -#endif { RetireWeapon(); } From a5042f9252bb3700cd5890d422e8941ba07f1a48 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Thu, 4 Nov 2021 06:25:58 +0100 Subject: [PATCH 057/100] Update weapons.h --- regamedll/dlls/weapons.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/regamedll/dlls/weapons.h b/regamedll/dlls/weapons.h index bd22989e3..5c0280258 100644 --- a/regamedll/dlls/weapons.h +++ b/regamedll/dlls/weapons.h @@ -861,7 +861,7 @@ class CC4: public CBasePlayerWeapon virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value); virtual int GetItemInfo(ItemInfo *p); virtual BOOL Deploy(); - virtual void Holster(int skiplocal); + virtual void Holster(int skiplocal = 0); virtual float GetMaxSpeed(); virtual int iItemSlot() { return C4_SLOT; } virtual void PrimaryAttack(); @@ -953,7 +953,7 @@ class CFlashbang: public CBasePlayerWeapon virtual BOOL CanDeploy(); virtual BOOL CanDrop() { return FALSE; } virtual BOOL Deploy(); - virtual void Holster(int skiplocal); + virtual void Holster(int skiplocal = 0); virtual float GetMaxSpeed() { return m_fMaxSpeed; } virtual int iItemSlot() { return GRENADE_SLOT; } virtual void PrimaryAttack(); @@ -1122,7 +1122,7 @@ class CHEGrenade: public CBasePlayerWeapon virtual BOOL CanDeploy(); virtual BOOL CanDrop() { return FALSE; } virtual BOOL Deploy(); - virtual void Holster(int skiplocal); + virtual void Holster(int skiplocal = 0); virtual float GetMaxSpeed() { return m_fMaxSpeed; } virtual int iItemSlot() { return GRENADE_SLOT; } virtual void PrimaryAttack(); @@ -1192,7 +1192,7 @@ class CKnife: public CBasePlayerWeapon virtual int GetItemInfo(ItemInfo *p); virtual BOOL CanDrop() { return FALSE; } virtual BOOL Deploy(); - virtual void Holster(int skiplocal); + virtual void Holster(int skiplocal = 0); virtual float GetMaxSpeed() { return m_fMaxSpeed; } virtual int iItemSlot() { return KNIFE_SLOT; } virtual void PrimaryAttack(); @@ -1634,7 +1634,7 @@ class CSmokeGrenade: public CBasePlayerWeapon virtual BOOL CanDeploy(); virtual BOOL CanDrop() { return FALSE; } virtual BOOL Deploy(); - virtual void Holster(int skiplocal); + virtual void Holster(int skiplocal = 0); virtual float GetMaxSpeed() { return m_fMaxSpeed; } virtual int iItemSlot() { return GRENADE_SLOT; } virtual void PrimaryAttack(); From 89b27e65f43d8a18cbfc646b3b03dbfc528af899 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Thu, 4 Nov 2021 13:27:09 +0100 Subject: [PATCH 058/100] Update wpn_c4.cpp --- regamedll/dlls/wpn_shared/wpn_c4.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/regamedll/dlls/wpn_shared/wpn_c4.cpp b/regamedll/dlls/wpn_shared/wpn_c4.cpp index 752287c3d..54f04640b 100644 --- a/regamedll/dlls/wpn_shared/wpn_c4.cpp +++ b/regamedll/dlls/wpn_shared/wpn_c4.cpp @@ -233,11 +233,13 @@ void CC4::PrimaryAttack() if (--m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0) { +#ifdef REGAMEDLL_FIXES if ((m_pPlayer->pev->weapons & ~(1 << WEAPON_SUIT | 1 << m_iId )) == 0) { Holster(); } else +#endif { RetireWeapon(); } @@ -310,11 +312,13 @@ void CC4::WeaponIdle() { if (m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0) { +#ifdef REGAMEDLL_FIXES if ((m_pPlayer->pev->weapons & ~(1 << WEAPON_SUIT | 1 << m_iId )) == 0) { Holster(); } else +#endif { RetireWeapon(); } From 76a63ae8e707e636b84a7ad8a0f276a6e9e99aa4 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Thu, 4 Nov 2021 13:27:52 +0100 Subject: [PATCH 059/100] Update wpn_flashbang.cpp --- regamedll/dlls/wpn_shared/wpn_flashbang.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/regamedll/dlls/wpn_shared/wpn_flashbang.cpp b/regamedll/dlls/wpn_shared/wpn_flashbang.cpp index b4527cb8d..a222aaf8b 100644 --- a/regamedll/dlls/wpn_shared/wpn_flashbang.cpp +++ b/regamedll/dlls/wpn_shared/wpn_flashbang.cpp @@ -228,6 +228,7 @@ void CFlashbang::WeaponIdle() // we've finished the throw, restart. m_flStartThrow = 0; +#ifdef REGAMEDLL_FIXES if ((m_pPlayer->pev->weapons & ~(1 << WEAPON_SUIT | 1 << m_iId )) == 0) { if (m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0) @@ -240,6 +241,7 @@ void CFlashbang::WeaponIdle() } } else +#endif { RetireWeapon(); } From 406982afabb4d6c05c53e3cce772e21aac1b5a38 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Thu, 4 Nov 2021 13:28:08 +0100 Subject: [PATCH 060/100] Update wpn_hegrenade.cpp --- regamedll/dlls/wpn_shared/wpn_hegrenade.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/regamedll/dlls/wpn_shared/wpn_hegrenade.cpp b/regamedll/dlls/wpn_shared/wpn_hegrenade.cpp index 534b8a5ca..5b8e10b02 100644 --- a/regamedll/dlls/wpn_shared/wpn_hegrenade.cpp +++ b/regamedll/dlls/wpn_shared/wpn_hegrenade.cpp @@ -236,11 +236,13 @@ void CHEGrenade::WeaponIdle() } else { +#ifdef REGAMEDLL_FIXES if ((m_pPlayer->pev->weapons & ~(1 << WEAPON_SUIT | 1 << m_iId )) == 0) { Holster(); } else +#endif { RetireWeapon(); } From c84f926bbd2f10fda5d204f8a41d26a53496d5bb Mon Sep 17 00:00:00 2001 From: StevenKal Date: Thu, 4 Nov 2021 13:28:22 +0100 Subject: [PATCH 061/100] Update wpn_smokegrenade.cpp --- regamedll/dlls/wpn_shared/wpn_smokegrenade.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/regamedll/dlls/wpn_shared/wpn_smokegrenade.cpp b/regamedll/dlls/wpn_shared/wpn_smokegrenade.cpp index 6616841cf..c0df2b5f5 100644 --- a/regamedll/dlls/wpn_shared/wpn_smokegrenade.cpp +++ b/regamedll/dlls/wpn_shared/wpn_smokegrenade.cpp @@ -237,11 +237,13 @@ void CSmokeGrenade::WeaponIdle() } else { +#ifdef REGAMEDLL_FIXES if ((m_pPlayer->pev->weapons & ~(1 << WEAPON_SUIT | 1 << m_iId )) == 0) { Holster(); } else +#endif { RetireWeapon(); } From ecc713c26882ff2d70f0f2a5a11488737b8e3b3d Mon Sep 17 00:00:00 2001 From: StevenKal Date: Thu, 4 Nov 2021 13:34:06 +0100 Subject: [PATCH 062/100] Update wpn_c4.cpp --- regamedll/dlls/wpn_shared/wpn_c4.cpp | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/regamedll/dlls/wpn_shared/wpn_c4.cpp b/regamedll/dlls/wpn_shared/wpn_c4.cpp index 54f04640b..278847a7d 100644 --- a/regamedll/dlls/wpn_shared/wpn_c4.cpp +++ b/regamedll/dlls/wpn_shared/wpn_c4.cpp @@ -172,8 +172,9 @@ void CC4::PrimaryAttack() m_fArmedTime = 0; Broadcast("BOMBPL"); +#ifndef REGAMEDLL_FIXES m_pPlayer->m_bHasC4 = false; - +#endif if (pev->speed != 0 && CSGameRules()) { CSGameRules()->m_iC4Timer = int(pev->speed); @@ -221,19 +222,25 @@ void CC4::PrimaryAttack() // Play the plant sound. EMIT_SOUND(edict(), CHAN_WEAPON, "weapons/c4_plant.wav", VOL_NORM, ATTN_NORM); - +#ifndef REGAMEDLL_FIXES // hide the backpack in Terrorist's models. m_pPlayer->pev->body = 0; - +#endif // release the player from being frozen m_pPlayer->ResetMaxSpeed(); - +#ifndef REGAMEDLL_FIXES // No more c4! m_pPlayer->SetBombIcon(FALSE); - +#endif if (--m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0) { #ifdef REGAMEDLL_FIXES + m_pPlayer->m_bHasC4 = false; + // hide the backpack in Terrorist's models. + m_pPlayer->pev->body = 0; + // No more c4! + m_pPlayer->SetBombIcon(FALSE); + if ((m_pPlayer->pev->weapons & ~(1 << WEAPON_SUIT | 1 << m_iId )) == 0) { Holster(); From 7f811721cad51bdd790119c6d10c8404b546cdfc Mon Sep 17 00:00:00 2001 From: StevenKal Date: Tue, 9 Nov 2021 15:35:13 +0100 Subject: [PATCH 063/100] Update weapons.cpp --- regamedll/dlls/weapons.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/regamedll/dlls/weapons.cpp b/regamedll/dlls/weapons.cpp index 7cf20947c..7b2e0e566 100644 --- a/regamedll/dlls/weapons.cpp +++ b/regamedll/dlls/weapons.cpp @@ -1868,7 +1868,7 @@ void CWeaponBox::Touch(CBaseEntity *pOther) if (FClassnameIs(pItem->pev, "weapon_c4")) { #ifdef REGAMEDLL_FIXES - if (pPlayer->m_iTeam != TERRORIST) + if (pPlayer->m_iTeam != TERRORIST || pPlayer->m_bHasC4) return; #else if (pPlayer->m_iTeam != TERRORIST || pPlayer->pev->deadflag != DEAD_NO) From c1a3a7dfec9dfcf006327161c1cac0ecc7577af9 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Thu, 18 Nov 2021 15:50:53 +0100 Subject: [PATCH 064/100] Update func_tank.cpp --- regamedll/dlls/func_tank.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/regamedll/dlls/func_tank.cpp b/regamedll/dlls/func_tank.cpp index d3d27b165..92a2f9670 100644 --- a/regamedll/dlls/func_tank.cpp +++ b/regamedll/dlls/func_tank.cpp @@ -247,10 +247,7 @@ BOOL CFuncTank::StartControl(CBasePlayer *pController) // Fix problem when we holster a granada before its "RetireWeapon" code call, to avoid having no new weapon/HUD selection when we stop controlling the tank. // This happens when we throw our last granada and we quickly use the tank, // the "GetNextBestWeapon" code inside "RetireWeapon" will not be called, since "m_flReleaseThrow" will be reset to -1. - if ((pActiveWeapon->m_iId == WEAPON_HEGRENADE || pActiveWeapon->m_iId == WEAPON_FLASHBANG || pActiveWeapon->m_iId == WEAPON_SMOKEGRENADE) - && pActiveWeapon->m_flStartThrow == 0 - && pActiveWeapon->m_flReleaseThrow > 0 - && pActiveWeapon->m_pPlayer == m_pController + if (IsGrenadeWeapon(pActiveWeapon->m_iId) && m_pController->m_rgAmmo[pActiveWeapon->m_iPrimaryAmmoType] <= 0 && (m_pController->pev->weapons & ~(1 << WEAPON_SUIT | 1 << pActiveWeapon->m_iId ))) { From a878445246c8ad6de9bf32e17170df90dcc26747 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Thu, 18 Nov 2021 15:51:34 +0100 Subject: [PATCH 065/100] Update func_tank.cpp --- regamedll/dlls/func_tank.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/regamedll/dlls/func_tank.cpp b/regamedll/dlls/func_tank.cpp index 92a2f9670..80913ffec 100644 --- a/regamedll/dlls/func_tank.cpp +++ b/regamedll/dlls/func_tank.cpp @@ -249,7 +249,7 @@ BOOL CFuncTank::StartControl(CBasePlayer *pController) // the "GetNextBestWeapon" code inside "RetireWeapon" will not be called, since "m_flReleaseThrow" will be reset to -1. if (IsGrenadeWeapon(pActiveWeapon->m_iId) && m_pController->m_rgAmmo[pActiveWeapon->m_iPrimaryAmmoType] <= 0 - && (m_pController->pev->weapons & ~(1 << WEAPON_SUIT | 1 << pActiveWeapon->m_iId ))) + && (m_pController->pev->weapons & ~(1 << WEAPON_SUIT | 1 << pActiveWeapon->m_iId))) { pActiveWeapon->RetireWeapon(); } From 400300188410a96f3f5ef33ddc8d0bb362984774 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Thu, 17 Feb 2022 00:08:25 +0000 Subject: [PATCH 066/100] Update build.yml --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 78a8b7d3f..ca1c0f7df 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -14,7 +14,7 @@ on: jobs: windows: name: 'Windows' - runs-on: windows-latest + runs-on: windows-2019 env: solution: 'msvc/ReGameDLL.sln' From 1a997f45a07740a7ad1dc8e66b8586f8ae516150 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Thu, 17 Feb 2022 01:04:32 +0000 Subject: [PATCH 067/100] Update player.cpp --- regamedll/dlls/player.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/regamedll/dlls/player.cpp b/regamedll/dlls/player.cpp index 6b2519a8f..8e9b9f14f 100644 --- a/regamedll/dlls/player.cpp +++ b/regamedll/dlls/player.cpp @@ -10249,7 +10249,7 @@ void EXT_FUNC CBasePlayer::__API_HOOK(SetSpawnProtection)(float flProtectionTime pev->rendermode = kRenderTransAdd; pev->renderamt = 100.0f; - MESSAGE_BEGIN(MSG_ONE_UNRELIABLE, gmsgStatusIcon, nullptr, pev); + MESSAGE_BEGIN(MSG_ONE, gmsgStatusIcon, nullptr, pev); WRITE_BYTE(STATUSICON_FLASH); WRITE_STRING("suithelmet_full"); WRITE_BYTE(0); From e1eb7b9bdbce314ce5b122ebaaf3bbee6ba79645 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Fri, 18 Feb 2022 20:41:39 +0000 Subject: [PATCH 068/100] Update util.h --- regamedll/dlls/util.h | 1 + 1 file changed, 1 insertion(+) diff --git a/regamedll/dlls/util.h b/regamedll/dlls/util.h index baeea3634..6c4f411c8 100644 --- a/regamedll/dlls/util.h +++ b/regamedll/dlls/util.h @@ -354,6 +354,7 @@ class CPlayerInVolumeAdapter }; int UTIL_CountPlayersInBrushVolume(bool bOnlyAlive, CBaseEntity *pBrushEntity, int &playersInCount, int &playersOutCount, CPlayerInVolumeAdapter *pAdapter = nullptr); +int UTIL_ManageClientsSolidity(bool bStore, int iSetMode, int iSolidityType, int iSolidityTypeArray[MAX_CLIENTS + 1] = nullptr); inline real_t UTIL_FixupAngle(real_t v) { From 04c306d9923cc107b0da0ebf9cb3c7fb0a5bb13c Mon Sep 17 00:00:00 2001 From: StevenKal Date: Fri, 18 Feb 2022 20:42:04 +0000 Subject: [PATCH 069/100] Update util.cpp --- regamedll/dlls/util.cpp | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/regamedll/dlls/util.cpp b/regamedll/dlls/util.cpp index 8385be350..79bd8c7d7 100644 --- a/regamedll/dlls/util.cpp +++ b/regamedll/dlls/util.cpp @@ -1853,3 +1853,43 @@ int UTIL_CountPlayersInBrushVolume(bool bOnlyAlive, CBaseEntity *pBrushEntity, i return playersInCount + playersOutCount; } + +// Set modes (iSetMode): +// 0 - Do not set solidity. +// 1 - Set solidity from the value of the variable "iSolidityType". +// 2 - Set solidity from the value of the array "iSolidityTypeArray". +int UTIL_ManageClientsSolidity(bool bStore, int iSetMode, int iSolidityType, int iSolidityTypeArray[MAX_CLIENTS + 1]) { + iSetMode = clamp(iSetMode, 0, 2); + + // Note: Can not store to array & set from it at the same time! Not made for such goal! + if(bStore && iSetMode == 2) { + iSetMode = 0; + } + else if(iSetMode == 0) + return 0; + + if(bStore) { + Q_memset(iSolidityTypeArray, SOLID_NOT, sizeof(iSolidityTypeArray)); + } + + int iClientsBitsFound = 0; + for(int iClientID = 1; iClientID <= gpGlobals->maxClients; iClientID++) + { + CBasePlayer *pPlayer = UTIL_PlayerByIndex(iClientID); + + if (!pPlayer || pPlayer->has_disconnected || !pPlayer->IsAlive()) + continue; + + if(bStore) { + iSolidityTypeArray[iClientID] = pPlayer->pev->solid; + } + + if(iSetMode) { + pPlayer->pev->solid = (iSetMode == 1) ? iSolidityType : iSolidityTypeArray[iClientID]; + } + + iClientsBitsFound |= (1<<(iClientID - 1)); + } + + return iClientsBitsFound; +} From 4fb5108372cf6980bc5bbb60a69130603b48f9ea Mon Sep 17 00:00:00 2001 From: StevenKal Date: Fri, 18 Feb 2022 20:42:27 +0000 Subject: [PATCH 070/100] Update player.cpp --- regamedll/dlls/player.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/regamedll/dlls/player.cpp b/regamedll/dlls/player.cpp index 8e9b9f14f..cccd7e5d9 100644 --- a/regamedll/dlls/player.cpp +++ b/regamedll/dlls/player.cpp @@ -7782,7 +7782,10 @@ void CBasePlayer::UpdateStatusBar() Vector vecSrc = EyePosition(); Vector vecEnd = vecSrc + (gpGlobals->v_forward * ((pev->flags & FL_SPECTATOR) != 0 ? MAX_SPEC_ID_RANGE : MAX_ID_RANGE)); + int iSolidityTypeArray[MAX_CLIENTS + 1]; + UTIL_ManageClientsSolidity(true, 1, SOLID_SLIDEBOX, iSolidityTypeArray); // Store in array & set solidity from variable. UTIL_TraceLine(vecSrc, vecEnd, dont_ignore_monsters, edict(), &tr); + UTIL_ManageClientsSolidity(false, 2, 0, iSolidityTypeArray); // Restore solidity from array. if (tr.flFraction != 1.0f) { From bafaedc67289f85b0a84dc9e56da45485ab1d592 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Fri, 18 Feb 2022 20:44:01 +0000 Subject: [PATCH 071/100] Update game.cpp --- regamedll/dlls/game.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/regamedll/dlls/game.cpp b/regamedll/dlls/game.cpp index bb4219f61..d999c0993 100644 --- a/regamedll/dlls/game.cpp +++ b/regamedll/dlls/game.cpp @@ -164,7 +164,7 @@ cvar_t sv_enablebunnyhopping = { "sv_enablebunnyhopping", "0", 0, 0. cvar_t plant_c4_anywhere = { "mp_plant_c4_anywhere", "0", 0, 0.0f, nullptr }; // Note: Just for my plugins & cie. -cvar_t game_version_personnal = { "game_version_personnal", "1.1.0-public-AMXModDev", FCVAR_SERVER, 0.0f, nullptr }; +cvar_t game_version_personnal = { "game_version_personnal", "1.2.0-public-AMXModDev", FCVAR_SERVER, 0.0f, nullptr }; void GameDLL_Version_f() { From 8fe97b3a15b42d146750e8038977577946dc98d6 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Sat, 19 Feb 2022 17:41:07 +0000 Subject: [PATCH 072/100] Update game.h --- regamedll/dlls/game.h | 1 + 1 file changed, 1 insertion(+) diff --git a/regamedll/dlls/game.h b/regamedll/dlls/game.h index f6dcb3216..0cf5f063d 100644 --- a/regamedll/dlls/game.h +++ b/regamedll/dlls/game.h @@ -48,6 +48,7 @@ extern cvar_t *g_psv_friction; extern cvar_t *g_psv_stopspeed; extern cvar_t *g_psv_stepsize; extern cvar_t *g_psv_clienttrace; +extern cvar_t *g_psv_zmax; extern cvar_t *g_footsteps; extern cvar_t displaysoundlist; From 1a42207e0d3c38ddc502bf99d9d65e062af9f671 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Sat, 19 Feb 2022 17:42:00 +0000 Subject: [PATCH 073/100] Update game.cpp --- regamedll/dlls/game.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/regamedll/dlls/game.cpp b/regamedll/dlls/game.cpp index d999c0993..efcc1e363 100644 --- a/regamedll/dlls/game.cpp +++ b/regamedll/dlls/game.cpp @@ -9,6 +9,7 @@ cvar_t *g_psv_friction = nullptr; cvar_t *g_psv_stopspeed = nullptr; cvar_t *g_psv_stepsize = nullptr; cvar_t *g_psv_clienttrace = nullptr; +cvar_t *g_psv_zmax = nullptr; cvar_t displaysoundlist = { "displaysoundlist", "0", 0, 0.0f, nullptr }; cvar_t timelimit = { "mp_timelimit", "0", FCVAR_SERVER, 0.0f, nullptr }; @@ -217,6 +218,7 @@ void EXT_FUNC GameDLLInit() g_psv_stopspeed = CVAR_GET_POINTER("sv_stopspeed"); g_psv_stepsize = CVAR_GET_POINTER("sv_stepsize"); g_psv_clienttrace = CVAR_GET_POINTER("sv_clienttrace"); + g_psv_zmax = CVAR_GET_POINTER("sv_zmax"); CVAR_REGISTER(&displaysoundlist); CVAR_REGISTER(&timelimit); From f6892ab4ebf9de93560b611acec155174ded8be4 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Sat, 19 Feb 2022 17:45:22 +0000 Subject: [PATCH 074/100] Update player.cpp --- regamedll/dlls/player.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/regamedll/dlls/player.cpp b/regamedll/dlls/player.cpp index cccd7e5d9..866735806 100644 --- a/regamedll/dlls/player.cpp +++ b/regamedll/dlls/player.cpp @@ -7780,7 +7780,7 @@ void CBasePlayer::UpdateStatusBar() UTIL_MakeVectors(pev->v_angle + pev->punchangle); Vector vecSrc = EyePosition(); - Vector vecEnd = vecSrc + (gpGlobals->v_forward * ((pev->flags & FL_SPECTATOR) != 0 ? MAX_SPEC_ID_RANGE : MAX_ID_RANGE)); + Vector vecEnd = vecSrc + (gpGlobals->v_forward * (g_psv_zmax ? g_psv_zmax->value : ((pev->flags & FL_SPECTATOR) != 0 ? MAX_SPEC_ID_RANGE : MAX_ID_RANGE))); int iSolidityTypeArray[MAX_CLIENTS + 1]; UTIL_ManageClientsSolidity(true, 1, SOLID_SLIDEBOX, iSolidityTypeArray); // Store in array & set solidity from variable. From e6019b570be934182fcd59d6c220cb4c8c7d25b8 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Wed, 13 Apr 2022 01:17:41 +0000 Subject: [PATCH 075/100] Update weapons.cpp --- regamedll/dlls/weapons.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/regamedll/dlls/weapons.cpp b/regamedll/dlls/weapons.cpp index 7b2e0e566..7df0f75bf 100644 --- a/regamedll/dlls/weapons.cpp +++ b/regamedll/dlls/weapons.cpp @@ -587,11 +587,12 @@ void CBasePlayerItem::DefaultTouch(CBaseEntity *pOther) CBasePlayer *pPlayer = static_cast(pOther); if (pPlayer->m_bIsVIP - && m_iId != WEAPON_USP - && m_iId != WEAPON_GLOCK18 - && m_iId != WEAPON_P228 - && m_iId != WEAPON_DEAGLE - && m_iId != WEAPON_KNIFE) + && m_iId != WEAPON_USP + && m_iId != WEAPON_GLOCK18 + && m_iId != WEAPON_P228 + && m_iId != WEAPON_FIVESEVEN // Gun added. + && m_iId != WEAPON_DEAGLE + && m_iId != WEAPON_KNIFE) { return; } From 4b6776f3273e07e2d8278a90fadc08c9204316e9 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Wed, 13 Apr 2022 01:20:00 +0000 Subject: [PATCH 076/100] Update healthkit.cpp --- regamedll/dlls/healthkit.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/regamedll/dlls/healthkit.cpp b/regamedll/dlls/healthkit.cpp index 5a49e4832..69b3b1f0f 100644 --- a/regamedll/dlls/healthkit.cpp +++ b/regamedll/dlls/healthkit.cpp @@ -106,6 +106,12 @@ void CWallHealth::Spawn() #ifdef REGAMEDLL_FIXES void CWallHealth::Restart() { + // Stop looping sound. + if (m_iOn > 1) + STOP_SOUND(ENT(pev), CHAN_STATIC, "items/medcharge4.wav"); + + m_iOn = 0; + pev->solid = SOLID_BSP; pev->movetype = MOVETYPE_PUSH; @@ -196,7 +202,10 @@ void CWallHealth::Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE us void CWallHealth::Recharge() { - EMIT_SOUND(ENT(pev), CHAN_ITEM, "items/medshot4.wav", VOL_NORM, ATTN_NORM); + if(pev->frame == 1.0f) + { + EMIT_SOUND(ENT(pev), CHAN_ITEM, "items/medshot4.wav", VOL_NORM, ATTN_NORM); + } int healthValue = (int)gSkillData.healthchargerCapacity; #ifdef REGAMEDLL_FIXES From f2f376080840995b4ef593a11aca74e82dcd0b3a Mon Sep 17 00:00:00 2001 From: StevenKal Date: Wed, 13 Apr 2022 01:21:13 +0000 Subject: [PATCH 077/100] Update h_battery.cpp --- regamedll/dlls/h_battery.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/regamedll/dlls/h_battery.cpp b/regamedll/dlls/h_battery.cpp index f46b86057..9989fe8ff 100644 --- a/regamedll/dlls/h_battery.cpp +++ b/regamedll/dlls/h_battery.cpp @@ -59,6 +59,12 @@ void CRecharge::Spawn() #ifdef REGAMEDLL_FIXES void CRecharge::Restart() { + // Stop looping sound. + if (m_iOn > 1) + STOP_SOUND(ENT(pev), CHAN_STATIC, "items/suitcharge1.wav"); + + m_iOn = 0; + pev->solid = SOLID_BSP; pev->movetype = MOVETYPE_PUSH; @@ -174,6 +180,11 @@ void CRecharge::Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useT void CRecharge::Recharge() { + if(pev->frame == 1.0f) + { + EMIT_SOUND(ENT(pev), CHAN_ITEM, "items/suitchargeok1.wav", 0.85, ATTN_NORM); + } + int armorValue = (int)gSkillData.suitchargerCapacity; #ifdef REGAMEDLL_FIXES if (pev->armorvalue != 0.0f) { From c61aa4dd8177e7bd89843df1287a7609e2549567 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Wed, 13 Apr 2022 01:24:19 +0000 Subject: [PATCH 078/100] Update items.cpp --- regamedll/dlls/items.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/regamedll/dlls/items.cpp b/regamedll/dlls/items.cpp index f6caf00e6..89d36708e 100644 --- a/regamedll/dlls/items.cpp +++ b/regamedll/dlls/items.cpp @@ -342,6 +342,8 @@ BOOL CItemLongJump::MyTouch(CBasePlayer *pPlayer) pPlayer->m_fLongJump = TRUE; SET_PHYSICS_KEY_VALUE(pPlayer->edict(), "slj", "1"); + EMIT_SOUND(pPlayer->edict(), CHAN_ITEM, "items/gunpickup2.wav", VOL_NORM, ATTN_NORM); + MESSAGE_BEGIN(MSG_ONE, gmsgItemPickup, nullptr, pPlayer->pev); WRITE_STRING(STRING(pev->classname)); MESSAGE_END(); From 76d3cb16898ea6794b82912d22265152c2107368 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Wed, 13 Apr 2022 01:29:10 +0000 Subject: [PATCH 079/100] Update items.h --- regamedll/dlls/items.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/regamedll/dlls/items.h b/regamedll/dlls/items.h index fd8f3e717..8afa27b17 100644 --- a/regamedll/dlls/items.h +++ b/regamedll/dlls/items.h @@ -91,6 +91,8 @@ class CItem: public CBaseEntity { public: virtual void Spawn(); + virtual void Restart(); + virtual int ObjectCaps() { return (CBaseEntity::ObjectCaps() | FCAP_MUST_RESET); } virtual CBaseEntity *Respawn(); virtual BOOL MyTouch(CBasePlayer *pPlayer) { return FALSE; } From a27feb4b31e06d1d6b2153757d2f90bea61ae4ae Mon Sep 17 00:00:00 2001 From: StevenKal Date: Wed, 13 Apr 2022 01:32:56 +0000 Subject: [PATCH 080/100] Update items.cpp --- regamedll/dlls/items.cpp | 40 +++++++++++++++++++++++++++++++++------- 1 file changed, 33 insertions(+), 7 deletions(-) diff --git a/regamedll/dlls/items.cpp b/regamedll/dlls/items.cpp index 89d36708e..30731316e 100644 --- a/regamedll/dlls/items.cpp +++ b/regamedll/dlls/items.cpp @@ -104,6 +104,8 @@ void CItem::Spawn() UTIL_Remove(this); return; } + + pev->oldorigin = pev->origin; } void CItem::ItemTouch(CBaseEntity *pOther) @@ -129,6 +131,30 @@ void CItem::ItemTouch(CBaseEntity *pOther) } } +void CItem::Restart() +{ + pev->movetype = MOVETYPE_TOSS; + pev->solid = SOLID_TRIGGER; + + if(pev->origin != pev->oldorigin) + { + UTIL_SetOrigin(pev, pev->oldorigin); + UTIL_SetSize(pev, Vector(-16, -16, 0), Vector(16, 16, 16)); + + if (!DROP_TO_FLOOR(ENT(pev))) + { + UTIL_Remove(this); + return; + } + } + + if(pev->effects & EF_NODRAW) + { + SetThink(&CItem::Materialize); + pev->nextthink = gpGlobals->time; + } +} + CBaseEntity *CItem::Respawn() { SetTouch(nullptr); @@ -375,8 +401,6 @@ BOOL CItemKevlar::MyTouch(CBasePlayer *pPlayer) #ifdef REGAMEDLL_ADD if (!g_bItemCreatedByBuying && pPlayer->HasRestrictItem(ITEM_KEVLAR, ITEM_TYPE_TOUCHED)) return FALSE; - - g_bItemCreatedByBuying = false; #endif #ifdef REGAMEDLL_FIXES @@ -402,11 +426,13 @@ BOOL CItemKevlar::MyTouch(CBasePlayer *pPlayer) #endif MESSAGE_END(); - if (TheTutor) + if (TheTutor && g_bItemCreatedByBuying) { TheTutor->OnEvent(EVENT_PLAYER_BOUGHT_SOMETHING, pPlayer); } + g_bItemCreatedByBuying = false; + return TRUE; } @@ -429,8 +455,6 @@ BOOL CItemAssaultSuit::MyTouch(CBasePlayer *pPlayer) #ifdef REGAMEDLL_ADD if (!g_bItemCreatedByBuying && pPlayer->HasRestrictItem(ITEM_ASSAULT, ITEM_TYPE_TOUCHED)) return FALSE; - - g_bItemCreatedByBuying = false; #endif #ifdef REGAMEDLL_FIXES @@ -451,11 +475,13 @@ BOOL CItemAssaultSuit::MyTouch(CBasePlayer *pPlayer) WRITE_BYTE(1); // 0 = ARMOR_KEVLAR, 1 = ARMOR_VESTHELM MESSAGE_END(); - if (TheTutor) + if (TheTutor && g_bItemCreatedByBuying) { TheTutor->OnEvent(EVENT_PLAYER_BOUGHT_SOMETHING, pPlayer); } + g_bItemCreatedByBuying = false; + return TRUE; } @@ -499,7 +525,7 @@ BOOL CItemThighPack::MyTouch(CBasePlayer *pPlayer) pPlayer->SendItemStatus(); EMIT_SOUND(pPlayer->edict(), CHAN_VOICE, "items/kevlar.wav", VOL_NORM, ATTN_NORM); - if (TheTutor) + if (TheTutor && g_bItemCreatedByBuying) { TheTutor->OnEvent(EVENT_PLAYER_BOUGHT_SOMETHING, pPlayer); } From 8a976c667f31e5fd1ae1d1bbc729979d465c6f38 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Wed, 13 Apr 2022 01:34:15 +0000 Subject: [PATCH 081/100] Update game.cpp --- regamedll/dlls/game.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/regamedll/dlls/game.cpp b/regamedll/dlls/game.cpp index efcc1e363..23c418321 100644 --- a/regamedll/dlls/game.cpp +++ b/regamedll/dlls/game.cpp @@ -165,7 +165,7 @@ cvar_t sv_enablebunnyhopping = { "sv_enablebunnyhopping", "0", 0, 0. cvar_t plant_c4_anywhere = { "mp_plant_c4_anywhere", "0", 0, 0.0f, nullptr }; // Note: Just for my plugins & cie. -cvar_t game_version_personnal = { "game_version_personnal", "1.2.0-public-AMXModDev", FCVAR_SERVER, 0.0f, nullptr }; +cvar_t game_version_personnal = { "game_version_personnal", "1.3.0-public-AMXModDev", FCVAR_SERVER, 0.0f, nullptr }; void GameDLL_Version_f() { From 302f62b2656098e5017a1231669ee16b737714f7 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Wed, 13 Apr 2022 01:39:50 +0000 Subject: [PATCH 082/100] Update weapons.cpp --- regamedll/dlls/weapons.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/regamedll/dlls/weapons.cpp b/regamedll/dlls/weapons.cpp index 7df0f75bf..b395069c8 100644 --- a/regamedll/dlls/weapons.cpp +++ b/regamedll/dlls/weapons.cpp @@ -590,7 +590,7 @@ void CBasePlayerItem::DefaultTouch(CBaseEntity *pOther) && m_iId != WEAPON_USP && m_iId != WEAPON_GLOCK18 && m_iId != WEAPON_P228 - && m_iId != WEAPON_FIVESEVEN // Gun added. + && m_iId != WEAPON_FIVESEVEN && m_iId != WEAPON_DEAGLE && m_iId != WEAPON_KNIFE) { From 44703a909546eb37fec9e8a3377e926b35c39bc5 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Thu, 21 Apr 2022 08:52:20 +0000 Subject: [PATCH 083/100] Remove stupid changes of vaqtincha's arrogant dumb shithead & stupid approver s1lentq. --- regamedll/dlls/player.cpp | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/regamedll/dlls/player.cpp b/regamedll/dlls/player.cpp index 19814879b..a804448c8 100644 --- a/regamedll/dlls/player.cpp +++ b/regamedll/dlls/player.cpp @@ -8428,13 +8428,7 @@ void CStripWeapons::Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE { if (m_iszSpecialItem) { - const char *weaponName = STRING(m_iszSpecialItem); - WeaponSlotInfo *slotInfo = GetWeaponSlot(weaponName); - - if (slotInfo != nullptr && slotInfo->slot == GRENADE_SLOT) - pPlayer->CSPlayer()->RemovePlayerItemEx(weaponName, true); - else - pPlayer->CSPlayer()->RemovePlayerItem(weaponName); + pPlayer->CSPlayer()->RemovePlayerItem(STRING(m_iszSpecialItem)); } for (int slot = PRIMARY_WEAPON_SLOT; slot <= ALL_OTHER_ITEMS; slot++) @@ -8444,22 +8438,17 @@ void CStripWeapons::Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE if (slot == ALL_OTHER_ITEMS) { - pPlayer->CSPlayer()->RemovePlayerItem("item_thighpack"); - pPlayer->CSPlayer()->RemovePlayerItem("item_longjump"); - pPlayer->CSPlayer()->RemovePlayerItem("item_assaultsuit"); pPlayer->CSPlayer()->RemovePlayerItem("item_kevlar"); + pPlayer->CSPlayer()->RemovePlayerItem("item_assaultsuit"); pPlayer->CSPlayer()->RemovePlayerItem("item_thighpack"); + pPlayer->CSPlayer()->RemovePlayerItem("item_longjump"); pPlayer->CSPlayer()->RemovePlayerItem("weapon_shield"); } else { pPlayer->ForEachItem(slot, [pPlayer](CBasePlayerItem *pItem) { - if (pItem->iItemSlot() == GRENADE_SLOT) - pPlayer->CSPlayer()->RemovePlayerItemEx(STRING(pItem->pev->classname), true); - else - pPlayer->CSPlayer()->RemovePlayerItem(STRING(pItem->pev->classname)); - + pPlayer->CSPlayer()->RemovePlayerItem(STRING(pItem->pev->classname)); return false; }); } From 95da7c0d4f4ebc5a3ba4ec7ee7905dd196339bba Mon Sep 17 00:00:00 2001 From: StevenKal Date: Thu, 21 Apr 2022 08:55:17 +0000 Subject: [PATCH 084/100] No sound spam emitted around new round... --- regamedll/dlls/h_battery.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/regamedll/dlls/h_battery.cpp b/regamedll/dlls/h_battery.cpp index 9989fe8ff..49a0ee391 100644 --- a/regamedll/dlls/h_battery.cpp +++ b/regamedll/dlls/h_battery.cpp @@ -180,7 +180,7 @@ void CRecharge::Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useT void CRecharge::Recharge() { - if(pev->frame == 1.0f) + if(pev->frame == 1.0f && (!CSGameRules() || CSGameRules()->GetRoundElapsedTime() >= 0.20f)) { EMIT_SOUND(ENT(pev), CHAN_ITEM, "items/suitchargeok1.wav", 0.85, ATTN_NORM); } From aece586d5c03ed7d8dbeec0c375a83e27e4437c2 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Thu, 21 Apr 2022 08:55:49 +0000 Subject: [PATCH 085/100] No sound spam emitted around new round... --- regamedll/dlls/healthkit.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/regamedll/dlls/healthkit.cpp b/regamedll/dlls/healthkit.cpp index 69b3b1f0f..c65027da6 100644 --- a/regamedll/dlls/healthkit.cpp +++ b/regamedll/dlls/healthkit.cpp @@ -202,7 +202,7 @@ void CWallHealth::Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE us void CWallHealth::Recharge() { - if(pev->frame == 1.0f) + if(pev->frame == 1.0f && (!CSGameRules() || CSGameRules()->GetRoundElapsedTime() >= 0.20f)) { EMIT_SOUND(ENT(pev), CHAN_ITEM, "items/medshot4.wav", VOL_NORM, ATTN_NORM); } From 190c03b0e218db063072d8786f13c2a8de53df63 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Thu, 21 Apr 2022 08:56:45 +0000 Subject: [PATCH 086/100] No sound spam emitted around new round... --- regamedll/dlls/items.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/regamedll/dlls/items.cpp b/regamedll/dlls/items.cpp index 30731316e..096f948f2 100644 --- a/regamedll/dlls/items.cpp +++ b/regamedll/dlls/items.cpp @@ -175,7 +175,10 @@ void CItem::Materialize() if (pev->effects & EF_NODRAW) { // changing from invisible state to visible. - EMIT_SOUND_DYN(ENT(pev), CHAN_WEAPON, "items/suitchargeok1.wav", VOL_NORM, ATTN_NORM, 0, 150); + if(!CSGameRules() || CSGameRules()->GetRoundElapsedTime() >= 0.10f) + { + EMIT_SOUND_DYN(ENT(pev), CHAN_WEAPON, "items/suitchargeok1.wav", VOL_NORM, ATTN_NORM, 0, 150); + } pev->effects &= ~EF_NODRAW; pev->effects |= EF_MUZZLEFLASH; From 6d4db8d423592c004bad0d7033d3271154da1a42 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Thu, 21 Apr 2022 09:19:50 +0000 Subject: [PATCH 087/100] Remove test demos not succeed for "I do not know why!". --- .github/workflows/build.yml | 69 +------------------------------------ 1 file changed, 1 insertion(+), 68 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ca1c0f7df..1b3d0bf29 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -71,73 +71,6 @@ jobs: name: win32 path: publish/* - testdemos: - name: 'Test demos' - runs-on: ubuntu-latest - container: s1lentq/testdemos:latest - needs: [windows] - - env: - WINEDEBUG: -all - WINEDLLOVERRIDES: mshtml= - - defaults: - run: - shell: bash - working-directory: ../../../opt/HLDS - - steps: - - name: Deploying windows artifacts - uses: actions/download-artifact@v2 - with: - name: win32 - - - name: Play demos - run: | - chown root ~ - rsync -a deps/regamedll/* . - mv $GITHUB_WORKSPACE/tests/mp.dll cstrike/dlls/mp.dll - - descs=( - "CS: Testing jumping, scenarios, shooting etc" - ) - - demos=( - "cstrike-basic-1" - ) - - retVal=0 - for i in "${!demos[@]}"; do - params=$(cat "testdemos/${demos[i]}.params") - - echo -e "\e[1m[$((i + 1))/${#demos[@]}] \e[1;36m${descs[i]} testing...\e[0m" - echo -e " - \e[0;33mParameters $params\e[0m" - - wine hlds.exe --rehlds-enable-all-hooks --rehlds-test-play "testdemos/${demos[i]}.bin" $params &> result.log || retVal=$? - - if [ $retVal -ne 777 ] && [ $retVal -ne 9 ]; then - # Print with catchy messages - while read line; do - echo -e " \e[0;33m$line" - done <<< $(cat result.log | sed '0,/demo failed/I!d;/wine:/d;/./,$!d') - - echo " 🔸 🔸 🔸 🔸 🔸 🔸 🔸 🔸 🔸 🔸" - while read line; do - echo -e " \e[1;31m$line"; - done < rehlds_demo_error.txt - echo -e " \e[30;41mExit code: $retVal\e[0m" - echo -e "\e[1m[$((i + 1))/${#demos[@]}] \e[1;36m${descs[i]} testing...\e[1;31m Failed ❌" - exit 6 # Test demo failed - else - # Print result HLDS console - while read line; do - echo -e " \e[0;33m$line" - done <<< $(cat result.log | sed '/wine:/d;/./,$!d') - echo -e " \e[30;43mExit code: $retVal\e[0m" - echo -e "\e[1m[$((i + 1))/${#demos[@]}] \e[1;36m${descs[i]} testing...\e[1;32m Succeed ✔" - fi - done - linux: name: 'Linux' runs-on: ubuntu-latest @@ -222,7 +155,7 @@ jobs: publish: name: 'Publish' runs-on: ubuntu-latest - needs: [windows, testdemos, linux] + needs: [windows, linux] steps: - name: Deploying linux artifacts From 2d69ff7ae8ef4816dac17fe6f636162824062d47 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Sat, 23 Apr 2022 10:45:54 +0000 Subject: [PATCH 088/100] Healthkit: Allow to set a custom model before call of "pfnSpawn". --- regamedll/dlls/healthkit.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/regamedll/dlls/healthkit.cpp b/regamedll/dlls/healthkit.cpp index c65027da6..b87f58022 100644 --- a/regamedll/dlls/healthkit.cpp +++ b/regamedll/dlls/healthkit.cpp @@ -5,14 +5,16 @@ LINK_ENTITY_TO_CLASS(item_healthkit, CHealthKit, CCSHealthKit) void CHealthKit::Spawn() { Precache(); - SET_MODEL(ENT(pev), "models/w_medkit.mdl"); - CItem::Spawn(); } void CHealthKit::Precache() { - PRECACHE_MODEL("models/w_medkit.mdl"); + if(pev->model.IsNullOrEmpty()) + { + pev->model = ALLOC_STRING("models/w_medkit.mdl"); + } + PRECACHE_MODEL(pev->model); PRECACHE_SOUND("items/smallmedkit1.wav"); } From 946c2a054edb5613052a368f8644d176e25041a2 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Sat, 23 Apr 2022 10:46:40 +0000 Subject: [PATCH 089/100] Items: Allow to set a custom model before call of "pfnSpawn". --- regamedll/dlls/items.cpp | 124 +++++++++++++++++++++------------------ 1 file changed, 67 insertions(+), 57 deletions(-) diff --git a/regamedll/dlls/items.cpp b/regamedll/dlls/items.cpp index 096f948f2..cb3caba10 100644 --- a/regamedll/dlls/items.cpp +++ b/regamedll/dlls/items.cpp @@ -97,9 +97,14 @@ void CItem::Spawn() UTIL_SetOrigin(pev, pev->origin); UTIL_SetSize(pev, Vector(-16, -16, 0), Vector(16, 16, 16)); + if(pev->model) + { + SET_MODEL(ENT(pev), pev->model); + } + SetTouch(&CItem::ItemTouch); - if (!DROP_TO_FLOOR(ENT(pev))) + if (DROP_TO_FLOOR(ENT(pev)) <= 0) { UTIL_Remove(this); return; @@ -108,29 +113,6 @@ void CItem::Spawn() pev->oldorigin = pev->origin; } -void CItem::ItemTouch(CBaseEntity *pOther) -{ - if (!pOther->IsPlayer() || pOther->pev->deadflag != DEAD_NO) - return; - - CBasePlayer *pPlayer = static_cast(pOther); - - if (!g_pGameRules->CanHaveItem(pPlayer, this)) - return; - - if (MyTouch(pPlayer)) - { - SUB_UseTargets(pOther, USE_TOGGLE, 0); - SetTouch(nullptr); - g_pGameRules->PlayerGotItem(pPlayer, this); - - if (g_pGameRules->ItemShouldRespawn(this) == GR_ITEM_RESPAWN_YES) - Respawn(); - else - UTIL_Remove(this); - } -} - void CItem::Restart() { pev->movetype = MOVETYPE_TOSS; @@ -141,7 +123,7 @@ void CItem::Restart() UTIL_SetOrigin(pev, pev->oldorigin); UTIL_SetSize(pev, Vector(-16, -16, 0), Vector(16, 16, 16)); - if (!DROP_TO_FLOOR(ENT(pev))) + if (DROP_TO_FLOOR(ENT(pev)) <= 0) { UTIL_Remove(this); return; @@ -155,6 +137,29 @@ void CItem::Restart() } } +void CItem::ItemTouch(CBaseEntity *pOther) +{ + if (!pOther->IsPlayer() || pOther->pev->deadflag != DEAD_NO) + return; + + CBasePlayer *pPlayer = static_cast(pOther); + + if (!g_pGameRules->CanHaveItem(pPlayer, this)) + return; + + if (MyTouch(pPlayer)) + { + SUB_UseTargets(pOther, USE_TOGGLE, 0); + SetTouch(nullptr); + g_pGameRules->PlayerGotItem(pPlayer, this); + + if (g_pGameRules->ItemShouldRespawn(this) == GR_ITEM_RESPAWN_YES) + Respawn(); + else + UTIL_Remove(this); + } +} + CBaseEntity *CItem::Respawn() { SetTouch(nullptr); @@ -190,13 +195,16 @@ void CItem::Materialize() void CItemSuit::Spawn() { Precache(); - SET_MODEL(ENT(pev), "models/w_kevlar.mdl"); CItem::Spawn(); } void CItemSuit::Precache() { - PRECACHE_MODEL("models/w_kevlar.mdl"); + if(pev->model.IsNullOrEmpty()) + { + pev->model = ALLOC_STRING("models/w_kevlar.mdl"); + } + PRECACHE_MODEL(pev->model); PRECACHE_SOUND("items/tr_kevlar.wav"); } @@ -218,13 +226,16 @@ LINK_ENTITY_TO_CLASS(item_suit, CItemSuit, CCSItemSuit) void CItemBattery::Spawn() { Precache(); - SET_MODEL(ENT(pev), "models/w_battery.mdl"); CItem::Spawn(); } void CItemBattery::Precache() { - PRECACHE_MODEL("models/w_battery.mdl"); + if(pev->model.IsNullOrEmpty()) + { + pev->model = ALLOC_STRING("models/w_battery.mdl")); + } + PRECACHE_MODEL(pev->model); PRECACHE_SOUND("items/gunpickup2.wav"); } @@ -280,13 +291,16 @@ LINK_ENTITY_TO_CLASS(item_battery, CItemBattery, CCSItemBattery) void CItemAntidote::Spawn() { Precache(); - SET_MODEL(ENT(pev), "models/w_antidote.mdl"); CItem::Spawn(); } void CItemAntidote::Precache() { - PRECACHE_MODEL("models/w_antidote.mdl"); + if(pev->model.IsNullOrEmpty()) + { + pev->model = ALLOC_STRING("models/w_antidote.mdl"); + } + PRECACHE_MODEL(pev->model); } BOOL CItemAntidote::MyTouch(CBasePlayer *pPlayer) @@ -307,31 +321,15 @@ LINK_ENTITY_TO_CLASS(item_antidote, CItemAntidote, CCSItemAntidote) void CItemSecurity::Spawn() { Precache(); - - if (pev->model.IsNullOrEmpty()) - { - // default model - SET_MODEL(ENT(pev), "models/w_security.mdl"); - } - else - { - // custom model - SET_MODEL(ENT(pev), pev->model); - } - CItem::Spawn(); } void CItemSecurity::Precache() { - if (pev->model.IsNullOrEmpty()) + if(pev->model.IsNullOrEmpty()) { - // default model - PRECACHE_MODEL("models/w_security.mdl"); - return; + pev->model = ALLOC_STRING("models/w_security.mdl"); } - - // custom model PRECACHE_MODEL(pev->model); } @@ -346,13 +344,16 @@ LINK_ENTITY_TO_CLASS(item_security, CItemSecurity, CCSItemSecurity) void CItemLongJump::Spawn() { Precache(); - SET_MODEL(ENT(pev), "models/w_longjump.mdl"); CItem::Spawn(); } void CItemLongJump::Precache() { - PRECACHE_MODEL("models/w_longjump.mdl"); + if(pev->model.IsNullOrEmpty()) + { + pev->model = ALLOC_STRING("models/w_longjump.mdl"); + } + PRECACHE_MODEL(pev->model); } BOOL CItemLongJump::MyTouch(CBasePlayer *pPlayer) @@ -390,13 +391,16 @@ LINK_ENTITY_TO_CLASS(item_longjump, CItemLongJump, CCSItemLongJump) void CItemKevlar::Spawn() { Precache(); - SET_MODEL(ENT(pev), "models/w_kevlar.mdl"); CItem::Spawn(); } void CItemKevlar::Precache() { - PRECACHE_MODEL("models/w_kevlar.mdl"); + if(pev->model.IsNullOrEmpty()) + { + pev->model = ALLOC_STRING("models/w_kevlar.mdl"); + } + PRECACHE_MODEL(pev->model); } BOOL CItemKevlar::MyTouch(CBasePlayer *pPlayer) @@ -444,13 +448,16 @@ LINK_ENTITY_TO_CLASS(item_kevlar, CItemKevlar, CCSItemKevlar) void CItemAssaultSuit::Spawn() { Precache(); - SET_MODEL(ENT(pev), "models/w_assault.mdl"); CItem::Spawn(); } void CItemAssaultSuit::Precache() { - PRECACHE_MODEL("models/w_assault.mdl"); + if(pev->model.IsNullOrEmpty()) + { + pev->model = ALLOC_STRING("models/w_assault.mdl"); + } + PRECACHE_MODEL(pev->model); } BOOL CItemAssaultSuit::MyTouch(CBasePlayer *pPlayer) @@ -493,13 +500,16 @@ LINK_ENTITY_TO_CLASS(item_assaultsuit, CItemAssaultSuit, CCSItemAssaultSuit) void CItemThighPack::Spawn() { Precache(); - SET_MODEL(ENT(pev), "models/w_thighpack.mdl"); CItem::Spawn(); } void CItemThighPack::Precache() { - PRECACHE_MODEL("models/w_thighpack.mdl"); + if(pev->model.IsNullOrEmpty()) + { + pev->model = ALLOC_STRING("models/w_thighpack.mdl"); + } + PRECACHE_MODEL(pev->model); } BOOL CItemThighPack::MyTouch(CBasePlayer *pPlayer) From f6295d268fa64ebcf53e53d282f93f99b39d6543 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Sat, 23 Apr 2022 10:50:04 +0000 Subject: [PATCH 090/100] Update items.cpp --- regamedll/dlls/items.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/regamedll/dlls/items.cpp b/regamedll/dlls/items.cpp index cb3caba10..9f122830c 100644 --- a/regamedll/dlls/items.cpp +++ b/regamedll/dlls/items.cpp @@ -233,7 +233,7 @@ void CItemBattery::Precache() { if(pev->model.IsNullOrEmpty()) { - pev->model = ALLOC_STRING("models/w_battery.mdl")); + pev->model = ALLOC_STRING("models/w_battery.mdl"); } PRECACHE_MODEL(pev->model); PRECACHE_SOUND("items/gunpickup2.wav"); From 33a3bc405bba71d5c1c4b31c05c9cab8865b63cb Mon Sep 17 00:00:00 2001 From: StevenKal Date: Sun, 1 May 2022 11:03:55 +0000 Subject: [PATCH 091/100] Update player.cpp --- regamedll/dlls/player.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/regamedll/dlls/player.cpp b/regamedll/dlls/player.cpp index a804448c8..3a6641b5a 100644 --- a/regamedll/dlls/player.cpp +++ b/regamedll/dlls/player.cpp @@ -6277,7 +6277,7 @@ void CBasePlayer::FlashlightTurnOn() WRITE_BYTE(m_iFlashBattery); MESSAGE_END(); - m_flFlashLightTime = gpGlobals->time + FLASH_DRAIN_TIME; + m_flFlashLightTime = gpGlobals->time + gSkillData.flFlashLightDrainTime; } } @@ -6291,7 +6291,7 @@ void CBasePlayer::FlashlightTurnOff() WRITE_BYTE(m_iFlashBattery); MESSAGE_END(); - m_flFlashLightTime = gpGlobals->time + FLASH_CHARGE_TIME; + m_flFlashLightTime = gpGlobals->time + gSkillData.flFlashLightChargeTime; } // When recording a demo, we need to have the server tell us the entire client state so that the client side .dll can behave correctly. @@ -7321,7 +7321,7 @@ void EXT_FUNC CBasePlayer::__API_HOOK(UpdateClientData)() { if (m_iFlashBattery) { - m_flFlashLightTime = gpGlobals->time + FLASH_DRAIN_TIME; + m_flFlashLightTime = gpGlobals->time + gSkillData.flFlashLightDrainTime; if (--m_iFlashBattery <= 0) { @@ -7333,7 +7333,7 @@ void EXT_FUNC CBasePlayer::__API_HOOK(UpdateClientData)() { if (m_iFlashBattery < 100) { - m_flFlashLightTime = gpGlobals->time + FLASH_CHARGE_TIME; + m_flFlashLightTime = gpGlobals->time + gSkillData.flFlashLightChargeTime; m_iFlashBattery++; } else From d0eada9754eb4d12eecbed558906e3f64e731f56 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Sun, 1 May 2022 11:03:57 +0000 Subject: [PATCH 092/100] Update skill.h --- regamedll/dlls/skill.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/regamedll/dlls/skill.h b/regamedll/dlls/skill.h index 23fda28c9..a2f19dc1c 100644 --- a/regamedll/dlls/skill.h +++ b/regamedll/dlls/skill.h @@ -49,6 +49,10 @@ struct skilldata_t float batteryCapacity; float healthchargerCapacity; float healthkitCapacity; + + // Extended for own purpose. + float flFlashLightDrainTime; + float flFlashLightChargeTime; }; extern skilldata_t gSkillData; From adf793e229edc1425950fbd9b5da391987f51e35 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Sun, 1 May 2022 11:04:02 +0000 Subject: [PATCH 093/100] Update gamerules.cpp --- regamedll/dlls/gamerules.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/regamedll/dlls/gamerules.cpp b/regamedll/dlls/gamerules.cpp index d31e6b565..d5ad924d1 100644 --- a/regamedll/dlls/gamerules.cpp +++ b/regamedll/dlls/gamerules.cpp @@ -127,6 +127,10 @@ void CGameRules::RefreshSkillData() gSkillData.batteryCapacity = 15; gSkillData.healthchargerCapacity = 50; gSkillData.healthkitCapacity = 15; + + // Extended for own purpose. + gSkillData.flFlashLightDrainTime = FLASH_DRAIN_TIME; + gSkillData.flFlashLightChargeTime = FLASH_CHARGE_TIME; } LINK_HOOK_CHAIN2(CGameRules *, InstallGameRules) From 017a23738e1582886f0270b8800661bdadbc00fc Mon Sep 17 00:00:00 2001 From: StevenKal Date: Sat, 18 Mar 2023 12:45:34 +0100 Subject: [PATCH 094/100] [Personal v1] Merge last changes till commit #577. (#8) --- .github/workflows/build.yml | 18 ++++----- README.md | 2 + dist/game.cfg | 14 +++++++ regamedll/dlls/API/CAPI_Impl.cpp | 8 +++- regamedll/dlls/API/CAPI_Impl.h | 8 ++++ regamedll/dlls/API/CSPlayer.cpp | 24 ++++++++++-- regamedll/dlls/basemonster.h | 2 +- regamedll/dlls/bot/cs_bot_manager.cpp | 6 +-- regamedll/dlls/cbase.h | 2 +- regamedll/dlls/client.cpp | 33 +++++----------- regamedll/dlls/game.cpp | 4 ++ regamedll/dlls/game.h | 2 + regamedll/dlls/gamerules.cpp | 10 +++++ regamedll/dlls/gamerules.h | 2 + regamedll/dlls/multiplay_gamerules.cpp | 19 ++++++++++ regamedll/dlls/player.cpp | 44 +++++++++++++++++++--- regamedll/dlls/player.h | 1 + regamedll/dlls/training_gamerules.h | 1 + regamedll/dlls/util.cpp | 4 ++ regamedll/dlls/vehicle.cpp | 44 ++++++++++++++++++---- regamedll/dlls/weapons.cpp | 2 + regamedll/dlls/world.cpp | 5 +-- regamedll/dlls/wpn_shared/wpn_aug.cpp | 8 ++-- regamedll/dlls/wpn_shared/wpn_sg552.cpp | 8 ++-- regamedll/public/regamedll/API/CSPlayer.h | 9 ++++- regamedll/public/regamedll/regamedll_api.h | 9 +++++ 26 files changed, 219 insertions(+), 70 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1b3d0bf29..0f679f1e7 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -25,7 +25,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: fetch-depth: 0 @@ -38,7 +38,7 @@ jobs: - run: nuget restore '${{ env.solution }}' - name: Setup MSBuild - uses: microsoft/setup-msbuild@v1.0.2 + uses: microsoft/setup-msbuild@v1.1.3 with: vs-version: '16.8' @@ -66,19 +66,19 @@ jobs: move msvc\${{ env.buildRelease }}\mp.pdb publish\debug\mp.pdb - name: Deploy artifacts - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3.1.1 with: name: win32 path: publish/* linux: name: 'Linux' - runs-on: ubuntu-latest + runs-on: ubuntu-20.04 container: s1lentq/linux86buildtools:latest steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: fetch-depth: 0 submodules: true @@ -140,7 +140,7 @@ jobs: shell: bash - name: Deploy artifacts - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 id: upload-job with: name: linux32 @@ -154,17 +154,17 @@ jobs: publish: name: 'Publish' - runs-on: ubuntu-latest + runs-on: ubuntu-20.04 needs: [windows, linux] steps: - name: Deploying linux artifacts - uses: actions/download-artifact@v2 + uses: actions/download-artifact@v3 with: name: linux32 - name: Deploying windows artifacts - uses: actions/download-artifact@v2 + uses: actions/download-artifact@v3 with: name: win32 diff --git a/README.md b/README.md index 7e289f8d8..bf7408dac 100644 --- a/README.md +++ b/README.md @@ -105,6 +105,8 @@ This means that plugins that do binary code analysis (Orpheu for example) probab | sv_enablebunnyhopping | 0 | 0 | 1 | Allow player speed to exceed maximum running speed.
`0` disabled
`1` enabled | | mp_plant_c4_anywhere | 0 | 0 | 1 | When set, players can plant anywhere, not only in bombsites.
`0` disabled
`1` enabled | | mp_give_c4_frags | 3 | - | - | How many bonuses (frags) will get the player who defused or exploded the bomb. | +| mp_hostages_rescued_ratio | 1.0 | 0.0 | 1.0 | Ratio of hostages rescued to win the round. | +| mp_legacy_vehicle_block | 1 | 0 | 1 | Legacy func_vehicle behavior when blocked by another entity.
`0` New behavior
`1` Legacy behavior | ## How to install zBot for CS 1.6? diff --git a/dist/game.cfg b/dist/game.cfg index eb6f511ff..16a137f94 100644 --- a/dist/game.cfg +++ b/dist/game.cfg @@ -489,3 +489,17 @@ mp_plant_c4_anywhere 0 // // Default value: "3" mp_give_c4_frags 3 + +// Ratio of hostages rescued to win the round. +// +// Default value: "1.0" +mp_hostages_rescued_ratio "1.0" + +// Legacy func_vehicle behavior when blocked by another entity. +// New one is more useful for playing multiplayer. +// +// 0 - New behavior +// 1 - Legacy behavior +// +// Default value: "1" +mp_legacy_vehicle_block "1" diff --git a/regamedll/dlls/API/CAPI_Impl.cpp b/regamedll/dlls/API/CAPI_Impl.cpp index 47532642b..80f57e43e 100644 --- a/regamedll/dlls/API/CAPI_Impl.cpp +++ b/regamedll/dlls/API/CAPI_Impl.cpp @@ -74,7 +74,11 @@ ReGameFuncs_t g_ReGameApiFuncs = { PlantBomb_api, SpawnHeadGib_api, - SpawnRandomGibs_api + SpawnRandomGibs_api, + + UTIL_RestartOther, + UTIL_ResetEntities, + UTIL_RemoveOther, }; GAMEHOOK_REGISTRY(CBasePlayer_Spawn); @@ -207,6 +211,8 @@ GAMEHOOK_REGISTRY(CBasePlayer_Pain); GAMEHOOK_REGISTRY(CBasePlayer_DeathSound); GAMEHOOK_REGISTRY(CBasePlayer_JoiningThink); +GAMEHOOK_REGISTRY(FreeGameRules); + int CReGameApi::GetMajorVersion() { return REGAMEDLL_API_VERSION_MAJOR; } diff --git a/regamedll/dlls/API/CAPI_Impl.h b/regamedll/dlls/API/CAPI_Impl.h index 311f612ed..d33abdca8 100644 --- a/regamedll/dlls/API/CAPI_Impl.h +++ b/regamedll/dlls/API/CAPI_Impl.h @@ -641,6 +641,10 @@ typedef IHookChainRegistryClassImpl CReGameHookRegistry_CBase typedef IHookChainClassImpl CReGameHook_CBasePlayer_JoiningThink; typedef IHookChainRegistryClassImpl CReGameHookRegistry_CBasePlayer_JoiningThink; +// FreeGameRules hook +typedef IHookChainImpl CReGameHook_FreeGameRules; +typedef IHookChainRegistryImpl CReGameHookRegistry_FreeGameRules; + class CReGameHookchains: public IReGameHookchains { public: // CBasePlayer virtual @@ -774,6 +778,8 @@ class CReGameHookchains: public IReGameHookchains { CReGameHookRegistry_CBasePlayer_DeathSound m_CBasePlayer_DeathSound; CReGameHookRegistry_CBasePlayer_JoiningThink m_CBasePlayer_JoiningThink; + CReGameHookRegistry_FreeGameRules m_FreeGameRules; + public: virtual IReGameHookRegistry_CBasePlayer_Spawn *CBasePlayer_Spawn(); virtual IReGameHookRegistry_CBasePlayer_Precache *CBasePlayer_Precache(); @@ -904,6 +910,8 @@ class CReGameHookchains: public IReGameHookchains { virtual IReGameHookRegistry_CBasePlayer_Pain *CBasePlayer_Pain(); virtual IReGameHookRegistry_CBasePlayer_DeathSound *CBasePlayer_DeathSound(); virtual IReGameHookRegistry_CBasePlayer_JoiningThink *CBasePlayer_JoiningThink(); + + virtual IReGameHookRegistry_FreeGameRules *FreeGameRules(); }; C_DLLEXPORT CReGameHookchains g_ReGameHookchains; diff --git a/regamedll/dlls/API/CSPlayer.cpp b/regamedll/dlls/API/CSPlayer.cpp index dd5dda750..98f328b21 100644 --- a/regamedll/dlls/API/CSPlayer.cpp +++ b/regamedll/dlls/API/CSPlayer.cpp @@ -117,8 +117,10 @@ EXT_FUNC bool CCSPlayer::JoinTeam(TeamName team) if (pPlayer->pev->deadflag == DEAD_NO) { - ClientKill(pPlayer->edict()); - pPlayer->pev->frags++; + if (pPlayer->Kill()) + { + pPlayer->pev->frags++; + } } MESSAGE_BEGIN(MSG_ALL, gmsgScoreInfo); @@ -520,6 +522,21 @@ EXT_FUNC bool CCSPlayer::HintMessageEx(const char *pMessage, float duration, boo return BasePlayer()->HintMessageEx(pMessage, duration, bDisplayIfPlayerDead, bOverride); } +EXT_FUNC void CCSPlayer::Reset() +{ + BasePlayer()->Reset(); +} + +EXT_FUNC void CCSPlayer::OnSpawnEquip(bool addDefault, bool equipGame) +{ + BasePlayer()->OnSpawnEquip(addDefault, equipGame); +} + +EXT_FUNC void CCSPlayer::SetScoreboardAttributes(CBasePlayer *destination) +{ + BasePlayer()->SetScoreboardAttributes(destination); +} + EXT_FUNC bool CCSPlayer::CheckActivityInGame() { const CBasePlayer* pPlayer = BasePlayer(); @@ -532,7 +549,7 @@ EXT_FUNC bool CCSPlayer::CheckActivityInGame() return (fabs(deltaYaw) >= 0.1f && fabs(deltaPitch) >= 0.1f); } -void CCSPlayer::Reset() +void CCSPlayer::ResetVars() { m_szModel[0] = '\0'; @@ -548,6 +565,7 @@ void CCSPlayer::Reset() m_bAutoBunnyHopping = false; m_bMegaBunnyJumping = false; m_bPlantC4Anywhere = false; + m_bSpawnProtectionEffects = false; } void CCSPlayer::OnSpawn() diff --git a/regamedll/dlls/basemonster.h b/regamedll/dlls/basemonster.h index dbdc22c66..63f8d8d41 100644 --- a/regamedll/dlls/basemonster.h +++ b/regamedll/dlls/basemonster.h @@ -34,7 +34,7 @@ enum { - ITBD_PARALLYZE = 0, + ITBD_PARALYZE = 0, ITBD_NERVE_GAS, ITBD_POISON, ITBD_RADIATION, diff --git a/regamedll/dlls/bot/cs_bot_manager.cpp b/regamedll/dlls/bot/cs_bot_manager.cpp index 786a3f08f..482180120 100644 --- a/regamedll/dlls/bot/cs_bot_manager.cpp +++ b/regamedll/dlls/bot/cs_bot_manager.cpp @@ -410,11 +410,7 @@ void CCSBotManager::ServerCommand(const char *pcmd) { if (killThemAll || FStrEq(name, msg)) { -#ifdef REGAMEDLL_FIXES - ClientKill(pPlayer->edict()); -#else - pPlayer->TakeDamage(pPlayer->pev, pPlayer->pev, 9999.9f, DMG_CRUSH); -#endif + pPlayer->Kill(); } } } diff --git a/regamedll/dlls/cbase.h b/regamedll/dlls/cbase.h index e0ae20c22..1e11bbeef 100644 --- a/regamedll/dlls/cbase.h +++ b/regamedll/dlls/cbase.h @@ -585,9 +585,9 @@ T *GetClassPtr(T *a) a->pev = pev; #ifdef REGAMEDLL_API - a->OnCreate(); a->m_pEntity = new W(); a->m_pEntity->m_pContainingEntity = a; + a->OnCreate(); #endif } diff --git a/regamedll/dlls/client.cpp b/regamedll/dlls/client.cpp index 3d79df07c..7a7e983d9 100644 --- a/regamedll/dlls/client.cpp +++ b/regamedll/dlls/client.cpp @@ -375,29 +375,13 @@ void EXT_FUNC ClientKill(edict_t *pEntity) entvars_t *pev = &pEntity->v; CBasePlayer *pPlayer = CBasePlayer::Instance(pev); - if (pPlayer->GetObserverMode() != OBS_NONE) - return; - - if (pPlayer->m_iJoiningState != JOINED) - return; - // prevent suiciding too often if (pPlayer->m_fNextSuicideTime > gpGlobals->time) return; - pPlayer->m_LastHitGroup = HITGROUP_GENERIC; - // don't let them suicide for 1 second after suiciding pPlayer->m_fNextSuicideTime = gpGlobals->time + 1.0f; - - // have the player kill themself - pEntity->v.health = 0; - pPlayer->Killed(pev, GIB_NEVER); - - if (CSGameRules()->m_pVIP == pPlayer) - { - CSGameRules()->m_iConsecutiveVIP = 10; - } + pPlayer->Kill(); } LINK_HOOK_VOID_CHAIN(ShowMenu, (CBasePlayer *pPlayer, int bitsValidSlots, int nDisplayTime, BOOL fNeedMore, char *pszText), pPlayer, bitsValidSlots, nDisplayTime, fNeedMore, pszText) @@ -743,7 +727,7 @@ void EXT_FUNC ClientPutInServer(edict_t *pEntity) } #ifdef REGAMEDLL_API - pPlayer->CSPlayer()->Reset(); + pPlayer->CSPlayer()->ResetVars(); #endif UTIL_ClientPrintAll(HUD_PRINTNOTIFY, "#Game_connected", (sName[0] != '\0') ? sName : ""); @@ -1860,10 +1844,11 @@ BOOL EXT_FUNC __API_HOOK(HandleMenu_ChooseTeam)(CBasePlayer *pPlayer, int slot) { if (pPlayer->m_iTeam != UNASSIGNED && pPlayer->pev->deadflag == DEAD_NO) { - ClientKill(pPlayer->edict()); - - // add 1 to frags to balance out the 1 subtracted for killing yourself - pPlayer->pev->frags++; + if (pPlayer->Kill()) + { + // add 1 to frags to balance out the 1 subtracted for killing yourself + pPlayer->pev->frags++; + } } pPlayer->RemoveAllItems(TRUE); @@ -2091,10 +2076,10 @@ BOOL EXT_FUNC __API_HOOK(HandleMenu_ChooseTeam)(CBasePlayer *pPlayer, int slot) pPlayer->m_iMenu = Menu_ChooseAppearance; // Show the appropriate Choose Appearance menu - // This must come before ClientKill() for CheckWinConditions() to function properly + // This must come before pPlayer->Kill() for CheckWinConditions() to function properly if (pPlayer->pev->deadflag == DEAD_NO) { - ClientKill(pPlayer->edict()); + pPlayer->Kill(); } } diff --git a/regamedll/dlls/game.cpp b/regamedll/dlls/game.cpp index 9f3a9b496..152edceff 100644 --- a/regamedll/dlls/game.cpp +++ b/regamedll/dlls/game.cpp @@ -164,6 +164,8 @@ cvar_t sv_autobunnyhopping = { "sv_autobunnyhopping", "0", 0, 0.0f cvar_t sv_enablebunnyhopping = { "sv_enablebunnyhopping", "0", 0, 0.0f, nullptr }; cvar_t plant_c4_anywhere = { "mp_plant_c4_anywhere", "0", 0, 0.0f, nullptr }; cvar_t give_c4_frags = { "mp_give_c4_frags", "3", 0, 3.0f, nullptr }; +cvar_t hostages_rescued_ratio = { "mp_hostages_rescued_ratio", "1.0", 0, 1.0f, nullptr }; +cvar_t legacy_vehicle_block = { "mp_legacy_vehicle_block", "1", 0, 0.0f, nullptr }; // Note: Just for my plugins & cie. cvar_t game_version_personnal = { "game_version_personnal", "1.3.0-public-AMXModDev", FCVAR_SERVER, 0.0f, nullptr }; @@ -410,6 +412,8 @@ void EXT_FUNC GameDLLInit() CVAR_REGISTER(&sv_enablebunnyhopping); CVAR_REGISTER(&plant_c4_anywhere); CVAR_REGISTER(&give_c4_frags); + CVAR_REGISTER(&hostages_rescued_ratio); + CVAR_REGISTER(&legacy_vehicle_block); CVAR_REGISTER(&game_version_personnal); diff --git a/regamedll/dlls/game.h b/regamedll/dlls/game.h index cc0c033ba..ae08b5fc9 100644 --- a/regamedll/dlls/game.h +++ b/regamedll/dlls/game.h @@ -190,6 +190,8 @@ extern cvar_t sv_autobunnyhopping; extern cvar_t sv_enablebunnyhopping; extern cvar_t plant_c4_anywhere; extern cvar_t give_c4_frags; +extern cvar_t hostages_rescued_ratio; +extern cvar_t legacy_vehicle_block; extern cvar_t game_version_personnal; diff --git a/regamedll/dlls/gamerules.cpp b/regamedll/dlls/gamerules.cpp index d5ad924d1..5ec17fbc0 100644 --- a/regamedll/dlls/gamerules.cpp +++ b/regamedll/dlls/gamerules.cpp @@ -145,3 +145,13 @@ CGameRules *EXT_FUNC __API_HOOK(InstallGameRules)() return new CHalfLifeMultiplay; } + +LINK_HOOK_VOID_CHAIN(FreeGameRules, (CGameRules **pGameRules), pGameRules) + +void EXT_FUNC __API_HOOK(FreeGameRules)(CGameRules **pGameRules) +{ + if (!pGameRules || !(*pGameRules)) + return; + + delete (*pGameRules); +} diff --git a/regamedll/dlls/gamerules.h b/regamedll/dlls/gamerules.h index ed0111a50..5eee3a6dd 100644 --- a/regamedll/dlls/gamerules.h +++ b/regamedll/dlls/gamerules.h @@ -831,9 +831,11 @@ extern CGameRules DLLEXPORT *g_pGameRules; #ifdef REGAMEDLL_API CGameRules *InstallGameRules_OrigFunc(); +void FreeGameRules_OrigFunc(CGameRules **pGameRules); #endif CGameRules *InstallGameRules(); +void FreeGameRules(CGameRules **pGameRules); // Gets us at the CS game rules inline CHalfLifeMultiplay *CSGameRules() diff --git a/regamedll/dlls/multiplay_gamerules.cpp b/regamedll/dlls/multiplay_gamerules.cpp index 7824ef516..d20bb3144 100644 --- a/regamedll/dlls/multiplay_gamerules.cpp +++ b/regamedll/dlls/multiplay_gamerules.cpp @@ -1486,6 +1486,12 @@ bool CHalfLifeMultiplay::HostageRescueRoundEndCheck() } } +#ifdef REGAMEDLL_ADD + if (hostagesCount > 0 && m_iHostagesRescued >= (hostagesCount * Q_min(hostages_rescued_ratio.value, 1.0f))) + { + return OnRoundEnd_Intercept(WINSTATUS_CTS, ROUND_ALL_HOSTAGES_RESCUED, GetRoundRestartDelay()); + } +#else // There are no hostages alive.. check to see if the CTs have rescued atleast 50% of them. if (!bHostageAlive && hostagesCount > 0) { @@ -1494,6 +1500,7 @@ bool CHalfLifeMultiplay::HostageRescueRoundEndCheck() return OnRoundEnd_Intercept(WINSTATUS_CTS, ROUND_ALL_HOSTAGES_RESCUED, GetRoundRestartDelay()); } } +#endif return false; } @@ -2028,6 +2035,10 @@ void EXT_FUNC CHalfLifeMultiplay::__API_HOOK(RestartRound)() #endif pPlayer->RoundRespawn(); + +#ifdef REGAMEDLL_ADD + FireTargets("game_entity_restart", pPlayer, nullptr, USE_TOGGLE, 0.0); +#endif } // Gooseman : The following code fixes the HUD icon bug @@ -2066,6 +2077,10 @@ void EXT_FUNC CHalfLifeMultiplay::__API_HOOK(RestartRound)() m_bTargetBombed = m_bBombDefused = false; m_bLevelInitialized = false; m_bCompleteReset = false; + +#ifdef REGAMEDLL_ADD + FireTargets("game_round_start", nullptr, nullptr, USE_TOGGLE, 0.0); +#endif } BOOL CHalfLifeMultiplay::IsThereABomber() @@ -3919,7 +3934,11 @@ void EXT_FUNC CHalfLifeMultiplay::__API_HOOK(PlayerKilled)(CBasePlayer *pVictim, else if (ktmp && ktmp->Classify() == CLASS_VEHICLE) { CBasePlayer *pDriver = static_cast(((CFuncVehicle *)ktmp)->m_pDriver); +#ifdef REGAMEDLL_FIXES + if (pDriver && !pDriver->has_disconnected) +#else if (pDriver) +#endif { pKiller = pDriver->pev; peKiller = static_cast(pDriver); diff --git a/regamedll/dlls/player.cpp b/regamedll/dlls/player.cpp index 3a6641b5a..9e8a7ac8b 100644 --- a/regamedll/dlls/player.cpp +++ b/regamedll/dlls/player.cpp @@ -3873,7 +3873,7 @@ void EXT_FUNC CBasePlayer::__API_HOOK(RoundRespawn)() #ifdef REGAMEDLL_FIXES if (m_bPunishedForTK && pev->health > 0) { - ClientKill(ENT(pev)); + Kill(); } #endif @@ -4045,7 +4045,12 @@ void CBasePlayer::PlayerUse() CBaseEntity *pTrain = Instance(pev->groundentity); if (pTrain && pTrain->Classify() == CLASS_VEHICLE) { +#ifdef REGAMEDLL_ADD + if (legacy_vehicle_block.value) + ((CFuncVehicle *)pTrain)->m_pDriver = nullptr; +#else ((CFuncVehicle *)pTrain)->m_pDriver = nullptr; +#endif } return; } @@ -4596,7 +4601,12 @@ void EXT_FUNC CBasePlayer::__API_HOOK(PreThink)() // Turn off the train if you jump, strafe, or the train controls go dead m_afPhysicsFlags &= ~PFLAG_ONTRAIN; m_iTrain = (TRAIN_NEW | TRAIN_OFF); +#ifdef REGAMEDLL_ADD + if (legacy_vehicle_block.value) + ((CFuncVehicle *)pTrain)->m_pDriver = nullptr; +#else ((CFuncVehicle *)pTrain)->m_pDriver = nullptr; +#endif return; } @@ -4735,7 +4745,7 @@ void CBasePlayer::CheckTimeBasedDamage() { switch (i) { - case ITBD_PARALLYZE: + case ITBD_PARALYZE: // UNDONE - flag movement as half-speed bDuration = PARALYZE_DURATION; break; @@ -10248,6 +10258,7 @@ void EXT_FUNC CBasePlayer::__API_HOOK(SetSpawnProtection)(float flProtectionTime #ifdef REGAMEDLL_ADD if (respawn_immunity_effects.value > 0) { + CSPlayer()->m_bSpawnProtectionEffects = true; pev->rendermode = kRenderTransAdd; pev->renderamt = 100.0f; @@ -10269,12 +10280,11 @@ LINK_HOOK_CLASS_VOID_CHAIN2(CBasePlayer, RemoveSpawnProtection) void CBasePlayer::__API_HOOK(RemoveSpawnProtection)() { #ifdef REGAMEDLL_ADD - if (respawn_immunity_effects.value > 0) + if (CSPlayer()->m_bSpawnProtectionEffects) { - if (pev->rendermode == kRenderTransAdd && - pev->renderamt == 100.0f) + if (pev->rendermode == kRenderTransAdd && pev->renderamt == 100.0f) { - pev->renderamt = 255.0f; + pev->renderamt = 255.0f; pev->rendermode = kRenderNormal; } @@ -10282,6 +10292,8 @@ void CBasePlayer::__API_HOOK(RemoveSpawnProtection)() WRITE_BYTE(STATUSICON_HIDE); WRITE_STRING("suithelmet_full"); MESSAGE_END(); + + CSPlayer()->m_bSpawnProtectionEffects = false; } CSPlayer()->m_flSpawnProtectionEndTime = 0.0f; @@ -10312,3 +10324,23 @@ void EXT_FUNC CBasePlayer::__API_HOOK(DropIdlePlayer)(const char *reason) SERVER_COMMAND(UTIL_VarArgs("kick \"%s\"\n", STRING(pev->netname))); #endif // #ifdef REGAMEDLL_FIXES } + +bool CBasePlayer::Kill() +{ + if (GetObserverMode() != OBS_NONE) + return false; + + if (m_iJoiningState != JOINED) + return false; + + m_LastHitGroup = HITGROUP_GENERIC; + + // have the player kill himself + pev->health = 0.0f; + Killed(pev, GIB_NEVER); + + if (CSGameRules()->m_pVIP == this) + CSGameRules()->m_iConsecutiveVIP = 10; + + return true; +} diff --git a/regamedll/dlls/player.h b/regamedll/dlls/player.h index 54c341fca..63cab612d 100644 --- a/regamedll/dlls/player.h +++ b/regamedll/dlls/player.h @@ -643,6 +643,7 @@ class CBasePlayer: public CBaseMonster { void RemoveSpawnProtection(); void UseEmpty(); void DropIdlePlayer(const char *reason); + bool Kill(); // templates template diff --git a/regamedll/dlls/training_gamerules.h b/regamedll/dlls/training_gamerules.h index 04ba82f33..3bd75b0d4 100644 --- a/regamedll/dlls/training_gamerules.h +++ b/regamedll/dlls/training_gamerules.h @@ -34,6 +34,7 @@ class CHalfLifeTraining: public CHalfLifeMultiplay CHalfLifeTraining(); virtual ~CHalfLifeTraining() {}; + virtual void Think() {} 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 9d4608161..ae9356be4 100644 --- a/regamedll/dlls/util.cpp +++ b/regamedll/dlls/util.cpp @@ -1497,6 +1497,10 @@ void UTIL_RestartOther(const char *szClassname) while ((pEntity = UTIL_FindEntityByClassname(pEntity, szClassname))) { pEntity->Restart(); + +#ifdef REGAMEDLL_ADD + FireTargets("game_entity_restart", pEntity, nullptr, USE_TOGGLE, 0.0); +#endif } } diff --git a/regamedll/dlls/vehicle.cpp b/regamedll/dlls/vehicle.cpp index 55b453ed7..9ce327d06 100644 --- a/regamedll/dlls/vehicle.cpp +++ b/regamedll/dlls/vehicle.cpp @@ -109,8 +109,7 @@ void CFuncVehicle::Blocked(CBaseEntity *pOther) pevOther->velocity.z += 300; pev->velocity = pev->velocity * 0.85; - ALERT(at_aiconsole, "TRAIN(%s): Blocked by %s (dmg:%.2f)\n", STRING(pev->targetname), STRING(pOther->pev->classname), pev->dmg); - UTIL_MakeVectors(pev->angles); + ALERT(at_aiconsole, "TRAIN(%s): Blocked by %s (dmg:%.2f)\n", STRING(pev->targetname), STRING(pevOther->classname), pev->dmg); Vector forward, right, vOrigin; Vector vFrontLeft = (gpGlobals->v_forward * -1) * (m_length * 0.5); @@ -131,13 +130,42 @@ void CFuncVehicle::Blocked(CBaseEntity *pOther) float maxz = pev->origin.z + (2 * Q_abs(int(pev->mins.z - pev->maxs.z))); #endif - if (pOther->pev->origin.x < minx - || pOther->pev->origin.x > maxx - || pOther->pev->origin.y < miny - || pOther->pev->origin.y > maxy - || pOther->pev->origin.z < minz - || pOther->pev->origin.z > maxz) + if (pevOther->origin.x < minx + || pevOther->origin.x > maxx + || pevOther->origin.y < miny + || pevOther->origin.y > maxy + || pevOther->origin.z < minz + || pevOther->origin.z > maxz) { +#ifdef REGAMEDLL_ADD + if (legacy_vehicle_block.value) + { + pOther->TakeDamage(pev, pev, 150, DMG_CRUSH); + return; + } + + CBasePlayer* playerDriver = static_cast(m_pDriver); + + if (pOther->Classify() == CLASS_PLAYER) + { + CBasePlayer* playerOther = static_cast(pOther); + if (!playerDriver || g_pGameRules->PlayerRelationship(playerDriver, playerOther) == GR_TEAMMATE) + { + // Just kick player + return; + } + else + { + playerOther->TakeDamage(pev, playerDriver->pev, 150, DMG_CRUSH); + return; + } + } + else if (playerDriver && FClassnameIs(pevOther, "hostage_entity")) + { + pOther->TakeDamage(playerDriver->pev, playerDriver->pev, 150, DMG_CRUSH); + return; + } +#endif pOther->TakeDamage(pev, pev, 150, DMG_CRUSH); } } diff --git a/regamedll/dlls/weapons.cpp b/regamedll/dlls/weapons.cpp index b395069c8..bf40495e2 100644 --- a/regamedll/dlls/weapons.cpp +++ b/regamedll/dlls/weapons.cpp @@ -70,6 +70,8 @@ float GetBaseAccuracy(WeaponIdType id) case WEAPON_MP5N: return 0.0f; } + + return 0.0f; } // Resets the global multi damage accumulator diff --git a/regamedll/dlls/world.cpp b/regamedll/dlls/world.cpp index efbb4dcf1..e4a385450 100644 --- a/regamedll/dlls/world.cpp +++ b/regamedll/dlls/world.cpp @@ -288,10 +288,7 @@ void CWorld::Precache() CVAR_SET_STRING("room_type", "0"); // Set up game rules - if (g_pGameRules) - { - delete g_pGameRules; - } + FreeGameRules(&g_pGameRules); g_pGameRules = InstallGameRules(); diff --git a/regamedll/dlls/wpn_shared/wpn_aug.cpp b/regamedll/dlls/wpn_shared/wpn_aug.cpp index c54780f3a..b5a0aeb18 100644 --- a/regamedll/dlls/wpn_shared/wpn_aug.cpp +++ b/regamedll/dlls/wpn_shared/wpn_aug.cpp @@ -78,13 +78,15 @@ void CAUG::SecondaryAttack() void CAUG::PrimaryAttack() { + const float flCycleTime = (m_pPlayer->pev->fov == DEFAULT_FOV) ? 0.0825f : 0.135f; + if (!(m_pPlayer->pev->flags & FL_ONGROUND)) { - AUGFire(0.035 + (0.4 * m_flAccuracy), 0.0825, FALSE); + AUGFire(0.035 + (0.4 * m_flAccuracy), flCycleTime, FALSE); } else if (m_pPlayer->pev->velocity.Length2D() > 140) { - AUGFire(0.035 + (0.07 * m_flAccuracy), 0.0825, FALSE); + AUGFire(0.035 + (0.07 * m_flAccuracy), flCycleTime, FALSE); } else if (m_pPlayer->pev->fov == DEFAULT_FOV) { @@ -92,7 +94,7 @@ void CAUG::PrimaryAttack() } else { - AUGFire(0.02 * m_flAccuracy, 0.135, FALSE); + AUGFire(0.02 * m_flAccuracy, flCycleTime, FALSE); } } diff --git a/regamedll/dlls/wpn_shared/wpn_sg552.cpp b/regamedll/dlls/wpn_shared/wpn_sg552.cpp index c95a66878..7f77ccb88 100644 --- a/regamedll/dlls/wpn_shared/wpn_sg552.cpp +++ b/regamedll/dlls/wpn_shared/wpn_sg552.cpp @@ -77,13 +77,15 @@ void CSG552::SecondaryAttack() void CSG552::PrimaryAttack() { + const float flCycleTime = (m_pPlayer->pev->fov == DEFAULT_FOV) ? 0.0825f : 0.135f; + if (!(m_pPlayer->pev->flags & FL_ONGROUND)) { - SG552Fire(0.035 + (0.45 * m_flAccuracy), 0.0825, FALSE); + SG552Fire(0.035 + (0.45 * m_flAccuracy), flCycleTime, FALSE); } else if (m_pPlayer->pev->velocity.Length2D() > 140) { - SG552Fire(0.035 + (0.075 * m_flAccuracy), 0.0825, FALSE); + SG552Fire(0.035 + (0.075 * m_flAccuracy), flCycleTime, FALSE); } else if (m_pPlayer->pev->fov == DEFAULT_FOV) { @@ -91,7 +93,7 @@ void CSG552::PrimaryAttack() } else { - SG552Fire(0.02 * m_flAccuracy, 0.135, FALSE); + SG552Fire(0.02 * m_flAccuracy, flCycleTime, FALSE); } } diff --git a/regamedll/public/regamedll/API/CSPlayer.h b/regamedll/public/regamedll/API/CSPlayer.h index 4e7d1e93e..8648a0816 100644 --- a/regamedll/public/regamedll/API/CSPlayer.h +++ b/regamedll/public/regamedll/API/CSPlayer.h @@ -49,7 +49,8 @@ class CCSPlayer: public CCSMonster { m_bGameForcingRespawn(false), m_bAutoBunnyHopping(false), m_bMegaBunnyJumping(false), - m_bPlantC4Anywhere(false) + m_bPlantC4Anywhere(false), + m_bSpawnProtectionEffects(false) { m_szModel[0] = '\0'; } @@ -99,8 +100,11 @@ class CCSPlayer: public CCSMonster { virtual void SetSpawnProtection(float flProtectionTime); virtual void RemoveSpawnProtection(); virtual bool HintMessageEx(const char *pMessage, float duration = 6.0f, bool bDisplayIfPlayerDead = false, bool bOverride = false); + virtual void Reset(); + virtual void OnSpawnEquip(bool addDefault = true, bool equipGame = true); + virtual void SetScoreboardAttributes(CBasePlayer *destination = nullptr); - void Reset(); + void ResetVars(); void OnSpawn(); void OnKilled(); @@ -131,6 +135,7 @@ class CCSPlayer: public CCSMonster { bool m_bAutoBunnyHopping; bool m_bMegaBunnyJumping; bool m_bPlantC4Anywhere; + bool m_bSpawnProtectionEffects; }; // Inlines diff --git a/regamedll/public/regamedll/regamedll_api.h b/regamedll/public/regamedll/regamedll_api.h index 79aec7c5c..493736ca2 100644 --- a/regamedll/public/regamedll/regamedll_api.h +++ b/regamedll/public/regamedll/regamedll_api.h @@ -520,6 +520,10 @@ typedef IHookChainRegistryClass IReGameHookRegistry_CBa typedef IHookChainClass IReGameHook_CBasePlayer_JoiningThink; typedef IHookChainRegistryClass IReGameHookRegistry_CBasePlayer_JoiningThink; +// FreeGameRules hook +typedef IHookChain IReGameHook_FreeGameRules; +typedef IHookChainRegistry IReGameHookRegistry_FreeGameRules; + class IReGameHookchains { public: virtual ~IReGameHookchains() {} @@ -653,6 +657,8 @@ class IReGameHookchains { virtual IReGameHookRegistry_CBasePlayer_Pain *CBasePlayer_Pain() = 0; virtual IReGameHookRegistry_CBasePlayer_DeathSound *CBasePlayer_DeathSound() = 0; virtual IReGameHookRegistry_CBasePlayer_JoiningThink *CBasePlayer_JoiningThink() = 0; + + virtual IReGameHookRegistry_FreeGameRules *FreeGameRules() = 0; }; struct ReGameFuncs_t { @@ -670,6 +676,9 @@ struct ReGameFuncs_t { class CGrenade *(*PlantBomb)(entvars_t *pevOwner, Vector &vecStart, Vector &vecVelocity); class CGib *(*SpawnHeadGib)(entvars_t* pevVictim); void (*SpawnRandomGibs)(entvars_t* pevVictim, int cGibs, int human); + void (*UTIL_RestartOther)(const char *szClassname); + void (*UTIL_ResetEntities)(); + void (*UTIL_RemoveOther)(const char *szClassname, int nCount); }; class IReGameApi { From 87c1ead0ad5ca72b446d4347ad2ee2a2ff8759b2 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Sun, 19 Mar 2023 09:54:10 +0000 Subject: [PATCH 095/100] Update multiplay_gamerules.cpp CVar "sv_alltalk": Add option "6" (alive hear alive teammates, dead hear dead). --- regamedll/dlls/multiplay_gamerules.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/regamedll/dlls/multiplay_gamerules.cpp b/regamedll/dlls/multiplay_gamerules.cpp index d20bb3144..52dac5283 100644 --- a/regamedll/dlls/multiplay_gamerules.cpp +++ b/regamedll/dlls/multiplay_gamerules.cpp @@ -109,6 +109,8 @@ bool CCStrikeGameMgrHelper::__API_HOOK(CanPlayerHearPlayer)(CBasePlayer *pListen return (pListener->IsAlive() == pSender->IsAlive() || pSender->IsAlive()); case 5: return ((pListener->IsAlive() == pSender->IsAlive() && pListener->m_iTeam == pSender->m_iTeam) || !pListener->IsAlive()); + case 6: + return ((pListener->IsAlive() == pSender->IsAlive() && pListener->m_iTeam == pSender->m_iTeam) || (!pListener->IsAlive() && !pSender->IsAlive())); #endif default: { From 8d97a79ba4351ecb8d5b6f08dda6e4d23e02e9bf Mon Sep 17 00:00:00 2001 From: StevenKal Date: Sun, 19 Mar 2023 09:55:10 +0000 Subject: [PATCH 096/100] Update game.cfg CVar "sv_alltalk": Add option "6" (alive hear alive teammates, dead hear dead). --- dist/game.cfg | 1 + 1 file changed, 1 insertion(+) diff --git a/dist/game.cfg b/dist/game.cfg index 16a137f94..58ac4d635 100644 --- a/dist/game.cfg +++ b/dist/game.cfg @@ -222,6 +222,7 @@ showtriggers 0 // 3 - same as 2, but spectators hear everybody // 4 - alive hear alive, dead hear dead and alive. // 5 - alive hear alive teammates, dead hear dead and alive. +// 6 - alive hear alive teammates, dead hear dead. // // Default value: "0" sv_alltalk 0 From 5c869c1c386ac6f9fb702eb895a0f6e4f528af56 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Sun, 19 Mar 2023 09:56:25 +0000 Subject: [PATCH 097/100] Update README.md CVar "sv_alltalk": Add option "6" (alive hear alive teammates, dead hear dead). --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index bf7408dac..5b774cf88 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,7 @@ This means that plugins that do binary code analysis (Orpheu for example) probab | mp_show_scenarioicon | 0 | 0 | 1 | Show scenario icon in HUD such as count of alive hostages or ticking bomb.
`0` disabled
`1` enabled | | mp_old_bomb_defused_sound | 1 | 0 | 1 | Play "Bomb has been defused" sound instead of "Counter-Terrorists win" when bomb was defused
`0` disabled
`1` enabled | | showtriggers | 0 | 0 | 1 | Debug cvar shows triggers. | -| sv_alltalk | 0 | 0 | 5 | When players can hear each other ([further explanation](../../wiki/sv_alltalk)).
`0` dead don't hear alive
`1` no restrictions
`2` teammates hear each other
`3` Same as 2, but spectators hear everybody
`4` alive hear alive, dead hear dead and alive.
`5` alive hear alive teammates, dead hear dead and alive. +| sv_alltalk | 0 | 0 | 5 | When players can hear each other ([further explanation](../../wiki/sv_alltalk)).
`0` dead don't hear alive
`1` no restrictions
`2` teammates hear each other
`3` Same as 2, but spectators hear everybody
`4` alive hear alive, dead hear dead and alive.
`5` alive hear alive teammates, dead hear dead and alive.
`6` alive hear alive teammates, dead hear dead. | bot_deathmatch | 0 | 0 | 1 | Sets the mode for the zBot.
`0` disabled
`1` enable mode Deathmatch and not allow to do the scenario | | bot_quota_mode | normal | - | - | Determines the type of quota.
`normal` default behaviour
`fill` the server will adjust bots to keep `N` players in the game, where `N` is bot_quota
`match` the server will maintain a `1:N` ratio of humans to bots, where `N` is bot_quota | | bot_join_delay | 0 | - | - | Prevents bots from joining the server for this many seconds after a map change. | From 0058f7025b2222169a39cc5b91daf063f940fc1c Mon Sep 17 00:00:00 2001 From: StevenKal Date: Mon, 3 Apr 2023 22:57:03 +0200 Subject: [PATCH 098/100] [Personal v1] Merge last changes till commit #582. (#9) * Fix incorrect player 3rd cam animations on death while frozen. * Add new trace flags * Missing friendlyfire after previous commit * Fix bug when picking weaponbox grenades with ammo > 1 * Weaponbox ammopack hardcode --- regamedll/common/const.h | 5 ++++ regamedll/dlls/cbase.cpp | 10 ++++++++ regamedll/dlls/combat.cpp | 3 +++ regamedll/dlls/player.cpp | 10 ++++++-- regamedll/dlls/vehicle.cpp | 2 +- regamedll/dlls/weapons.cpp | 51 ++++++++++++++++++++++++++++++-------- 6 files changed, 67 insertions(+), 14 deletions(-) diff --git a/regamedll/common/const.h b/regamedll/common/const.h index 3c9873114..d667a6b85 100644 --- a/regamedll/common/const.h +++ b/regamedll/common/const.h @@ -96,6 +96,11 @@ // Goes into globalvars_t.trace_flags #define FTRACE_SIMPLEBOX BIT(0) // Traceline with a simple box +// Custom flags that we can retrive in pfnShouldCollide +// Starting from BIT(16) to reserve space for more flags for Engine +#define FTRACE_BULLET BIT(16) +#define FTRACE_FLASH BIT(17) + // walkmove modes #define WALKMOVE_NORMAL 0 // normal walkmove #define WALKMOVE_WORLDONLY 1 // doesn't hit ANY entities, no matter what the solid type diff --git a/regamedll/dlls/cbase.cpp b/regamedll/dlls/cbase.cpp index 9bf5abef0..b1cbe149e 100644 --- a/regamedll/dlls/cbase.cpp +++ b/regamedll/dlls/cbase.cpp @@ -1039,6 +1039,9 @@ void CBaseEntity::__API_HOOK(FireBullets)(ULONG cShots, VectorRef vecSrc, Vector vecDir = vecDirShooting + x * vecSpread.x * vecRight + y * vecSpread.y * vecUp; vecEnd = vecSrc + vecDir * flDistance; +#ifdef REGAMEDLL_ADD + gpGlobals->trace_flags = FTRACE_BULLET; +#endif UTIL_TraceLine(vecSrc, vecEnd, dont_ignore_monsters, ENT(pev), &tr); tracer = 0; @@ -1182,6 +1185,9 @@ void CBaseEntity::__API_HOOK(FireBuckshots)(ULONG cShots, VectorRef vecSrc, Vect vecDir = vecDirShooting + x * vecSpread.x * vecRight + y * vecSpread.y * vecUp; vecEnd = vecSrc + vecDir * flDistance; +#ifdef REGAMEDLL_ADD + gpGlobals->trace_flags = FTRACE_BULLET; +#endif UTIL_TraceLine(vecSrc, vecEnd, dont_ignore_monsters, ENT(pev), &tr); tracer = 0; @@ -1337,6 +1343,10 @@ VectorRef CBaseEntity::__API_HOOK(FireBullets3)(VectorRef vecSrc, VectorRef vecD while (iPenetration != 0) { ClearMultiDamage(); + +#ifdef REGAMEDLL_ADD + gpGlobals->trace_flags = FTRACE_BULLET; +#endif UTIL_TraceLine(vecSrc, vecEnd, dont_ignore_monsters, ENT(pev), &tr); if (TheBots && tr.flFraction != 1.0f) diff --git a/regamedll/dlls/combat.cpp b/regamedll/dlls/combat.cpp index f5ec1ce15..620c84cfd 100644 --- a/regamedll/dlls/combat.cpp +++ b/regamedll/dlls/combat.cpp @@ -26,6 +26,9 @@ void PlayerBlind(CBasePlayer *pPlayer, entvars_t *pevInflictor, entvars_t *pevAt void RadiusFlash_TraceLine_hook(CBasePlayer *pPlayer, entvars_t *pevInflictor, entvars_t *pevAttacker, Vector &vecSrc, Vector &vecSpot, TraceResult *tr) { +#ifdef REGAMEDLL_ADD + gpGlobals->trace_flags = FTRACE_FLASH; +#endif UTIL_TraceLine(vecSrc, vecSpot, dont_ignore_monsters, ENT(pevInflictor), tr); } diff --git a/regamedll/dlls/player.cpp b/regamedll/dlls/player.cpp index 9e8a7ac8b..a400f377f 100644 --- a/regamedll/dlls/player.cpp +++ b/regamedll/dlls/player.cpp @@ -1298,8 +1298,11 @@ CWeaponBox *EXT_FUNC __API_HOOK(CreateWeaponBox)(CBasePlayerItem *pItem, CBasePl bool exhaustibleAmmo = (pItem->iFlags() & ITEM_FLAG_EXHAUSTIBLE) == ITEM_FLAG_EXHAUSTIBLE; if (exhaustibleAmmo || packAmmo) { +#ifndef REGAMEDLL_ADD pWeaponBox->PackAmmo(MAKE_STRING(pItem->pszAmmo1()), pPlayerOwner->m_rgAmmo[pItem->PrimaryAmmoIndex()]); - +#else + pWeaponBox->GiveAmmo(pPlayerOwner->m_rgAmmo[pItem->PrimaryAmmoIndex()], (char *)pItem->pszAmmo1(), pItem->iMaxAmmo1()); +#endif if (exhaustibleAmmo) { pPlayerOwner->m_rgAmmo[pItem->PrimaryAmmoIndex()] = 0; @@ -2190,8 +2193,11 @@ void EXT_FUNC CBasePlayer::__API_HOOK(Killed)(entvars_t *pevAttacker, int iGib) pev->gamestate = HITGROUP_SHIELD_DISABLED; m_bShieldDrawn = false; +#ifdef REGAMEDLL_FIXES + pev->flags &= ~(FL_ONGROUND | FL_FROZEN); +#else pev->flags &= ~FL_ONGROUND; - +#endif #ifdef REGAMEDLL_FIXES // FlashlightTurnOff() pev->effects &= ~EF_DIMLIGHT; diff --git a/regamedll/dlls/vehicle.cpp b/regamedll/dlls/vehicle.cpp index 9ce327d06..a621cf3f4 100644 --- a/regamedll/dlls/vehicle.cpp +++ b/regamedll/dlls/vehicle.cpp @@ -149,7 +149,7 @@ void CFuncVehicle::Blocked(CBaseEntity *pOther) if (pOther->Classify() == CLASS_PLAYER) { CBasePlayer* playerOther = static_cast(pOther); - if (!playerDriver || g_pGameRules->PlayerRelationship(playerDriver, playerOther) == GR_TEAMMATE) + if (!playerDriver || !g_pGameRules->FPlayerCanTakeDamage(playerOther, playerDriver)) { // Just kick player return; diff --git a/regamedll/dlls/weapons.cpp b/regamedll/dlls/weapons.cpp index bf40495e2..c599d7109 100644 --- a/regamedll/dlls/weapons.cpp +++ b/regamedll/dlls/weapons.cpp @@ -1629,7 +1629,17 @@ int CBasePlayerWeapon::ExtractClipAmmo(CBasePlayerWeapon *pWeapon) iAmmo = m_iClip; } - return pWeapon->m_pPlayer->GiveAmmo(iAmmo, pszAmmo1(), iMaxAmmo1()); + int iIdAmmo = pWeapon->m_pPlayer->GiveAmmo(iAmmo, pszAmmo1(), iMaxAmmo1()); + +#ifdef REGAMEDLL_FIXES + if (iIdAmmo > 0 && IsGrenadeWeapon(m_iId)) + { + // grenades have WEAPON_NOCLIP force play the "got ammo" sound. + EMIT_SOUND(pWeapon->m_pPlayer->edict(), CHAN_ITEM, "items/9mmclip1.wav", VOL_NORM, ATTN_NORM); + } +#endif + + return iIdAmmo; } // RetireWeapon - no more ammo for this gun, put it away. @@ -1954,19 +1964,35 @@ void CWeaponBox::Touch(CBaseEntity *pOther) int playerGrenades = pPlayer->m_rgAmmo[pGrenade->m_iPrimaryAmmoType]; #ifdef REGAMEDLL_FIXES - auto info = GetWeaponInfo(pGrenade->m_iId); - if (info && playerGrenades < info->maxRounds) + // sorry for hardcode :( + const int boxAmmoSlot = 1; + + if (playerGrenades < pGrenade->iMaxAmmo1()) { - auto pNext = m_rgpPlayerItems[i]->m_pNext; - if (pPlayer->AddPlayerItem(pItem)) + if (m_rgAmmo[boxAmmoSlot] > 1 && playerGrenades > 0) { - pItem->AttachToPlayer(pPlayer); - bEmitSound = true; + if (!FStringNull(m_rgiszAmmo[boxAmmoSlot]) + && pPlayer->GiveAmmo(1, STRING(m_rgiszAmmo[boxAmmoSlot]), pGrenade->iMaxAmmo1()) != -1) + { + m_rgAmmo[boxAmmoSlot]--; + + EMIT_SOUND(pPlayer->edict(), CHAN_ITEM, "items/9mmclip1.wav", VOL_NORM, ATTN_NORM); + } } + else + { + auto pNext = m_rgpPlayerItems[i]->m_pNext; - // unlink this weapon from the box - m_rgpPlayerItems[i] = pItem = pNext; - continue; + if (pPlayer->AddPlayerItem(pItem)) + { + pItem->AttachToPlayer(pPlayer); + bEmitSound = true; + } + + // unlink this weapon from the box + m_rgpPlayerItems[i] = pItem = pNext; + continue; + } } #else @@ -2040,8 +2066,11 @@ void CWeaponBox::Touch(CBaseEntity *pOther) if (!FStringNull(m_rgiszAmmo[n])) { // there's some ammo of this type. +#ifndef REGAMEDLL_ADD pPlayer->GiveAmmo(m_rgAmmo[n], (char *)STRING(m_rgiszAmmo[n]), MaxAmmoCarry(m_rgiszAmmo[n])); - +#else + pPlayer->GiveAmmo(m_rgAmmo[n], STRING(m_rgiszAmmo[n]), m_rgAmmo[n]); +#endif // now empty the ammo from the weaponbox since we just gave it to the player m_rgiszAmmo[n] = iStringNull; m_rgAmmo[n] = 0; From 41267e9fe594b6b613fe02fd8809ed660784a2e7 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Tue, 11 Jul 2023 14:33:38 +0200 Subject: [PATCH 099/100] [Personal v1] Merge last changes till commit #593. (#10) * CCSPlayer::RemovePlayerItemEx: Reduce ammo supply for grenades and C4. * Disable BotPrecache whether game is CS v1.6. * Make Knife back stab multiplier customizable. * CZero: Fix broken Career Tasks. * New CVars: mp_weapondrop and mp_ammodrop and fixes. * Fix Glock and Famas undesired ammo decreasing on burst mode. * Little code cleaning: g_vecAttackDir. * Fix: CVar bot_profile_db use. * Add FTRACE_KNIFE flag. --- README.md | 2 + dist/game.cfg | 17 +++ regamedll/common/const.h | 1 + regamedll/dlls/API/CSPlayer.cpp | 45 +++--- regamedll/dlls/bot/cs_bot_manager.cpp | 2 +- regamedll/dlls/career_tasks.cpp | 8 ++ regamedll/dlls/effects.cpp | 6 +- regamedll/dlls/game.cpp | 4 + regamedll/dlls/game.h | 2 + regamedll/dlls/gamerules.h | 4 + regamedll/dlls/multiplay_gamerules.cpp | 20 ++- regamedll/dlls/player.cpp | 183 ++++++++++++++++++------ regamedll/dlls/util.cpp | 2 +- regamedll/dlls/util.h | 2 +- regamedll/dlls/weapons.cpp | 6 +- regamedll/dlls/weapons.h | 44 ++++-- regamedll/dlls/wpn_shared/wpn_knife.cpp | 121 ++++++++++------ regamedll/game_shared/bot/bot_util.cpp | 12 +- 18 files changed, 353 insertions(+), 128 deletions(-) diff --git a/README.md b/README.md index 5b774cf88..b39fcf65e 100644 --- a/README.md +++ b/README.md @@ -45,6 +45,8 @@ This means that plugins that do binary code analysis (Orpheu for example) probab | mp_round_restart_delay | 5 | - | - | Number of seconds to delay before restarting a round after a win. | | 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 first available grenade
`2` drop all grenades | +| mp_weapondrop | 1 | 0 | 3 | Drop player weapon after death.
`0` do not drop weapons after death
`1` drop best/heaviest weapon after death
`2` drop active weapon after death
`3` drop all weapons after death (primary and secondary) | +| mp_ammodrop | 1 | 0 | 2 | Drop ammo on weapon boxes on death or manual drop.
`0` always keep ammo on player
`1` drop all ammo only after death
`2` drop all ammo whenever player drops a weapon | | mp_roundrespawn_time | 20 | 0 | - | Player cannot respawn until next round if more than N seconds has elapsed since the beginning round.
`-1` means no time limit
| | 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 player spawn and on the purchase of the item | diff --git a/dist/game.cfg b/dist/game.cfg index 58ac4d635..0a3545441 100644 --- a/dist/game.cfg +++ b/dist/game.cfg @@ -78,6 +78,23 @@ mp_hegrenade_penetration 0 // Default value: "0" mp_nadedrops 0 +// Drop player weapon after death +// 0 - do not drop weapons after death +// 1 - drop best/heaviest weapon after death (default behaviour) +// 2 - drop active weapon after death +// 3 - drop all weapons after death (primary and secondary) +// NOTE: Grenades are dropped separately depending on mp_nadedrops value +// +// Default value: "1" +mp_weapondrop "1" +// Drop ammo on weapon boxes on death or manual drop +// 0 - always keep ammo on player +// 1 - drop all ammo only after death (default behaviour) +// 2 - drop all ammo whenever player drops a weapon (NOTE: Other weapons may remain without ammo due to same ammo sharing) +// +// Default value: "1" +mp_ammodrop "1" + // Player cannot respawn until next round // if more than N seconds has elapsed since the beginning round // -1 - means no time limit diff --git a/regamedll/common/const.h b/regamedll/common/const.h index d667a6b85..940cff141 100644 --- a/regamedll/common/const.h +++ b/regamedll/common/const.h @@ -100,6 +100,7 @@ // Starting from BIT(16) to reserve space for more flags for Engine #define FTRACE_BULLET BIT(16) #define FTRACE_FLASH BIT(17) +#define FTRACE_KNIFE BIT(18) // walkmove modes #define WALKMOVE_NORMAL 0 // normal walkmove diff --git a/regamedll/dlls/API/CSPlayer.cpp b/regamedll/dlls/API/CSPlayer.cpp index 98f328b21..b81b95f6a 100644 --- a/regamedll/dlls/API/CSPlayer.cpp +++ b/regamedll/dlls/API/CSPlayer.cpp @@ -215,28 +215,31 @@ EXT_FUNC bool CCSPlayer::RemovePlayerItemEx(const char* pszItemName, bool bRemov auto pItem = GetItemByName(pszItemName); if (pItem) { - CBasePlayerItem *pActiveItem = pPlayer->m_pActiveItem; - - if (pPlayer->RemovePlayerItem(pItem)) { - pPlayer->pev->weapons &= ~(1 << pItem->m_iId); - // No more weapon. - if ((pPlayer->pev->weapons & ~(1 << WEAPON_SUIT)) == 0) { - pPlayer->m_iHideHUD |= HIDEHUD_WEAPONS; + if (pItem->IsWeapon()) + { + // These weapons have a unique type of ammo that is used only by them + // If a weapon is removed, its ammo is also reduced, unless the ammo can be used by another weapon + if (!bRemoveAmmo && (IsGrenadeWeapon(pItem->m_iId) || pItem->m_iId == WEAPON_C4)) + { + if (pPlayer->m_rgAmmo[pItem->PrimaryAmmoIndex()] > 0) + pPlayer->m_rgAmmo[pItem->PrimaryAmmoIndex()]--; + + // Hold the weapon until it runs out of ammo + if (pPlayer->m_rgAmmo[pItem->PrimaryAmmoIndex()] > 0) + return true; // ammo was reduced, this will be considered a successful result } - pItem->Kill(); - - if (pItem->IsWeapon()) { - if (pItem == pActiveItem) { - g_pGameRules->GetNextBestWeapon(pPlayer, pActiveItem); - } + if (pItem == pPlayer->m_pActiveItem) { + ((CBasePlayerWeapon *)pItem)->RetireWeapon(); + } - // Critical if we share BP ammo with others, a mode like <0|1|2> where "1" check if no other weapon use such ammo type would have been better. - if (bRemoveAmmo || (pItem->iFlags() & ITEM_FLAG_EXHAUSTIBLE)) { - pPlayer->m_rgAmmo[ pItem->PrimaryAmmoIndex() ] = 0; - } + if (bRemoveAmmo) { + pPlayer->m_rgAmmo[ pItem->PrimaryAmmoIndex() ] = 0; } + } + if (pPlayer->RemovePlayerItem(pItem)) + { if (FClassnameIs(pItem->pev, "weapon_c4")) { pPlayer->m_bHasC4 = false; pPlayer->pev->body = 0; @@ -244,6 +247,14 @@ EXT_FUNC bool CCSPlayer::RemovePlayerItemEx(const char* pszItemName, bool bRemov pPlayer->SetProgressBarTime(0); } + pPlayer->pev->weapons &= ~(1 << pItem->m_iId); + // No more weapon + if ((pPlayer->pev->weapons & ~(1 << WEAPON_SUIT)) == 0) { + pPlayer->m_iHideHUD |= HIDEHUD_WEAPONS; + } + + pItem->Kill(); + if (!pPlayer->m_rgpPlayerItems[PRIMARY_WEAPON_SLOT]) { pPlayer->m_bHasPrimary = false; } diff --git a/regamedll/dlls/bot/cs_bot_manager.cpp b/regamedll/dlls/bot/cs_bot_manager.cpp index 482180120..4a6269ff6 100644 --- a/regamedll/dlls/bot/cs_bot_manager.cpp +++ b/regamedll/dlls/bot/cs_bot_manager.cpp @@ -78,7 +78,7 @@ CCSBotManager::CCSBotManager() char *dataPointer = (char *)LOAD_FILE_FOR_ME((char *)filename, &dataLength); if (!dataPointer) { - TheBotProfiles->Init("BotProfile.db"); + TheBotProfiles->Init(cv_bot_profile_db.string); } else { diff --git a/regamedll/dlls/career_tasks.cpp b/regamedll/dlls/career_tasks.cpp index 0b0c45a56..57d2bd707 100644 --- a/regamedll/dlls/career_tasks.cpp +++ b/regamedll/dlls/career_tasks.cpp @@ -136,10 +136,14 @@ void CCareerTask::OnWeaponKill(int weaponId, int weaponClassId, bool headshot, b if (!pHostage->IsAlive()) continue; +#ifndef REGAMEDLL_FIXES if (!pHostage->IsFollowingSomeone()) continue; if (pHostage->m_target == pVictim) +#else + if (pHostage->IsFollowing(pVictim)) +#endif hostagesCount++; } @@ -212,10 +216,14 @@ void CCareerTask::OnEvent(GameEventType event, CBasePlayer *pVictim, CBasePlayer if (!pHostage->IsAlive()) continue; +#ifndef REGAMEDLL_FIXES if (!pHostage->IsFollowingSomeone()) continue; if (pHostage->m_target == pAttacker) +#else + if (pHostage->IsFollowing(pAttacker)) +#endif hostagesCount++; } diff --git a/regamedll/dlls/effects.cpp b/regamedll/dlls/effects.cpp index 16cc2e6ab..f934edd4b 100644 --- a/regamedll/dlls/effects.cpp +++ b/regamedll/dlls/effects.cpp @@ -1737,10 +1737,12 @@ Vector CBlood::BloodPosition(CBaseEntity *pActivator) void CBlood::Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { + const Vector direction = Direction(); + if (pev->spawnflags & SF_BLOOD_STREAM) - UTIL_BloodStream(BloodPosition(pActivator), Direction(), (Color() == BLOOD_COLOR_RED) ? 70 : Color(), int(BloodAmount())); + UTIL_BloodStream(BloodPosition(pActivator), direction, (Color() == BLOOD_COLOR_RED) ? 70 : Color(), int(BloodAmount())); else - UTIL_BloodDrips(BloodPosition(pActivator), Direction(), Color(), int(BloodAmount())); + UTIL_BloodDrips(BloodPosition(pActivator), Color(), int(BloodAmount())); if (pev->spawnflags & SF_BLOOD_DECAL) { diff --git a/regamedll/dlls/game.cpp b/regamedll/dlls/game.cpp index 152edceff..8b6b632c0 100644 --- a/regamedll/dlls/game.cpp +++ b/regamedll/dlls/game.cpp @@ -110,6 +110,8 @@ cvar_t maxmoney = { "mp_maxmoney", "16000", FCVAR_SERVER, 0.0f, nul 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 }; +cvar_t weapondrop = { "mp_weapondrop", "1", 0, 1.0f, nullptr }; +cvar_t ammodrop = { "mp_ammodrop", "1", 0, 1.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 DeathMatch, GunGame, ZombieMod etc @@ -354,6 +356,8 @@ void EXT_FUNC GameDLLInit() CVAR_REGISTER(&round_infinite); CVAR_REGISTER(&hegrenade_penetration); CVAR_REGISTER(&nadedrops); + CVAR_REGISTER(&weapondrop); + CVAR_REGISTER(&ammodrop); CVAR_REGISTER(&roundrespawn_time); CVAR_REGISTER(&auto_reload_weapons); CVAR_REGISTER(&refill_bpammo_weapons); diff --git a/regamedll/dlls/game.h b/regamedll/dlls/game.h index ae08b5fc9..a0e549db6 100644 --- a/regamedll/dlls/game.h +++ b/regamedll/dlls/game.h @@ -139,6 +139,8 @@ extern cvar_t maxmoney; extern cvar_t round_infinite; extern cvar_t hegrenade_penetration; extern cvar_t nadedrops; +extern cvar_t weapondrop; +extern cvar_t ammodrop; extern cvar_t roundrespawn_time; extern cvar_t auto_reload_weapons; extern cvar_t refill_bpammo_weapons; diff --git a/regamedll/dlls/gamerules.h b/regamedll/dlls/gamerules.h index 5eee3a6dd..d6975df02 100644 --- a/regamedll/dlls/gamerules.h +++ b/regamedll/dlls/gamerules.h @@ -186,6 +186,10 @@ enum GR_PLR_DROP_AMMO_ALL, GR_PLR_DROP_AMMO_ACTIVE, GR_PLR_DROP_AMMO_NO, + +#ifdef REGAMEDLL_ADD + GR_PLR_DROP_GUN_BEST, +#endif }; // custom enum diff --git a/regamedll/dlls/multiplay_gamerules.cpp b/regamedll/dlls/multiplay_gamerules.cpp index 52dac5283..79c5636fb 100644 --- a/regamedll/dlls/multiplay_gamerules.cpp +++ b/regamedll/dlls/multiplay_gamerules.cpp @@ -4333,11 +4333,29 @@ LINK_HOOK_CLASS_CUSTOM_CHAIN(int, CHalfLifeMultiplay, CSGameRules, DeadPlayerWea int EXT_FUNC CHalfLifeMultiplay::__API_HOOK(DeadPlayerWeapons)(CBasePlayer *pPlayer) { - return GR_PLR_DROP_GUN_ACTIVE; +#ifdef REGAMEDLL_ADD + switch ((int)weapondrop.value) + { + case 3: + return GR_PLR_DROP_GUN_ALL; + case 2: + break; + case 1: + return GR_PLR_DROP_GUN_BEST; + default: + return GR_PLR_DROP_GUN_NO; + } +#endif + return GR_PLR_DROP_GUN_ACTIVE; // keep original value in return } int CHalfLifeMultiplay::DeadPlayerAmmo(CBasePlayer *pPlayer) { +#ifdef REGAMEDLL_ADD + if (ammodrop.value == 0.0f) + return GR_PLR_DROP_AMMO_NO; +#endif + return GR_PLR_DROP_AMMO_ACTIVE; } diff --git a/regamedll/dlls/player.cpp b/regamedll/dlls/player.cpp index a400f377f..cb99d5f7e 100644 --- a/regamedll/dlls/player.cpp +++ b/regamedll/dlls/player.cpp @@ -1303,7 +1303,14 @@ CWeaponBox *EXT_FUNC __API_HOOK(CreateWeaponBox)(CBasePlayerItem *pItem, CBasePl #else pWeaponBox->GiveAmmo(pPlayerOwner->m_rgAmmo[pItem->PrimaryAmmoIndex()], (char *)pItem->pszAmmo1(), pItem->iMaxAmmo1()); #endif +#ifndef REGAMEDLL_FIXES + // by removing ammo ONLY on exhaustible weapons (slot 4 and 5) + // you are allowing to duplicate ammo whenever: + // (1) you have 2 weapons sharing the same ammo type (e.g. mp5navy and glock) + // (2) you are dropping a weapon alive and pickup another (with same ammo type) without ammo + // and, logically, you throw your ammo with your gun with packing enabled if (exhaustibleAmmo) +#endif { pPlayerOwner->m_rgAmmo[pItem->PrimaryAmmoIndex()] = 0; } @@ -1315,10 +1322,10 @@ CWeaponBox *EXT_FUNC __API_HOOK(CreateWeaponBox)(CBasePlayerItem *pItem, CBasePl return pWeaponBox; } -void PackPlayerItem(CBasePlayer *pPlayer, CBasePlayerItem *pItem, bool packAmmo) +CWeaponBox *PackPlayerItem(CBasePlayer *pPlayer, CBasePlayerItem *pItem, bool packAmmo) { if (!pItem) - return; + return nullptr; const char *modelName = GetCSModelName(pItem->m_iId); if (modelName) @@ -1328,7 +1335,7 @@ void PackPlayerItem(CBasePlayer *pPlayer, CBasePlayerItem *pItem, bool packAmmo) Vector vecVelocity = pPlayer->pev->velocity * 0.75f; // create a box to pack the stuff into - CreateWeaponBox(pItem, pPlayer, + return CreateWeaponBox(pItem, pPlayer, modelName, vecOrigin, vecAngles, @@ -1336,6 +1343,8 @@ void PackPlayerItem(CBasePlayer *pPlayer, CBasePlayerItem *pItem, bool packAmmo) CGameRules::GetItemKillDelay(), packAmmo ); } + + return nullptr; } #ifdef REGAMEDLL_ADD @@ -1392,78 +1401,132 @@ void PackPlayerNade(CBasePlayer *pPlayer, CBasePlayerItem *pItem, bool packAmmo) void CBasePlayer::PackDeadPlayerItems() { // get the game rules - bool bPackGun = (g_pGameRules->DeadPlayerWeapons(this) != GR_PLR_DROP_GUN_NO); + int iPackGun = g_pGameRules->DeadPlayerWeapons(this); bool bPackAmmo = (g_pGameRules->DeadPlayerAmmo(this) != GR_PLR_DROP_AMMO_NO); - if (bPackGun) + if (iPackGun != GR_PLR_DROP_GUN_NO) { - bool bShieldDropped = false; + bool bSkipPrimSec = false; if (HasShield()) { DropShield(); - bShieldDropped = true; +#ifdef REGAMEDLL_ADD + if(iPackGun != GR_PLR_DROP_GUN_ALL) +#endif + { + bSkipPrimSec = true; + } } int nBestWeight = 0; CBasePlayerItem *pBestItem = nullptr; - for (int n = 0; n < MAX_ITEM_TYPES; n++) +#ifdef REGAMEDLL_ADD + int iGunsPacked = 0; + + if (iPackGun == GR_PLR_DROP_GUN_ACTIVE) { - // there's a weapon here. Should I pack it? - CBasePlayerItem *pPlayerItem = m_rgpPlayerItems[n]; + // check if we've just already dropped our active gun + if (!bSkipPrimSec && m_pActiveItem && m_pActiveItem->CanDrop() && m_pActiveItem->iItemSlot() < KNIFE_SLOT) + { + pBestItem = m_pActiveItem; - while (pPlayerItem) + // if active item is undroppable, then nothing is dropped + } + + // are we allowing nade drop? + if ((int)nadedrops.value >= 1) + { + // goto item loop but skip guns + iPackGun = GR_PLR_DROP_GUN_ALL; + bSkipPrimSec = true; + } + } + + if (iPackGun == GR_PLR_DROP_GUN_ALL || iPackGun == GR_PLR_DROP_GUN_BEST) +#endif + { + for (int n = 0; n < MAX_ITEM_TYPES; n++) { - ItemInfo info; - if (pPlayerItem->iItemSlot() < KNIFE_SLOT && !bShieldDropped) + // there's a weapon here. Should I pack it? + CBasePlayerItem *pPlayerItem = m_rgpPlayerItems[n]; + + while (pPlayerItem) { + ItemInfo info; + if (pPlayerItem->iItemSlot() < KNIFE_SLOT && !bSkipPrimSec) + { #ifdef REGAMEDLL_API - if (pPlayerItem->CSPlayerItem()->GetItemInfo(&info)) + if (pPlayerItem->CSPlayerItem()->GetItemInfo(&info) #else - if (pPlayerItem->GetItemInfo(&info)) + if (pPlayerItem->GetItemInfo(&info) #endif - { - if (info.iWeight > nBestWeight) +#ifdef REGAMEDLL_FIXES + && pPlayerItem->CanDrop() // needs to be droppable +#endif + ) { - nBestWeight = info.iWeight; - pBestItem = pPlayerItem; +#ifdef REGAMEDLL_ADD + if (iPackGun == GR_PLR_DROP_GUN_ALL) + { + CBasePlayerItem *pNext = pPlayerItem->m_pNext; + + CWeaponBox *pWeaponBox = PackPlayerItem(this, pPlayerItem, bPackAmmo); + if (pWeaponBox) + { + // just push a few units in forward to separate them + pWeaponBox->pev->velocity = pWeaponBox->pev->velocity * (1.0 + (iGunsPacked * 0.2)); + iGunsPacked++; + } + + pPlayerItem = pNext; + continue; + } +#endif + if (info.iWeight > nBestWeight) + { + nBestWeight = info.iWeight; + pBestItem = pPlayerItem; + } } } - } - // drop a grenade after death - else if (pPlayerItem->iItemSlot() == GRENADE_SLOT) - { - if (AreRunningCZero()) + // drop a grenade after death + else if (pPlayerItem->iItemSlot() == GRENADE_SLOT) { + if (AreRunningCZero()) + { #ifdef REGAMEDLL_FIXES - if (pPlayerItem->m_flStartThrow == 0.0f && m_rgAmmo[pPlayerItem->PrimaryAmmoIndex()] > 0) + if (pPlayerItem->m_flStartThrow == 0.0f && m_rgAmmo[pPlayerItem->PrimaryAmmoIndex()] > 0) #endif - { - PackPlayerItem(this, pPlayerItem, true); + { + PackPlayerItem(this, pPlayerItem, true); + } } - } #ifdef REGAMEDLL_ADD - else - { - switch ((int)nadedrops.value) - { - case 1: - PackPlayerNade(this, pPlayerItem, true); - break; - case 2: + else { - CBasePlayerItem *pNext = pPlayerItem->m_pNext; - PackPlayerNade(this, pPlayerItem, true); - pPlayerItem = pNext; - continue; - } + switch ((int)nadedrops.value) + { + case 1: + { + PackPlayerNade(this, pPlayerItem, true); + break; + } + case 2: + { + CBasePlayerItem *pNext = pPlayerItem->m_pNext; + PackPlayerNade(this, pPlayerItem, true); + pPlayerItem = pNext; + continue; + } + } } - } #endif - } + } - pPlayerItem = pPlayerItem->m_pNext; + pPlayerItem = pPlayerItem->m_pNext; + } } } @@ -2052,8 +2115,27 @@ void EXT_FUNC CBasePlayer::__API_HOOK(Killed)(entvars_t *pevAttacker, int iGib) } TheCareerTasks->HandleDeath(m_iTeam, this); + +#ifdef REGAMEDLL_FIXES + if (!m_bKilledByBomb) + { + CBasePlayer *pAttacker = CBasePlayer::Instance(pevAttacker); + + if(pAttacker /*safety*/ && !pAttacker->IsBot() && pAttacker->m_iTeam != m_iTeam) + { + if (pAttacker->HasShield()) + killerHasShield = true; + + if (IsBot() && IsBlind()) // dystopm: shouldn't be !IsBot() ? + wasBlind = true; + + TheCareerTasks->HandleEnemyKill(wasBlind, GetWeaponName(g_pevLastInflictor, pevAttacker), m_bHeadshotKilled, killerHasShield, pAttacker, this); // last 2 param swapped to match function definition + } + } +#endif } +#ifndef REGAMEDLL_FIXES if (!m_bKilledByBomb) { CBasePlayer *pAttacker = CBasePlayer::Instance(pevAttacker); @@ -2083,6 +2165,7 @@ void EXT_FUNC CBasePlayer::__API_HOOK(Killed)(entvars_t *pevAttacker, int iGib) } } } +#endif } if (!m_bKilledByBomb) @@ -6537,7 +6620,7 @@ void CBasePlayer::CheatImpulseCommands(int iImpulse) TraceResult tr; Vector dir(0, 0, 1); - UTIL_BloodDrips(pev->origin, dir, BLOOD_COLOR_RED, 2000); + UTIL_BloodDrips(pev->origin, BLOOD_COLOR_RED, 2000); for (int r = 1; r < 4; r++) { @@ -8040,13 +8123,21 @@ CBaseEntity *EXT_FUNC CBasePlayer::__API_HOOK(DropPlayerItem)(const char *pszIte Vector vecAngles = pev->angles; Vector vecVelocity = gpGlobals->v_forward * 300 + gpGlobals->v_forward * 100; + bool bPackAmmo = false; + +#ifdef REGAMEDLL_ADD + if (ammodrop.value >= 2.0f) + bPackAmmo = true; +#endif + CWeaponBox *pWeaponBox = CreateWeaponBox(pWeapon, this, modelname, vecOrigin, vecAngles, vecVelocity, CGameRules::GetItemKillDelay(), - false); + bPackAmmo + ); if (!pWeaponBox) { diff --git a/regamedll/dlls/util.cpp b/regamedll/dlls/util.cpp index ae9356be4..42250319f 100644 --- a/regamedll/dlls/util.cpp +++ b/regamedll/dlls/util.cpp @@ -1056,7 +1056,7 @@ void UTIL_BloodStream(const Vector &origin, const Vector &direction, int color, MESSAGE_END(); } -void UTIL_BloodDrips(const Vector &origin, const Vector &direction, int color, int amount) +void UTIL_BloodDrips(const Vector &origin, int color, int amount) { if (!UTIL_ShouldShowBlood(color)) return; diff --git a/regamedll/dlls/util.h b/regamedll/dlls/util.h index 6c4f411c8..edcf393cc 100644 --- a/regamedll/dlls/util.h +++ b/regamedll/dlls/util.h @@ -262,7 +262,7 @@ bool UTIL_IsMasterTriggered(string_t sMaster, CBaseEntity *pActivator); BOOL UTIL_ShouldShowBlood(int color); int UTIL_PointContents(const Vector &vec); void UTIL_BloodStream(const Vector &origin, const Vector &direction, int color, int amount); -void UTIL_BloodDrips(const Vector &origin, const Vector &direction, int color, int amount); +void UTIL_BloodDrips(const Vector &origin, int color, int amount); Vector UTIL_RandomBloodVector(); void UTIL_BloodDecalTrace(TraceResult *pTrace, int bloodColor); void UTIL_DecalTrace(TraceResult *pTrace, int decalNumber); diff --git a/regamedll/dlls/weapons.cpp b/regamedll/dlls/weapons.cpp index c599d7109..479d4da59 100644 --- a/regamedll/dlls/weapons.cpp +++ b/regamedll/dlls/weapons.cpp @@ -112,7 +112,7 @@ void AddMultiDamage(entvars_t *pevInflictor, CBaseEntity *pEntity, float flDamag void SpawnBlood(Vector vecSpot, int bloodColor, float flDamage) { - UTIL_BloodDrips(vecSpot, g_vecAttackDir, bloodColor, int(flDamage)); + UTIL_BloodDrips(vecSpot, bloodColor, int(flDamage)); } NOXREF int DamageDecal(CBaseEntity *pEntity, int bitsDamageType) @@ -762,7 +762,9 @@ void CBasePlayerWeapon::FireRemaining(int &shotsFired, float &shootTime, BOOL bI if (bIsGlock) { vecDir = m_pPlayer->FireBullets3(vecSrc, gpGlobals->v_forward, 0.05, 8192, 1, BULLET_PLAYER_9MM, 18, 0.9, m_pPlayer->pev, true, m_pPlayer->random_seed); +#ifndef REGAMEDLL_FIXES --m_pPlayer->ammo_9mm; +#endif PLAYBACK_EVENT_FULL(flag, m_pPlayer->edict(), m_usFireGlock18, 0, (float *)&g_vecZero, (float *)&g_vecZero, vecDir.x, vecDir.y, int(m_pPlayer->pev->punchangle.x * 10000), int(m_pPlayer->pev->punchangle.y * 10000), m_iClip == 0, FALSE); @@ -771,7 +773,9 @@ void CBasePlayerWeapon::FireRemaining(int &shotsFired, float &shootTime, BOOL bI { vecDir = m_pPlayer->FireBullets3(vecSrc, gpGlobals->v_forward, m_fBurstSpread, 8192, 2, BULLET_PLAYER_556MM, 30, 0.96, m_pPlayer->pev, false, m_pPlayer->random_seed); +#ifndef REGAMEDLL_FIXES --m_pPlayer->ammo_556nato; +#endif #ifdef REGAMEDLL_ADD // HACKHACK: client-side weapon prediction fix diff --git a/regamedll/dlls/weapons.h b/regamedll/dlls/weapons.h index 5c0280258..8fde597a6 100644 --- a/regamedll/dlls/weapons.h +++ b/regamedll/dlls/weapons.h @@ -1150,16 +1150,16 @@ class CHEGrenade: public CBasePlayerWeapon unsigned short m_usCreateExplosion; }; - -const float KNIFE_BODYHIT_VOLUME = 128.0f; -const float KNIFE_WALLHIT_VOLUME = 512.0f; -const float KNIFE_MAX_SPEED = 250.0f; -const float KNIFE_MAX_SPEED_SHIELD = 180.0f; -const float KNIFE_STAB_DAMAGE = 65.0f; -const float KNIFE_SWING_DAMAGE = 15.0f; -const float KNIFE_SWING_DAMAGE_FAST = 20.0f; -const float KNIFE_STAB_DISTANCE = 32.0f; -const float KNIFE_SWING_DISTANCE = 48.0f; +const float KNIFE_BODYHIT_VOLUME = 128.0f; +const float KNIFE_WALLHIT_VOLUME = 512.0f; +const float KNIFE_MAX_SPEED = 250.0f; +const float KNIFE_MAX_SPEED_SHIELD = 180.0f; +const float KNIFE_STAB_DAMAGE = 65.0f; +const float KNIFE_SWING_DAMAGE = 15.0f; +const float KNIFE_SWING_DAMAGE_FAST = 20.0f; +const float KNIFE_STAB_DISTANCE = 32.0f; +const float KNIFE_SWING_DISTANCE = 48.0f; +const float KNIFE_BACKSTAB_MULTIPLIER = 3.0f; enum knife_e { @@ -1220,19 +1220,41 @@ class CKnife: public CBasePlayerWeapon void SetPlayerShieldAnim(); void ResetPlayerShieldAnim(); + float KnifeStabDamage() const; + float KnifeSwingDamage(bool fast) const; + float KnifeStabDistance() const; + float KnifeSwingDistance() const; + float KnifeBackStabMultiplier() const; + private: TraceResult m_trHit; unsigned short m_usKnife; - // Extra RegameDLL features +#ifdef REGAMEDLL_API float m_flStabBaseDamage; float m_flSwingBaseDamage; float m_flSwingBaseDamage_Fast; float m_flStabDistance; float m_flSwingDistance; + + float m_flBackStabMultiplier; +#endif }; +#ifdef REGAMEDLL_API +inline float CKnife::KnifeStabDamage() const { return m_flStabBaseDamage; } +inline float CKnife::KnifeSwingDamage(bool fast) const { return fast ? m_flSwingBaseDamage_Fast : m_flSwingBaseDamage; } +inline float CKnife::KnifeStabDistance() const { return m_flStabDistance; } +inline float CKnife::KnifeSwingDistance() const { return m_flSwingDistance; } +inline float CKnife::KnifeBackStabMultiplier() const { return m_flBackStabMultiplier; } +#else +inline float CKnife::KnifeStabDamage() const { return KNIFE_STAB_DAMAGE; } +inline float CKnife::KnifeSwingDamage(bool fast) const { return fast ? KNIFE_SWING_DAMAGE_FAST : KNIFE_SWING_DAMAGE; } +inline float CKnife::KnifeStabDistance() const { return KNIFE_STAB_DISTANCE; } +inline float CKnife::KnifeSwingDistance() const { return KNIFE_SWING_DISTANCE; } +inline float CKnife::KnifeBackStabMultiplier() const { return KNIFE_BACKSTAB_MULTIPLIER; } +#endif // REGAMEDLL_API const float M249_MAX_SPEED = 220.0f; const float M249_DAMAGE = 32.0f; diff --git a/regamedll/dlls/wpn_shared/wpn_knife.cpp b/regamedll/dlls/wpn_shared/wpn_knife.cpp index 57054857e..bcef6a385 100644 --- a/regamedll/dlls/wpn_shared/wpn_knife.cpp +++ b/regamedll/dlls/wpn_shared/wpn_knife.cpp @@ -12,13 +12,15 @@ void CKnife::Spawn() m_iWeaponState &= ~WPNSTATE_SHIELD_DRAWN; m_iClip = WEAPON_NOCLIP; +#ifdef REGAMEDLL_API m_flStabBaseDamage = KNIFE_STAB_DAMAGE; m_flSwingBaseDamage = KNIFE_SWING_DAMAGE; m_flSwingBaseDamage_Fast = KNIFE_SWING_DAMAGE_FAST; m_flStabDistance = KNIFE_STAB_DISTANCE; m_flSwingDistance = KNIFE_SWING_DISTANCE; - +#endif + // Get ready to fall down FallInit(); @@ -44,12 +46,14 @@ void CKnife::Precache() m_usKnife = PRECACHE_EVENT(1, "events/knife.sc"); +#ifdef REGAMEDLL_API m_flStabBaseDamage = KNIFE_STAB_DAMAGE; m_flSwingBaseDamage = KNIFE_SWING_DAMAGE; m_flSwingBaseDamage_Fast = KNIFE_SWING_DAMAGE_FAST; m_flStabDistance = KNIFE_STAB_DISTANCE; m_flSwingDistance = KNIFE_SWING_DISTANCE; +#endif } int CKnife::GetItemInfo(ItemInfo *p) @@ -123,6 +127,9 @@ void FindHullIntersection(const Vector &vecSrc, TraceResult &tr, float *mins, fl distance = 1e6f; vecHullEnd = vecSrc + ((vecHullEnd - vecSrc) * 2); +#ifdef REGAMEDLL_ADD + gpGlobals->trace_flags = FTRACE_KNIFE; +#endif UTIL_TraceLine(vecSrc, vecHullEnd, dont_ignore_monsters, pEntity, &tmpTrace); if (tmpTrace.flFraction < 1.0f) @@ -140,7 +147,9 @@ void FindHullIntersection(const Vector &vecSrc, TraceResult &tr, float *mins, fl vecEnd.x = vecHullEnd.x + minmaxs[i][0]; vecEnd.y = vecHullEnd.y + minmaxs[j][1]; vecEnd.z = vecHullEnd.z + minmaxs[k][2]; - +#ifdef REGAMEDLL_ADD + gpGlobals->trace_flags = FTRACE_KNIFE; +#endif UTIL_TraceLine(vecSrc, vecEnd, dont_ignore_monsters, pEntity, &tmpTrace); if (tmpTrace.flFraction < 1.0f) @@ -168,14 +177,7 @@ void CKnife::SetPlayerShieldAnim() if (!m_pPlayer->HasShield()) return; - if (m_iWeaponState & WPNSTATE_SHIELD_DRAWN) - { - Q_strcpy(m_pPlayer->m_szAnimExtention, "shield"); - } - else - { - Q_strcpy(m_pPlayer->m_szAnimExtention, "shieldknife"); - } + Q_strcpy(m_pPlayer->m_szAnimExtention, (m_iWeaponState & WPNSTATE_SHIELD_DRAWN) != 0 ? "shield" : "shieldknife"); } void CKnife::ResetPlayerShieldAnim() @@ -273,14 +275,23 @@ BOOL CKnife::Swing(BOOL fFirst) UTIL_MakeVectors(m_pPlayer->pev->v_angle); vecSrc = m_pPlayer->GetGunPosition(); - vecEnd = vecSrc + gpGlobals->v_forward * m_flSwingDistance; + vecEnd = vecSrc + gpGlobals->v_forward * KnifeSwingDistance(); +#ifdef REGAMEDLL_ADD + gpGlobals->trace_flags = FTRACE_KNIFE; +#endif UTIL_TraceLine(vecSrc, vecEnd, dont_ignore_monsters, m_pPlayer->edict(), &tr); if (tr.flFraction >= 1.0f) { +#ifdef REGAMEDLL_ADD + gpGlobals->trace_flags = FTRACE_KNIFE; +#endif UTIL_TraceHull(vecSrc, vecEnd, dont_ignore_monsters, head_hull, m_pPlayer->edict(), &tr); - +#ifdef REGAMEDLL_ADD + // We manually reset it because Engine doesn't unlike TraceLine + gpGlobals->trace_flags = 0; +#endif if (tr.flFraction < 1.0f) { // Calculate the point of intersection of the line (or hull) and the object we hit @@ -305,8 +316,8 @@ BOOL CKnife::Swing(BOOL fFirst) { switch ((m_iSwing++) % 2) { - case 0: SendWeaponAnim(KNIFE_MIDATTACK1HIT, UseDecrement() != FALSE); break; - case 1: SendWeaponAnim(KNIFE_MIDATTACK2HIT, UseDecrement() != FALSE); break; + case 0: SendWeaponAnim(KNIFE_MIDATTACK1HIT, UseDecrement() != FALSE); break; + case 1: SendWeaponAnim(KNIFE_MIDATTACK2HIT, UseDecrement() != FALSE); break; } // miss @@ -324,10 +335,15 @@ BOOL CKnife::Swing(BOOL fFirst) m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 2.0f; // play wiff or swish sound - if (RANDOM_LONG(0, 1)) - EMIT_SOUND_DYN(m_pPlayer->edict(), CHAN_WEAPON, "weapons/knife_slash1.wav", VOL_NORM, ATTN_NORM, 0, 94); - else - EMIT_SOUND_DYN(m_pPlayer->edict(), CHAN_WEAPON, "weapons/knife_slash2.wav", VOL_NORM, ATTN_NORM, 0, 94); + EMIT_SOUND_DYN(m_pPlayer->edict(), + CHAN_WEAPON, + RANDOM_LONG(0, 1) ? + "weapons/knife_slash1.wav" : + "weapons/knife_slash2.wav", + VOL_NORM, + ATTN_NORM, + 0, + 94); // player "shoot" animation m_pPlayer->SetAnimation(PLAYER_ATTACK1); @@ -342,8 +358,8 @@ BOOL CKnife::Swing(BOOL fFirst) { switch ((m_iSwing++) % 2) { - case 0: SendWeaponAnim(KNIFE_MIDATTACK1HIT, UseDecrement() != FALSE); break; - case 1: SendWeaponAnim(KNIFE_MIDATTACK2HIT, UseDecrement() != FALSE); break; + case 0: SendWeaponAnim(KNIFE_MIDATTACK1HIT, UseDecrement() != FALSE); break; + case 1: SendWeaponAnim(KNIFE_MIDATTACK2HIT, UseDecrement() != FALSE); break; } m_flNextPrimaryAttack = GetNextAttackDelay(0.4); @@ -370,10 +386,11 @@ BOOL CKnife::Swing(BOOL fFirst) m_pPlayer->SetAnimation(PLAYER_ATTACK1); ClearMultiDamage(); - if (m_flNextPrimaryAttack + 0.4f < UTIL_WeaponTimeBase()) - pEntity->TraceAttack(m_pPlayer->pev, m_flSwingBaseDamage_Fast, gpGlobals->v_forward, &tr, (DMG_NEVERGIB | DMG_BULLET)); - else - pEntity->TraceAttack(m_pPlayer->pev, m_flSwingBaseDamage, gpGlobals->v_forward, &tr, (DMG_NEVERGIB | DMG_BULLET)); + pEntity->TraceAttack(m_pPlayer->pev, + KnifeSwingDamage(m_flNextPrimaryAttack + 0.4f < UTIL_WeaponTimeBase()), + gpGlobals->v_forward, + &tr, + (DMG_NEVERGIB | DMG_BULLET)); ApplyMultiDamage(m_pPlayer->pev, m_pPlayer->pev); @@ -381,28 +398,27 @@ BOOL CKnife::Swing(BOOL fFirst) if (pEntity) // -V595 #endif { + if (pEntity->Classify() != CLASS_NONE && pEntity->Classify() != CLASS_MACHINE #ifdef REGAMEDLL_FIXES - if (pEntity->Classify() != CLASS_NONE && pEntity->Classify() != CLASS_MACHINE && pEntity->Classify() != CLASS_VEHICLE) -#else - if (pEntity->Classify() != CLASS_NONE && pEntity->Classify() != CLASS_MACHINE) + && pEntity->Classify() != CLASS_VEHICLE #endif + ) { // play thwack or smack sound switch (RANDOM_LONG(0, 3)) { - case 0: EMIT_SOUND(m_pPlayer->edict(), CHAN_WEAPON, "weapons/knife_hit1.wav", VOL_NORM, ATTN_NORM); break; - case 1: EMIT_SOUND(m_pPlayer->edict(), CHAN_WEAPON, "weapons/knife_hit2.wav", VOL_NORM, ATTN_NORM); break; - case 2: EMIT_SOUND(m_pPlayer->edict(), CHAN_WEAPON, "weapons/knife_hit3.wav", VOL_NORM, ATTN_NORM); break; - case 3: EMIT_SOUND(m_pPlayer->edict(), CHAN_WEAPON, "weapons/knife_hit4.wav", VOL_NORM, ATTN_NORM); break; + case 0: EMIT_SOUND(m_pPlayer->edict(), CHAN_WEAPON, "weapons/knife_hit1.wav", VOL_NORM, ATTN_NORM); break; + case 1: EMIT_SOUND(m_pPlayer->edict(), CHAN_WEAPON, "weapons/knife_hit2.wav", VOL_NORM, ATTN_NORM); break; + case 2: EMIT_SOUND(m_pPlayer->edict(), CHAN_WEAPON, "weapons/knife_hit3.wav", VOL_NORM, ATTN_NORM); break; + case 3: EMIT_SOUND(m_pPlayer->edict(), CHAN_WEAPON, "weapons/knife_hit4.wav", VOL_NORM, ATTN_NORM); break; } m_pPlayer->m_iWeaponVolume = KNIFE_BODYHIT_VOLUME; if (!pEntity->IsAlive()) return TRUE; - else - flVol = 0.1f; + flVol = 0.1f; fHitWorld = FALSE; } } @@ -451,14 +467,22 @@ BOOL CKnife::Stab(BOOL fFirst) UTIL_MakeVectors(m_pPlayer->pev->v_angle); vecSrc = m_pPlayer->GetGunPosition(); - vecEnd = vecSrc + gpGlobals->v_forward * m_flStabDistance; - + vecEnd = vecSrc + gpGlobals->v_forward * KnifeStabDistance(); +#ifdef REGAMEDLL_ADD + gpGlobals->trace_flags = FTRACE_KNIFE; +#endif UTIL_TraceLine(vecSrc, vecEnd, dont_ignore_monsters, m_pPlayer->edict(), &tr); if (tr.flFraction >= 1.0f) { +#ifdef REGAMEDLL_ADD + gpGlobals->trace_flags = FTRACE_KNIFE; +#endif UTIL_TraceHull(vecSrc, vecEnd, dont_ignore_monsters, head_hull, m_pPlayer->edict(), &tr); - +#ifdef REGAMEDLL_ADD + // We manually reset it because Engine doesn't unlike TraceLine + gpGlobals->trace_flags = 0; +#endif if (tr.flFraction < 1.0f) { // Calculate the point of intersection of the line (or hull) and the object we hit @@ -488,10 +512,15 @@ BOOL CKnife::Stab(BOOL fFirst) m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 1.0f; // play wiff or swish sound - if (RANDOM_LONG(0, 1)) - EMIT_SOUND_DYN(m_pPlayer->edict(), CHAN_WEAPON, "weapons/knife_slash1.wav", VOL_NORM, ATTN_NORM, 0, 94); - else - EMIT_SOUND_DYN(m_pPlayer->edict(), CHAN_WEAPON, "weapons/knife_slash2.wav", VOL_NORM, ATTN_NORM, 0, 94); + EMIT_SOUND_DYN(m_pPlayer->edict(), + CHAN_WEAPON, + RANDOM_LONG(0, 1) ? + "weapons/knife_slash1.wav" : + "weapons/knife_slash2.wav", + VOL_NORM, + ATTN_NORM, + 0, + 94); // player "shoot" animation m_pPlayer->SetAnimation(PLAYER_ATTACK1); @@ -519,7 +548,7 @@ BOOL CKnife::Stab(BOOL fFirst) // player "shoot" animation m_pPlayer->SetAnimation(PLAYER_ATTACK1); - float flDamage = m_flStabBaseDamage; + float flDamage = KnifeStabDamage(); if (pEntity && pEntity->IsPlayer()) { @@ -534,10 +563,10 @@ BOOL CKnife::Stab(BOOL fFirst) flDot = DotProduct(vec2LOS, gpGlobals->v_forward.Make2D()); - //Triple the damage if we are stabbing them in the back. + // Multiply the damage if we are stabbing them in the back. if (flDot > 0.80f) { - flDamage *= 3.0f; + flDamage *= KnifeBackStabMultiplier(); } } @@ -551,11 +580,11 @@ BOOL CKnife::Stab(BOOL fFirst) if (pEntity) // -V595 #endif { + if (pEntity->Classify() != CLASS_NONE && pEntity->Classify() != CLASS_MACHINE #ifdef REGAMEDLL_FIXES - if (pEntity->Classify() != CLASS_NONE && pEntity->Classify() != CLASS_MACHINE && pEntity->Classify() != CLASS_VEHICLE) -#else - if (pEntity->Classify() != CLASS_NONE && pEntity->Classify() != CLASS_MACHINE) + && pEntity->Classify() != CLASS_VEHICLE #endif + ) { EMIT_SOUND(m_pPlayer->edict(), CHAN_WEAPON, "weapons/knife_stab.wav", VOL_NORM, ATTN_NORM); m_pPlayer->m_iWeaponVolume = KNIFE_BODYHIT_VOLUME; diff --git a/regamedll/game_shared/bot/bot_util.cpp b/regamedll/game_shared/bot/bot_util.cpp index d14aaaeba..06b5b526f 100644 --- a/regamedll/game_shared/bot/bot_util.cpp +++ b/regamedll/game_shared/bot/bot_util.cpp @@ -613,6 +613,12 @@ void CONSOLE_ECHO_LOGGED(const char *pszMsg, ...) void BotPrecache() { +#ifdef REGAMEDLL_FIXES + // all resources above are used between navarea, improved bots and tutor + // you can run cs1.6 with bots so it's not only limited to czero + if (!AreRunningCZero() && !AreBotsAllowed()) + return; +#endif s_iBeamSprite = PRECACHE_MODEL("sprites/smoke.spr"); PRECACHE_SOUND("buttons/bell1.wav"); @@ -622,7 +628,11 @@ void BotPrecache() PRECACHE_SOUND("buttons/latchunlocked2.wav"); PRECACHE_SOUND("buttons/lightswitch2.wav"); PRECACHE_SOUND("ambience/quail1.wav"); - +#ifdef REGAMEDLL_FIXES + PRECACHE_GENERIC("sound/ambience/quail1.wav"); +#else + PRECACHE_SOUND("ambience/quail1.wav"); // not used internally +#endif PRECACHE_SOUND("events/tutor_msg.wav"); PRECACHE_SOUND("events/enemy_died.wav"); PRECACHE_SOUND("events/friend_died.wav"); From cc15c9a6d2165314db8a88d5730f693ec9ef0bb1 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Mon, 24 Jul 2023 13:38:23 +0200 Subject: [PATCH 100/100] [Personal v1] Merge last changes till commit #600. (#11) * Update wpn_knife.cpp. * New CVar: mp_dying_time. * Shield constants code cleaning. * Adjust gib's velocity limit according to sv_maxvelocity. * API: Implement PM_LadderMove hook. * TutorMessageEvent::GetNextParameter: Fixed corrupted stack. * Enable location feature if bots allowed or listen server is running. * mp_fadetoblack 2 fade timings now depends from mp_dying_time CVar and code fixes. --- README.md | 1 + dist/game.cfg | 8 +++ regamedll/dlls/API/CAPI_Impl.cpp | 1 + regamedll/dlls/API/CAPI_Impl.h | 6 ++ regamedll/dlls/API/CSPlayer.cpp | 2 +- regamedll/dlls/animating.cpp | 5 ++ regamedll/dlls/animation.cpp | 15 ++++ regamedll/dlls/animation.h | 1 + regamedll/dlls/cbase.h | 1 + regamedll/dlls/client.cpp | 2 +- regamedll/dlls/combat.cpp | 2 +- regamedll/dlls/game.cpp | 2 + regamedll/dlls/game.h | 1 + regamedll/dlls/gamerules.h | 42 ++++++----- regamedll/dlls/gib.cpp | 9 +-- regamedll/dlls/multiplay_gamerules.cpp | 6 +- regamedll/dlls/observer.cpp | 4 +- regamedll/dlls/observer.h | 6 ++ regamedll/dlls/player.cpp | 70 ++++++++++++++----- regamedll/dlls/player.h | 1 + regamedll/dlls/tutor_base_tutor.cpp | 2 +- regamedll/dlls/weapons.h | 32 ++++++++- regamedll/dlls/weapontype.h | 19 +---- regamedll/dlls/wpn_shared/wpn_deagle.cpp | 4 +- regamedll/dlls/wpn_shared/wpn_fiveseven.cpp | 4 +- regamedll/dlls/wpn_shared/wpn_flashbang.cpp | 4 +- regamedll/dlls/wpn_shared/wpn_glock18.cpp | 2 +- regamedll/dlls/wpn_shared/wpn_hegrenade.cpp | 4 +- regamedll/dlls/wpn_shared/wpn_knife.cpp | 6 +- regamedll/dlls/wpn_shared/wpn_p228.cpp | 2 +- .../dlls/wpn_shared/wpn_smokegrenade.cpp | 4 +- regamedll/dlls/wpn_shared/wpn_usp.cpp | 2 +- regamedll/pm_shared/pm_shared.cpp | 4 +- regamedll/pm_shared/pm_shared.h | 2 + regamedll/public/regamedll/regamedll_api.h | 5 ++ 35 files changed, 199 insertions(+), 82 deletions(-) diff --git a/README.md b/README.md index b39fcf65e..6bbb686a6 100644 --- a/README.md +++ b/README.md @@ -109,6 +109,7 @@ This means that plugins that do binary code analysis (Orpheu for example) probab | mp_give_c4_frags | 3 | - | - | How many bonuses (frags) will get the player who defused or exploded the bomb. | | mp_hostages_rescued_ratio | 1.0 | 0.0 | 1.0 | Ratio of hostages rescued to win the round. | | mp_legacy_vehicle_block | 1 | 0 | 1 | Legacy func_vehicle behavior when blocked by another entity.
`0` New behavior
`1` Legacy behavior | +| mp_dying_time | 3.0 | 0.0 | - | Time for switch to free observing after death.
`0` - disable spectating around death.
`>0.00001` - time delay to start spectate.
`NOTE`: The countdown starts when the player’s death animation is finished.| ## How to install zBot for CS 1.6? diff --git a/dist/game.cfg b/dist/game.cfg index 0a3545441..4443b3255 100644 --- a/dist/game.cfg +++ b/dist/game.cfg @@ -521,3 +521,11 @@ mp_hostages_rescued_ratio "1.0" // // Default value: "1" mp_legacy_vehicle_block "1" + +// Time for switch to free observing after death. +// NOTE: The countdown starts when the player’s death animation is finished. +// 0 - disable spectating around death +// >0.00001 - time delay to start spectate +// +// Default value: "3.0" +mp_dying_time "3.0" diff --git a/regamedll/dlls/API/CAPI_Impl.cpp b/regamedll/dlls/API/CAPI_Impl.cpp index 80f57e43e..d0d8813cd 100644 --- a/regamedll/dlls/API/CAPI_Impl.cpp +++ b/regamedll/dlls/API/CAPI_Impl.cpp @@ -212,6 +212,7 @@ GAMEHOOK_REGISTRY(CBasePlayer_DeathSound); GAMEHOOK_REGISTRY(CBasePlayer_JoiningThink); GAMEHOOK_REGISTRY(FreeGameRules); +GAMEHOOK_REGISTRY(PM_LadderMove); int CReGameApi::GetMajorVersion() { return REGAMEDLL_API_VERSION_MAJOR; diff --git a/regamedll/dlls/API/CAPI_Impl.h b/regamedll/dlls/API/CAPI_Impl.h index d33abdca8..80e524975 100644 --- a/regamedll/dlls/API/CAPI_Impl.h +++ b/regamedll/dlls/API/CAPI_Impl.h @@ -645,6 +645,10 @@ typedef IHookChainRegistryClassImpl CReGameHookRegistry_CBase typedef IHookChainImpl CReGameHook_FreeGameRules; typedef IHookChainRegistryImpl CReGameHookRegistry_FreeGameRules; +// PM_LadderMove hook +typedef IHookChainImpl CReGameHook_PM_LadderMove; +typedef IHookChainRegistryImpl CReGameHookRegistry_PM_LadderMove; + class CReGameHookchains: public IReGameHookchains { public: // CBasePlayer virtual @@ -779,6 +783,7 @@ class CReGameHookchains: public IReGameHookchains { CReGameHookRegistry_CBasePlayer_JoiningThink m_CBasePlayer_JoiningThink; CReGameHookRegistry_FreeGameRules m_FreeGameRules; + CReGameHookRegistry_PM_LadderMove m_PM_LadderMove; public: virtual IReGameHookRegistry_CBasePlayer_Spawn *CBasePlayer_Spawn(); @@ -912,6 +917,7 @@ class CReGameHookchains: public IReGameHookchains { virtual IReGameHookRegistry_CBasePlayer_JoiningThink *CBasePlayer_JoiningThink(); virtual IReGameHookRegistry_FreeGameRules *FreeGameRules(); + virtual IReGameHookRegistry_PM_LadderMove *PM_LadderMove(); }; C_DLLEXPORT CReGameHookchains g_ReGameHookchains; diff --git a/regamedll/dlls/API/CSPlayer.cpp b/regamedll/dlls/API/CSPlayer.cpp index b81b95f6a..50ec3478a 100644 --- a/regamedll/dlls/API/CSPlayer.cpp +++ b/regamedll/dlls/API/CSPlayer.cpp @@ -63,7 +63,7 @@ EXT_FUNC bool CCSPlayer::JoinTeam(TeamName team) pPlayer->StartObserver(pentSpawnSpot->v.origin, pentSpawnSpot->v.angles); // do we have fadetoblack on? (need to fade their screen back in) - if (fadetoblack.value) + if (fadetoblack.value == FADETOBLACK_STAY) { UTIL_ScreenFade(pPlayer, Vector(0, 0, 0), 0.001, 0, 0, FFADE_IN); } diff --git a/regamedll/dlls/animating.cpp b/regamedll/dlls/animating.cpp index 8e7d84334..9e104f22e 100644 --- a/regamedll/dlls/animating.cpp +++ b/regamedll/dlls/animating.cpp @@ -179,6 +179,11 @@ NOXREF int CBaseAnimating::GetBodygroup(int iGroup) return ::GetBodygroup(GET_MODEL_PTR(ENT(pev)), pev, iGroup); } +float CBaseAnimating::GetSequenceDuration() const +{ + return ::GetSequenceDuration(GET_MODEL_PTR(ENT(pev)), pev); +} + int CBaseAnimating::ExtractBbox(int sequence, float *mins, float *maxs) { return ::ExtractBbox(GET_MODEL_PTR(ENT(pev)), sequence, mins, maxs); diff --git a/regamedll/dlls/animation.cpp b/regamedll/dlls/animation.cpp index 83c0bd403..7018396aa 100644 --- a/regamedll/dlls/animation.cpp +++ b/regamedll/dlls/animation.cpp @@ -246,6 +246,21 @@ void GetSequenceInfo(void *pmodel, entvars_t *pev, float *pflFrameRate, float *p *pflGroundSpeed = *pflGroundSpeed * pseqdesc->fps / (pseqdesc->numframes - 1); } +float GetSequenceDuration(void *pmodel, entvars_t *pev) +{ + studiohdr_t *pstudiohdr = (studiohdr_t *)pmodel; + if (!pstudiohdr) + return 0; // model ptr is not valid + + if (pev->sequence < 0 || pev->sequence >= pstudiohdr->numseq) + return 0; // sequence is not valid + + // get current sequence time + mstudioseqdesc_t *pseqdesc = (mstudioseqdesc_t *)((byte *)pstudiohdr + pstudiohdr->seqindex) + int(pev->sequence); + + return pseqdesc->numframes / pseqdesc->fps; +} + int GetSequenceFlags(void *pmodel, entvars_t *pev) { studiohdr_t *pstudiohdr = (studiohdr_t *)pmodel; diff --git a/regamedll/dlls/animation.h b/regamedll/dlls/animation.h index 54af21a8c..7889a140b 100644 --- a/regamedll/dlls/animation.h +++ b/regamedll/dlls/animation.h @@ -42,6 +42,7 @@ int LookupActivity(void *pmodel, entvars_t *pev, int activity); int LookupActivityHeaviest(void *pmodel, entvars_t *pev, int activity); int LookupSequence(void *pmodel, const char *label); void GetSequenceInfo(void *pmodel, entvars_t *pev, float *pflFrameRate, float *pflGroundSpeed); +float GetSequenceDuration(void *pmodel, entvars_t *pev); int GetSequenceFlags(void *pmodel, entvars_t *pev); float SetController(void *pmodel, entvars_t *pev, int iController, float flValue); float SetBlending(void *pmodel, entvars_t *pev, int iBlender, float flValue); diff --git a/regamedll/dlls/cbase.h b/regamedll/dlls/cbase.h index 1e11bbeef..146245c76 100644 --- a/regamedll/dlls/cbase.h +++ b/regamedll/dlls/cbase.h @@ -369,6 +369,7 @@ class CBaseAnimating: public CBaseDelay { float SetBoneController(int iController, float flValue = 0.0f); void InitBoneControllers(); + float GetSequenceDuration() const; float SetBlending(int iBlender, float flValue); void GetBonePosition(int iBone, Vector &origin, Vector &angles); void GetAutomovement(Vector &origin, Vector &angles, float flInterval = 0.1f); diff --git a/regamedll/dlls/client.cpp b/regamedll/dlls/client.cpp index 7a7e983d9..646270c4e 100644 --- a/regamedll/dlls/client.cpp +++ b/regamedll/dlls/client.cpp @@ -1915,7 +1915,7 @@ BOOL EXT_FUNC __API_HOOK(HandleMenu_ChooseTeam)(CBasePlayer *pPlayer, int slot) MESSAGE_END(); #endif // do we have fadetoblack on? (need to fade their screen back in) - if (fadetoblack.value) + if (fadetoblack.value == FADETOBLACK_STAY) { UTIL_ScreenFade(pPlayer, Vector(0, 0, 0), 0.001, 0, 0, FFADE_IN); } diff --git a/regamedll/dlls/combat.cpp b/regamedll/dlls/combat.cpp index 620c84cfd..390c8d613 100644 --- a/regamedll/dlls/combat.cpp +++ b/regamedll/dlls/combat.cpp @@ -4,7 +4,7 @@ void PlayerBlind(CBasePlayer *pPlayer, entvars_t *pevInflictor, entvars_t *pevAt { UTIL_ScreenFade(pPlayer, color, fadeTime, fadeHold, alpha, 0); - if (!fadetoblack.value) + if (fadetoblack.value != FADETOBLACK_STAY) { for (int i = 1; i <= gpGlobals->maxClients; i++) { diff --git a/regamedll/dlls/game.cpp b/regamedll/dlls/game.cpp index 8b6b632c0..428d1211b 100644 --- a/regamedll/dlls/game.cpp +++ b/regamedll/dlls/game.cpp @@ -168,6 +168,7 @@ cvar_t plant_c4_anywhere = { "mp_plant_c4_anywhere", "0", 0, 0.0 cvar_t give_c4_frags = { "mp_give_c4_frags", "3", 0, 3.0f, nullptr }; cvar_t hostages_rescued_ratio = { "mp_hostages_rescued_ratio", "1.0", 0, 1.0f, nullptr }; cvar_t legacy_vehicle_block = { "mp_legacy_vehicle_block", "1", 0, 0.0f, nullptr }; +cvar_t dying_time = { "mp_dying_time", "3.0", 0, 3.0f, nullptr }; // Note: Just for my plugins & cie. cvar_t game_version_personnal = { "game_version_personnal", "1.3.0-public-AMXModDev", FCVAR_SERVER, 0.0f, nullptr }; @@ -418,6 +419,7 @@ void EXT_FUNC GameDLLInit() CVAR_REGISTER(&give_c4_frags); CVAR_REGISTER(&hostages_rescued_ratio); CVAR_REGISTER(&legacy_vehicle_block); + CVAR_REGISTER(&dying_time); CVAR_REGISTER(&game_version_personnal); diff --git a/regamedll/dlls/game.h b/regamedll/dlls/game.h index a0e549db6..8705ad9cf 100644 --- a/regamedll/dlls/game.h +++ b/regamedll/dlls/game.h @@ -194,6 +194,7 @@ extern cvar_t plant_c4_anywhere; extern cvar_t give_c4_frags; extern cvar_t hostages_rescued_ratio; extern cvar_t legacy_vehicle_block; +extern cvar_t dying_time; extern cvar_t game_version_personnal; diff --git a/regamedll/dlls/gamerules.h b/regamedll/dlls/gamerules.h index d6975df02..aba746ed3 100644 --- a/regamedll/dlls/gamerules.h +++ b/regamedll/dlls/gamerules.h @@ -31,21 +31,22 @@ #include "game_shared/voice_gamemgr.h" #include "cmdhandler.h" -const int MAX_RULE_BUFFER = 1024; -const int MAX_VOTE_MAPS = 100; -const int MAX_VIP_QUEUES = 5; -const int MAX_MONEY_THRESHOLD = 999999; // allowable money limit in the game that can be drawn on the HUD - -const int MAX_MOTD_CHUNK = 60; -const int MAX_MOTD_LENGTH = 1536; // (MAX_MOTD_CHUNK * 4) - -const float ITEM_RESPAWN_TIME = 30.0f; -const float WEAPON_RESPAWN_TIME = 20.0f; -const float AMMO_RESPAWN_TIME = 20.0f; -const float ROUND_RESPAWN_TIME = 20.0f; -const float ROUND_BEGIN_DELAY = 5.0f; // delay before beginning new round -const float ITEM_KILL_DELAY = 300.0f; -const float RADIO_TIMEOUT = 1.5f; +const int MAX_RULE_BUFFER = 1024; +const int MAX_VOTE_MAPS = 100; +const int MAX_VIP_QUEUES = 5; +const int MAX_MONEY_THRESHOLD = 999999; // allowable money limit in the game that can be drawn on the HUD + +const int MAX_MOTD_CHUNK = 60; +const int MAX_MOTD_LENGTH = 1536; // (MAX_MOTD_CHUNK * 4) + +const float ITEM_RESPAWN_TIME = 30.0f; +const float WEAPON_RESPAWN_TIME = 20.0f; +const float AMMO_RESPAWN_TIME = 20.0f; +const float ROUND_RESPAWN_TIME = 20.0f; +const float ROUND_BEGIN_DELAY = 5.0f; // delay before beginning new round +const float ITEM_KILL_DELAY = 300.0f; +const float RADIO_TIMEOUT = 1.5f; +const float DEATH_ANIMATION_TIME = 3.0f; const int MAX_INTERMISSION_TIME = 120; // longest the intermission can last, in seconds @@ -206,7 +207,6 @@ enum SCENARIO_BLOCK_PRISON_ESCAPE_TIME = BIT(8), // flag "i" SCENARIO_BLOCK_BOMB_TIME = BIT(9), // flag "j" SCENARIO_BLOCK_HOSTAGE_RESCUE_TIME = BIT(10), // flag "k" - }; // Player relationship return codes @@ -336,6 +336,7 @@ class CGameRules inline void SetGameOver() { m_bGameOver = true; } static float GetItemKillDelay(); static float GetRadioTimeout(); + static float GetDyingTime(); public: BOOL m_bFreezePeriod; // TRUE at beginning of round, set to FALSE when the period expires @@ -921,6 +922,15 @@ inline float CGameRules::GetRadioTimeout() #endif } +inline float CGameRules::GetDyingTime() +{ +#ifdef REGAMEDLL_ADD + return dying_time.value; +#else + return DEATH_ANIMATION_TIME; +#endif +} + bool IsBotSpeaking(); void SV_Continue_f(); void SV_Tutor_Toggle_f(); diff --git a/regamedll/dlls/gib.cpp b/regamedll/dlls/gib.cpp index 5b9122d04..069b118d9 100644 --- a/regamedll/dlls/gib.cpp +++ b/regamedll/dlls/gib.cpp @@ -5,13 +5,14 @@ LINK_ENTITY_TO_CLASS(gib, CGib, CCSGib) void CGib::LimitVelocity() { float length = pev->velocity.Length(); + float topspeed = CVAR_GET_FLOAT("sv_maxvelocity") * 0.75f; - // ceiling at 1500. The gib velocity equation is not bounded properly. Rather than tune it + // ceiling at topspeed. The gib velocity equation is not bounded properly. Rather than tune it // in 3 separate places again, I'll just limit it here. - if (length > 1500.0) + if (length > topspeed) { - // This should really be sv_maxvelocity * 0.75 or something - pev->velocity = pev->velocity.Normalize() * 1500; + // DONE: This should really be sv_maxvelocity * 0.75 or something + pev->velocity = pev->velocity.Normalize() * topspeed; } } diff --git a/regamedll/dlls/multiplay_gamerules.cpp b/regamedll/dlls/multiplay_gamerules.cpp index 79c5636fb..5f6216f1b 100644 --- a/regamedll/dlls/multiplay_gamerules.cpp +++ b/regamedll/dlls/multiplay_gamerules.cpp @@ -2395,7 +2395,7 @@ void CHalfLifeMultiplay::Think() MESSAGE_BEGIN(MSG_ALL, gmsgForceCam); WRITE_BYTE(forcecamera.value != 0); WRITE_BYTE(forcechasecam.value != 0); - WRITE_BYTE(fadetoblack.value != 0); + WRITE_BYTE(fadetoblack.value == FADETOBLACK_STAY); MESSAGE_END(); m_flForceCameraValue = forcecamera.value; @@ -3458,7 +3458,7 @@ void CHalfLifeMultiplay::InitHUD(CBasePlayer *pl) MESSAGE_BEGIN(MSG_ONE, gmsgForceCam, nullptr, pl->edict()); WRITE_BYTE(forcecamera.value != 0); WRITE_BYTE(forcechasecam.value != 0); - WRITE_BYTE(fadetoblack.value != 0); + WRITE_BYTE(fadetoblack.value == FADETOBLACK_STAY); MESSAGE_END(); if (m_bGameOver) @@ -3876,7 +3876,7 @@ BOOL EXT_FUNC CHalfLifeMultiplay::__API_HOOK(FPlayerCanRespawn)(CBasePlayer *pPl { // If this player just connected and fadetoblack is on, then maybe // the server admin doesn't want him peeking around. - if (fadetoblack.value != 0.0f) + if (fadetoblack.value == FADETOBLACK_STAY) { UTIL_ScreenFade(pPlayer, Vector(0, 0, 0), 3, 3, 255, (FFADE_OUT | FFADE_STAYOUT)); } diff --git a/regamedll/dlls/observer.cpp b/regamedll/dlls/observer.cpp index 336b7b3cc..c35b17f9a 100644 --- a/regamedll/dlls/observer.cpp +++ b/regamedll/dlls/observer.cpp @@ -6,7 +6,7 @@ int __API_HOOK(GetForceCamera)(CBasePlayer *pObserver) { int retVal; - if (!fadetoblack.value) + if (fadetoblack.value != FADETOBLACK_STAY) { retVal = int(CVAR_GET_FLOAT("mp_forcechasecam")); @@ -51,7 +51,7 @@ void UpdateClientEffects(CBasePlayer *pObserver, int oldMode) { bool clearProgress = false; bool clearBlindness = false; - bool blindnessOk = (fadetoblack.value == 0); + bool blindnessOk = (fadetoblack.value != FADETOBLACK_STAY); bool clearNightvision = false; if (pObserver->GetObserverMode() == OBS_IN_EYE) diff --git a/regamedll/dlls/observer.h b/regamedll/dlls/observer.h index 722c977a4..743936ff9 100644 --- a/regamedll/dlls/observer.h +++ b/regamedll/dlls/observer.h @@ -32,6 +32,12 @@ #define CAMERA_MODE_SPEC_ONLY_TEAM 1 #define CAMERA_MODE_SPEC_ONLY_FIRST_PERSON 2 +enum FadeToBlack { + FADETOBLACK_OFF, + FADETOBLACK_STAY, + FADETOBLACK_AT_DYING, +}; + int GetForceCamera(CBasePlayer *pObserver); void UpdateClientEffects(CBasePlayer *pObserver, int oldMode); diff --git a/regamedll/dlls/player.cpp b/regamedll/dlls/player.cpp index cb99d5f7e..801b8918a 100644 --- a/regamedll/dlls/player.cpp +++ b/regamedll/dlls/player.cpp @@ -2303,6 +2303,8 @@ void EXT_FUNC CBasePlayer::__API_HOOK(Killed)(entvars_t *pevAttacker, int iGib) UTIL_ScreenFade(this, Vector(0, 0, 0), 3, 3, 255, (FFADE_OUT | FFADE_STAYOUT)); } #else + float flDyingDuration = GetSequenceDuration() + CGameRules::GetDyingTime(); + switch ((int)fadetoblack.value) { default: @@ -2318,12 +2320,12 @@ void EXT_FUNC CBasePlayer::__API_HOOK(Killed)(entvars_t *pevAttacker, int iGib) break; } - case 1: + case FADETOBLACK_STAY: { - UTIL_ScreenFade(this, Vector(0, 0, 0), 3, 3, 255, (FFADE_OUT | FFADE_STAYOUT)); + UTIL_ScreenFade(this, Vector(0, 0, 0), 0.8f, flDyingDuration, 255, (FFADE_OUT | FFADE_STAYOUT)); break; } - case 2: + case FADETOBLACK_AT_DYING: { pev->iuser1 = OBS_CHASE_FREE; pev->iuser2 = ENTINDEX(edict()); @@ -2334,16 +2336,7 @@ void EXT_FUNC CBasePlayer::__API_HOOK(Killed)(entvars_t *pevAttacker, int iGib) MESSAGE_BEGIN(MSG_ONE, gmsgADStop, nullptr, pev); MESSAGE_END(); - for (int i = 1; i <= gpGlobals->maxClients; i++) - { - CBasePlayer* pObserver = UTIL_PlayerByIndex(i); - - if (pObserver == this || (pObserver && pObserver->IsObservingPlayer(this))) - { - UTIL_ScreenFade(pObserver, Vector(0, 0, 0), 1, 4, 255, (FFADE_OUT)); - } - } - + UTIL_ScreenFade(this, Vector(0, 0, 0), 0.8f, flDyingDuration, 255, (FFADE_OUT)); break; } } @@ -3872,7 +3865,7 @@ void CBasePlayer::PlayerDeathThink() { // if the player has been dead for one second longer than allowed by forcerespawn, // forcerespawn isn't on. Send the player off to an intermission camera until they choose to respawn. - if (g_pGameRules->IsMultiplayer() && HasTimePassedSinceDeath(3.0f) && !(m_afPhysicsFlags & PFLAG_OBSERVER)) + if (g_pGameRules->IsMultiplayer() && HasTimePassedSinceDeath(CGameRules::GetDyingTime()) && !(m_afPhysicsFlags & PFLAG_OBSERVER)) { // Send message to everybody to spawn a corpse. SpawnClientSideCorpse(); @@ -8829,6 +8822,23 @@ int GetPlayerGaitsequence(const edict_t *pEdict) return pPlayer->m_iGaitsequence; } +float CBasePlayer::GetDyingAnimationDuration() const +{ + float animDuration = -1.0f; + + if (CGameRules::GetDyingTime() < DEATH_ANIMATION_TIME) // a short time, timeDiff estimates to be small + { + float flSequenceDuration = GetSequenceDuration(); + if (flSequenceDuration > 0) + animDuration = flSequenceDuration; + } + + if (animDuration <= 0) + animDuration = CGameRules::GetDyingTime(); // in case of failure + + return animDuration; +} + void CBasePlayer::SpawnClientSideCorpse() { #ifdef REGAMEDLL_FIXES @@ -8836,9 +8846,7 @@ void CBasePlayer::SpawnClientSideCorpse() if (pev->effects & EF_NODRAW) return; - // do not make a corpse if the player goes to respawn. - if (pev->deadflag == DEAD_RESPAWNABLE) - return; + // deadflag == DEAD_RESPAWNABLE already checked before #endif #ifdef REGAMEDLL_ADD @@ -8848,6 +8856,27 @@ void CBasePlayer::SpawnClientSideCorpse() char *infobuffer = GET_INFO_BUFFER(edict()); char *pModel = GET_KEY_VALUE(infobuffer, "model"); + float timeDiff = pev->animtime - gpGlobals->time; + +#ifdef REGAMEDLL_ADD + if (CGameRules::GetDyingTime() < DEATH_ANIMATION_TIME) // a short time, timeDiff estimates to be small + { + float animDuration = GetDyingAnimationDuration(); + + // client receives a negative value + animDuration *= -1.0; + + if (animDuration < timeDiff) // reasonable way to fix client side unfinished sequence bug + { + // by some reason, if client receives a value less + // than "(negative current sequence time) * 100" + // animation will play visually awkward + // at this function call time, player death animation + // has already finished so we can safely fake it + timeDiff = animDuration; + } + } +#endif MESSAGE_BEGIN(MSG_ALL, gmsgSendCorpse); WRITE_STRING(pModel); @@ -8857,14 +8886,17 @@ void CBasePlayer::SpawnClientSideCorpse() WRITE_COORD(pev->angles.x); WRITE_COORD(pev->angles.y); WRITE_COORD(pev->angles.z); - WRITE_LONG((pev->animtime - gpGlobals->time) * 100); + WRITE_LONG(timeDiff * 100); WRITE_BYTE(pev->sequence); WRITE_BYTE(pev->body); WRITE_BYTE(m_iTeam); WRITE_BYTE(entindex()); MESSAGE_END(); +#ifndef REGAMEDLL_FIXES + // already defined in StartDeathCam m_canSwitchObserverModes = true; +#endif if (TheTutor) { @@ -9913,7 +9945,7 @@ void CBasePlayer::UpdateLocation(bool forceUpdate) const char *placeName = ""; - if (pev->deadflag == DEAD_NO && AreRunningCZero()) + if (pev->deadflag == DEAD_NO && AreBotsAllowed()) { // search the place name where is located the player Place playerPlace = TheNavAreaGrid.GetPlace(&pev->origin); diff --git a/regamedll/dlls/player.h b/regamedll/dlls/player.h index 63cab612d..7efead2f2 100644 --- a/regamedll/dlls/player.h +++ b/regamedll/dlls/player.h @@ -454,6 +454,7 @@ class CBasePlayer: public CBaseMonster { static CBasePlayer *Instance(entvars_t *pev) { return Instance(ENT(pev)); } static CBasePlayer *Instance(int offset) { return Instance(ENT(offset)); } + float GetDyingAnimationDuration() const; void SpawnClientSideCorpse(); void Observer_FindNextPlayer(bool bReverse, const char *name = nullptr); CBasePlayer *Observer_IsValidTarget(int iPlayerIndex, bool bSameTeam); diff --git a/regamedll/dlls/tutor_base_tutor.cpp b/regamedll/dlls/tutor_base_tutor.cpp index 8723ca2c8..2268d18b7 100644 --- a/regamedll/dlls/tutor_base_tutor.cpp +++ b/regamedll/dlls/tutor_base_tutor.cpp @@ -104,7 +104,7 @@ char *TutorMessageEvent::GetNextParameter(char *buf, int buflen) Q_strncpy(buf, param->m_data, buflen); #ifdef REGAMEDLL_FIXES - buf[buflen] = '\0'; + buf[buflen - 1] = '\0'; #endif delete param; diff --git a/regamedll/dlls/weapons.h b/regamedll/dlls/weapons.h index 8fde597a6..cbcf231c0 100644 --- a/regamedll/dlls/weapons.h +++ b/regamedll/dlls/weapons.h @@ -534,7 +534,7 @@ enum usp_shield_e USP_SHIELD_SHOOT_EMPTY, USP_SHIELD_RELOAD, USP_SHIELD_DRAW, - USP_SHIELD_UP_IDLE, + USP_SHIELD_IDLE_UP, USP_SHIELD_UP, USP_SHIELD_DOWN, }; @@ -900,6 +900,19 @@ enum deagle_e DEAGLE_DRAW, }; +enum deagle_shield_e +{ + DEAGLE_SHIELD_IDLE1, + DEAGLE_SHIELD_SHOOT, + DEAGLE_SHIELD_SHOOT2, + DEAGLE_SHIELD_SHOOT_EMPTY, + DEAGLE_SHIELD_RELOAD, + DEAGLE_SHIELD_DRAW, + DEAGLE_SHIELD_IDLE_UP, + DEAGLE_SHIELD_UP, + DEAGLE_SHIELD_DOWN, +}; + class CDEAGLE: public CBasePlayerWeapon { public: @@ -1065,7 +1078,7 @@ enum glock18_shield_e GLOCK18_SHIELD_SHOOT_EMPTY, GLOCK18_SHIELD_RELOAD, GLOCK18_SHIELD_DRAW, - GLOCK18_SHIELD_IDLE, + GLOCK18_SHIELD_IDLE_UP, GLOCK18_SHIELD_UP, GLOCK18_SHIELD_DOWN, }; @@ -1179,7 +1192,7 @@ enum knife_shield_e KNIFE_SHIELD_SLASH, KNIFE_SHIELD_ATTACKHIT, KNIFE_SHIELD_DRAW, - KNIFE_SHIELD_UPIDLE, + KNIFE_SHIELD_IDLE_UP, KNIFE_SHIELD_UP, KNIFE_SHIELD_DOWN, }; @@ -1857,6 +1870,19 @@ enum fiveseven_e FIVESEVEN_DRAW, }; +enum fiveseven_shield_e +{ + FIVESEVEN_SHIELD_IDLE1, + FIVESEVEN_SHIELD_SHOOT, + FIVESEVEN_SHIELD_SHOOT2, + FIVESEVEN_SHIELD_SHOOT_EMPTY, + FIVESEVEN_SHIELD_RELOAD, + FIVESEVEN_SHIELD_DRAW, + FIVESEVEN_SHIELD_IDLE_UP, + FIVESEVEN_SHIELD_UP, + FIVESEVEN_SHIELD_DOWN, +}; + class CFiveSeven: public CBasePlayerWeapon { public: diff --git a/regamedll/dlls/weapontype.h b/regamedll/dlls/weapontype.h index e3527e5fa..97752ec8f 100644 --- a/regamedll/dlls/weapontype.h +++ b/regamedll/dlls/weapontype.h @@ -318,25 +318,12 @@ enum AmmoBuyAmount AMMO_SMOKEGRENADE_BUY = 1, }; -enum shieldgun_e -{ - SHIELDGUN_IDLE, - SHIELDGUN_SHOOT1, - SHIELDGUN_SHOOT2, - SHIELDGUN_SHOOT_EMPTY, - SHIELDGUN_RELOAD, - SHIELDGUN_DRAW, - SHIELDGUN_DRAWN_IDLE, - SHIELDGUN_UP, - SHIELDGUN_DOWN, -}; - // custom enum shieldgren_e { - SHIELDREN_IDLE = 4, - SHIELDREN_UP, - SHIELDREN_DOWN + SHIELDGREN_IDLE = 4, // 3 is last grenade viewmodel sequence + SHIELDGREN_UP, + SHIELDGREN_DOWN }; enum InventorySlotType diff --git a/regamedll/dlls/wpn_shared/wpn_deagle.cpp b/regamedll/dlls/wpn_shared/wpn_deagle.cpp index f7a97d5d0..7dbed0c6b 100644 --- a/regamedll/dlls/wpn_shared/wpn_deagle.cpp +++ b/regamedll/dlls/wpn_shared/wpn_deagle.cpp @@ -93,7 +93,7 @@ void CDEAGLE::PrimaryAttack() void CDEAGLE::SecondaryAttack() { - ShieldSecondaryFire(SHIELDGUN_UP, SHIELDGUN_DOWN); + ShieldSecondaryFire(DEAGLE_SHIELD_UP, DEAGLE_SHIELD_DOWN); } void CDEAGLE::DEAGLEFire(float flSpread, float flCycleTime, BOOL fUseSemi) @@ -204,7 +204,7 @@ void CDEAGLE::WeaponIdle() if (m_iWeaponState & WPNSTATE_SHIELD_DRAWN) { - SendWeaponAnim(SHIELDGUN_DRAWN_IDLE, UseDecrement() != FALSE); + SendWeaponAnim(DEAGLE_SHIELD_IDLE_UP, UseDecrement() != FALSE); } } } diff --git a/regamedll/dlls/wpn_shared/wpn_fiveseven.cpp b/regamedll/dlls/wpn_shared/wpn_fiveseven.cpp index 67f2f3d57..31f211f08 100644 --- a/regamedll/dlls/wpn_shared/wpn_fiveseven.cpp +++ b/regamedll/dlls/wpn_shared/wpn_fiveseven.cpp @@ -92,7 +92,7 @@ void CFiveSeven::PrimaryAttack() void CFiveSeven::SecondaryAttack() { - ShieldSecondaryFire(SHIELDGUN_UP, SHIELDGUN_DOWN); + ShieldSecondaryFire(FIVESEVEN_SHIELD_UP, FIVESEVEN_SHIELD_DOWN); } void CFiveSeven::FiveSevenFire(float flSpread, float flCycleTime, BOOL fUseSemi) @@ -208,7 +208,7 @@ void CFiveSeven::WeaponIdle() if (m_iWeaponState & WPNSTATE_SHIELD_DRAWN) { - SendWeaponAnim(SHIELDGUN_DRAWN_IDLE, UseDecrement() != FALSE); + SendWeaponAnim(FIVESEVEN_SHIELD_IDLE_UP, UseDecrement() != FALSE); } } else if (m_iClip) diff --git a/regamedll/dlls/wpn_shared/wpn_flashbang.cpp b/regamedll/dlls/wpn_shared/wpn_flashbang.cpp index a222aaf8b..409a0c466 100644 --- a/regamedll/dlls/wpn_shared/wpn_flashbang.cpp +++ b/regamedll/dlls/wpn_shared/wpn_flashbang.cpp @@ -146,7 +146,7 @@ bool CFlashbang::ShieldSecondaryFire(int iUpAnim, int iDownAnim) void CFlashbang::SecondaryAttack() { - ShieldSecondaryFire(SHIELDGUN_DRAW, SHIELDGUN_DRAWN_IDLE); + ShieldSecondaryFire(SHIELDGREN_UP, SHIELDGREN_DOWN); } void CFlashbang::SetPlayerShieldAnim() @@ -257,7 +257,7 @@ void CFlashbang::WeaponIdle() if (m_iWeaponState & WPNSTATE_SHIELD_DRAWN) { - SendWeaponAnim(SHIELDREN_IDLE, UseDecrement() != FALSE); + SendWeaponAnim(SHIELDGREN_IDLE, UseDecrement() != FALSE); } } else diff --git a/regamedll/dlls/wpn_shared/wpn_glock18.cpp b/regamedll/dlls/wpn_shared/wpn_glock18.cpp index b82d5148f..c2f5399d5 100644 --- a/regamedll/dlls/wpn_shared/wpn_glock18.cpp +++ b/regamedll/dlls/wpn_shared/wpn_glock18.cpp @@ -295,7 +295,7 @@ void CGLOCK18::WeaponIdle() if (m_iWeaponState & WPNSTATE_SHIELD_DRAWN) { - SendWeaponAnim(GLOCK18_SHIELD_IDLE, UseDecrement() != FALSE); + SendWeaponAnim(GLOCK18_SHIELD_IDLE_UP, UseDecrement() != FALSE); } } // only idle if the slid isn't back diff --git a/regamedll/dlls/wpn_shared/wpn_hegrenade.cpp b/regamedll/dlls/wpn_shared/wpn_hegrenade.cpp index 5b8e10b02..031cb2451 100644 --- a/regamedll/dlls/wpn_shared/wpn_hegrenade.cpp +++ b/regamedll/dlls/wpn_shared/wpn_hegrenade.cpp @@ -148,7 +148,7 @@ bool CHEGrenade::ShieldSecondaryFire(int iUpAnim, int iDownAnim) void CHEGrenade::SecondaryAttack() { - ShieldSecondaryFire(SHIELDGUN_DRAW, SHIELDGUN_DRAWN_IDLE); + ShieldSecondaryFire(SHIELDGREN_UP, SHIELDGREN_DOWN); } void CHEGrenade::SetPlayerShieldAnim() @@ -260,7 +260,7 @@ void CHEGrenade::WeaponIdle() if (m_iWeaponState & WPNSTATE_SHIELD_DRAWN) { - SendWeaponAnim(SHIELDREN_IDLE, UseDecrement() != FALSE); + SendWeaponAnim(SHIELDGREN_IDLE, UseDecrement() != FALSE); } } else diff --git a/regamedll/dlls/wpn_shared/wpn_knife.cpp b/regamedll/dlls/wpn_shared/wpn_knife.cpp index bcef6a385..bff4cfce1 100644 --- a/regamedll/dlls/wpn_shared/wpn_knife.cpp +++ b/regamedll/dlls/wpn_shared/wpn_knife.cpp @@ -19,8 +19,10 @@ void CKnife::Spawn() m_flStabDistance = KNIFE_STAB_DISTANCE; m_flSwingDistance = KNIFE_SWING_DISTANCE; + + m_flBackStabMultiplier = KNIFE_BACKSTAB_MULTIPLIER; #endif - + // Get ready to fall down FallInit(); @@ -53,6 +55,8 @@ void CKnife::Precache() m_flStabDistance = KNIFE_STAB_DISTANCE; m_flSwingDistance = KNIFE_SWING_DISTANCE; + + m_flBackStabMultiplier = KNIFE_BACKSTAB_MULTIPLIER; #endif } diff --git a/regamedll/dlls/wpn_shared/wpn_p228.cpp b/regamedll/dlls/wpn_shared/wpn_p228.cpp index 6e2c8d05b..b64f5fcf3 100644 --- a/regamedll/dlls/wpn_shared/wpn_p228.cpp +++ b/regamedll/dlls/wpn_shared/wpn_p228.cpp @@ -92,7 +92,7 @@ void CP228::PrimaryAttack() void CP228::SecondaryAttack() { - ShieldSecondaryFire(SHIELDGUN_UP, SHIELDGUN_DOWN); + ShieldSecondaryFire(P228_SHIELD_UP, P228_SHIELD_DOWN); } void CP228::P228Fire(float flSpread, float flCycleTime, BOOL fUseSemi) diff --git a/regamedll/dlls/wpn_shared/wpn_smokegrenade.cpp b/regamedll/dlls/wpn_shared/wpn_smokegrenade.cpp index c0df2b5f5..e0d51f951 100644 --- a/regamedll/dlls/wpn_shared/wpn_smokegrenade.cpp +++ b/regamedll/dlls/wpn_shared/wpn_smokegrenade.cpp @@ -149,7 +149,7 @@ bool CSmokeGrenade::ShieldSecondaryFire(int iUpAnim, int iDownAnim) void CSmokeGrenade::SecondaryAttack() { - ShieldSecondaryFire(SHIELDGUN_DRAW, SHIELDGUN_DRAWN_IDLE); + ShieldSecondaryFire(SHIELDGREN_UP, SHIELDGREN_DOWN); } void CSmokeGrenade::SetPlayerShieldAnim() @@ -264,7 +264,7 @@ void CSmokeGrenade::WeaponIdle() if (m_iWeaponState & WPNSTATE_SHIELD_DRAWN) { - SendWeaponAnim(SHIELDREN_IDLE, UseDecrement() != FALSE); + SendWeaponAnim(SHIELDGREN_IDLE, UseDecrement() != FALSE); } } else diff --git a/regamedll/dlls/wpn_shared/wpn_usp.cpp b/regamedll/dlls/wpn_shared/wpn_usp.cpp index 6141baebe..0d830d690 100644 --- a/regamedll/dlls/wpn_shared/wpn_usp.cpp +++ b/regamedll/dlls/wpn_shared/wpn_usp.cpp @@ -279,7 +279,7 @@ void CUSP::WeaponIdle() if (m_iWeaponState & WPNSTATE_SHIELD_DRAWN) { - SendWeaponAnim(USP_DRAW, UseDecrement()); + SendWeaponAnim(USP_SHIELD_IDLE_UP, UseDecrement()); } } else if (m_iClip) diff --git a/regamedll/pm_shared/pm_shared.cpp b/regamedll/pm_shared/pm_shared.cpp index 75d4a4909..b3b57fa5d 100644 --- a/regamedll/pm_shared/pm_shared.cpp +++ b/regamedll/pm_shared/pm_shared.cpp @@ -1967,7 +1967,9 @@ void PM_Duck() } } -void PM_LadderMove(physent_t *pLadder) +LINK_HOOK_VOID_CHAIN(PM_LadderMove, (physent_t *pLadder), pLadder); + +void EXT_FUNC __API_HOOK(PM_LadderMove)(physent_t *pLadder) { vec3_t ladderCenter; trace_t trace; diff --git a/regamedll/pm_shared/pm_shared.h b/regamedll/pm_shared/pm_shared.h index 94113ae0a..da15fb5b0 100644 --- a/regamedll/pm_shared/pm_shared.h +++ b/regamedll/pm_shared/pm_shared.h @@ -77,12 +77,14 @@ void PM_Init(struct playermove_s *ppmove); void PM_Move(struct playermove_s *ppmove, int server); char PM_FindTextureType(char *name); void PM_AirMove_internal(); +void PM_LadderMove(physent_t *pLadder); #ifdef REGAMEDLL_API void PM_Init_OrigFunc(struct playermove_s *ppmove); void PM_Move_OrigFunc(struct playermove_s *ppmove, int server); void PM_AirMove_OrigFunc(int playerIndex = 0); void PM_UpdateStepSound_OrigFunc(); +void PM_LadderMove_OrigFunc(physent_t *pLadder); #else void PM_AirMove(int playerIndex = 0); #endif diff --git a/regamedll/public/regamedll/regamedll_api.h b/regamedll/public/regamedll/regamedll_api.h index 493736ca2..bfd6caf25 100644 --- a/regamedll/public/regamedll/regamedll_api.h +++ b/regamedll/public/regamedll/regamedll_api.h @@ -524,6 +524,10 @@ typedef IHookChainRegistryClass IReGameHookRegistry_CBa typedef IHookChain IReGameHook_FreeGameRules; typedef IHookChainRegistry IReGameHookRegistry_FreeGameRules; +// PM_LadderMove hook +typedef IHookChain IReGameHook_PM_LadderMove; +typedef IHookChainRegistry IReGameHookRegistry_PM_LadderMove; + class IReGameHookchains { public: virtual ~IReGameHookchains() {} @@ -659,6 +663,7 @@ class IReGameHookchains { virtual IReGameHookRegistry_CBasePlayer_JoiningThink *CBasePlayer_JoiningThink() = 0; virtual IReGameHookRegistry_FreeGameRules *FreeGameRules() = 0; + virtual IReGameHookRegistry_PM_LadderMove *PM_LadderMove() = 0; }; struct ReGameFuncs_t {