Skip to content

Commit 01db762

Browse files
committed
Add a map migration for parented weapon entity heights
1 parent 3f549cb commit 01db762

3 files changed

Lines changed: 51 additions & 5 deletions

File tree

src/detours.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -407,6 +407,8 @@ void FASTCALL Detour_CCSPlayer_WeaponServices_EquipWeapon(CCSPlayer_WeaponServic
407407
if (g_cvarEnableEntWatch.Get())
408408
EW_Detour_CCSPlayer_WeaponServices_EquipWeapon(pWeaponServices, pPlayerWeapon);
409409

410+
g_pMapMigrations->OnEquipWeapon(pPlayerWeapon);
411+
410412
return CCSPlayer_WeaponServices_EquipWeapon(pWeaponServices, pPlayerWeapon);
411413
}
412414

src/mapmigrations.cpp

Lines changed: 44 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "entity.h"
2323
#include "entity/cbasemodelentity.h"
2424
#include "utils.h"
25+
#include "vprof.h"
2526

2627
CMapMigrations* g_pMapMigrations = nullptr;
2728

@@ -45,6 +46,7 @@ void CMapMigrations::ApplyGameSettings(KeyValues* pKV)
4546
void CMapMigrations::OnRoundPrestart()
4647
{
4748
m_vecModelEntitiesUsingRendermodeEnum.clear();
49+
m_vecEquippedWeapons.clear();
4850
}
4951

5052
void CMapMigrations::OnEntitySpawned(CEntityInstance* pEntity, const CEntityKeyValues* pKeyValues)
@@ -59,6 +61,12 @@ void CMapMigrations::OnEntitySpawned(CEntityInstance* pEntity, const CEntityKeyV
5961
RunMigrations(pBaseEntity);
6062
}
6163

64+
void CMapMigrations::OnEquipWeapon(CBasePlayerWeapon* pWeapon)
65+
{
66+
if (Migrations20260420Enabled())
67+
Migrations_20260420(pWeapon);
68+
}
69+
6270
void CMapMigrations::RunMigrations(CBaseEntity* pEntity)
6371
{
6472
if (g_cvarMapMigrations20260121.Get() == 1 || (g_cvarMapMigrations20260121.Get() == 2 && m_timeMapUpdated < g_time20260121))
@@ -99,22 +107,54 @@ void CMapMigrations::Migrations_20260121(CBaseEntity* pEntity)
99107
}
100108
}
101109

102-
void CMapMigrations::UpdateMapUpdateTime(time_t timeMapUpdated)
110+
void CMapMigrations::Migrations_20260420(CBasePlayerWeapon* pWeapon)
103111
{
104-
m_timeMapUpdated = timeMapUpdated;
112+
VPROF("CMapMigrations::Migrations_20260420");
113+
114+
// We only care about map-spawned weapons
115+
if (!V_strcmp(pWeapon->m_sUniqueHammerID().Get(), ""))
116+
return;
117+
118+
// And only their first equip
119+
for (int i = 0; i < m_vecEquippedWeapons.size(); i++)
120+
if (m_vecEquippedWeapons[i] == pWeapon->GetHandle())
121+
return;
105122

123+
m_vecEquippedWeapons.push_back(pWeapon->GetHandle());
106124
CBaseEntity* pTarget = nullptr;
107125

108-
// May be called late, so also check any existing entities first
126+
// Entities parented to weapons being held by players were offset by +40 units following the AG2 update
127+
// Since that doesn't affect in-world weapons, this migration is delayed until weapon equip to prevent breaking strip triggers etc
128+
// Alternatively, we may want to track weapon children ahead of time via OnEntityParentChanged if this ends up becoming a performance concern
109129
while ((pTarget = UTIL_FindEntityByClassname(pTarget, "*")))
110-
RunMigrations(pTarget);
130+
{
131+
CGameSceneNode* pParentSceneNode = pTarget->m_CBodyComponent()->m_pSceneNode()->m_pParent();
132+
133+
if (pParentSceneNode && pParentSceneNode->m_pOwner() == pWeapon)
134+
{
135+
Vector newOrigin = pTarget->GetAbsOrigin();
136+
newOrigin.z -= 40.0f;
137+
pTarget->Teleport(&newOrigin, nullptr, nullptr);
138+
}
139+
}
111140
}
112141

113142
bool CMapMigrations::Migrations20260420Enabled()
114143
{
115144
return g_cvarMapMigrations20260420.Get() == 1 || (g_cvarMapMigrations20260420.Get() == 2 && m_timeMapUpdated < g_time20260420);
116145
}
117146

147+
void CMapMigrations::UpdateMapUpdateTime(time_t timeMapUpdated)
148+
{
149+
m_timeMapUpdated = timeMapUpdated;
150+
151+
CBaseEntity* pTarget = nullptr;
152+
153+
// May be called late, so also check any existing entities first
154+
while ((pTarget = UTIL_FindEntityByClassname(pTarget, "*")))
155+
RunMigrations(pTarget);
156+
}
157+
118158
std::shared_ptr<CMapMigrationWorkshopDetailsQuery> CMapMigrationWorkshopDetailsQuery::Create(uint64 iWorkshopId)
119159
{
120160
if (!GetSteamUGC())

src/mapmigrations.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
#include "KeyValues.h"
2323
#include "convar.h"
24+
#include "cs2_sdk/entity/ccsweaponbase.h"
2425
#include "ehandle.h"
2526
#include "entitysystem.h"
2627
#include "steam/isteamugc.h"
@@ -54,17 +55,20 @@ class CMapMigrations
5455
void ApplyGameSettings(KeyValues* pKV);
5556
void OnRoundPrestart();
5657
void OnEntitySpawned(CEntityInstance* pEntity, const CEntityKeyValues* pKeyValues);
58+
void OnEquipWeapon(CBasePlayerWeapon* pWeapon);
5759
void RunMigrations(CBaseEntity* pEntity);
5860
void Migrations_20260121(CBaseEntity* pEntity);
59-
void UpdateMapUpdateTime(time_t timeMapUpdated);
61+
void Migrations_20260420(CBasePlayerWeapon* pWeapon);
6062
bool Migrations20260420Enabled();
63+
void UpdateMapUpdateTime(time_t timeMapUpdated);
6164
void AddWorkshopDetailsQuery(std::shared_ptr<CMapMigrationWorkshopDetailsQuery> pQuery) { m_vecWorkshopDetailsQueries.push_back(pQuery); }
6265
void RemoveWorkshopDetailsQuery(std::shared_ptr<CMapMigrationWorkshopDetailsQuery> pQuery) { m_vecWorkshopDetailsQueries.erase(std::remove(m_vecWorkshopDetailsQueries.begin(), m_vecWorkshopDetailsQueries.end(), pQuery), m_vecWorkshopDetailsQueries.end()); }
6366

6467
private:
6568
time_t m_timeMapUpdated = std::numeric_limits<time_t>::max();
6669
std::vector<std::shared_ptr<CMapMigrationWorkshopDetailsQuery>> m_vecWorkshopDetailsQueries;
6770
std::vector<CHandle<CBaseEntity>> m_vecModelEntitiesUsingRendermodeEnum;
71+
std::vector<CHandle<CBasePlayerWeapon>> m_vecEquippedWeapons;
6872
};
6973

7074
extern CMapMigrations* g_pMapMigrations;

0 commit comments

Comments
 (0)