Skip to content

Commit e07c02c

Browse files
committed
update(schema): Update Method
1 parent 7495864 commit e07c02c

File tree

6 files changed

+26
-85
lines changed

6 files changed

+26
-85
lines changed

plugin_files/gamedata/signatures.json

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,11 @@
44
"windows": "48 85 C9 0F 84 2A 2A 2A 2A 48 89 5C 24 2A 55",
55
"linux": "55 48 89 E5 41 57 49 89 CF 41 56 49 89 D6 41 55 41 89 F5 41 54 4C 8D A5 A0 FE FF FF"
66
},
7-
"NetworkStateChanged": {
8-
"lib": "server",
9-
"windows": "4C 8B C9 48 8B 09 48 85 C9 74 2A 48 8B 41 10",
10-
"linux": "4C 8B 07 4D 85 C0 74 2A 49 8B 40 10"
11-
},
127
"CGameRules_Constructor": {
138
"lib": "server",
149
"windows": "48 89 5C 24 2A 48 89 74 24 2A 57 48 83 EC 2A 8B 15 2A 2A 2A 2A 48 8D 05 2A 2A 2A 2A 48 89 01 33 F6 65 48 8B 04 25 2A 2A 2A 2A 48 8B D9 48 89 71 2A 48 8B 3C D0 B8 2A 2A 2A 2A 40 38 34 38 75 2A E8 2A 2A 2A 2A B8 2A 2A 2A 2A 48 8B 04 38 48 89 43 2A 48 89 73 2A 48 89 73 2A 89 73 2A C7 43 2A 2A 2A 2A 2A 48 89 B3",
1510
"linux": "55 48 8D 05 2A 2A 2A 2A 48 89 E5 53 48 89 FB 48 83 EC 2A 48 89 07 66 48 8D 3D 2A 2A 2A 2A 66 66 48 E8 2A 2A 2A 2A C7 43 2A 2A 2A 2A 2A 48 C7 43 2A 2A 2A 2A 2A 48 C7 43 2A 2A 2A 2A 2A C7 43 2A 2A 2A 2A 2A 48 C7 83"
1611
},
17-
"StateChanged": {
18-
"lib": "server",
19-
"windows": "40 ? 53 56 41 ? 41 ? 48 ? ? ? ? 48 ? ? ? ? ? ? 48 ? ? 45",
20-
"linux": "55 48 89 E5 41 57 41 56 41 55 41 54 53 89 D3"
21-
},
2212
"ServerMovementUnlock": {
2313
"lib": "server",
2414
"windows": "76 ? F2 0F 10 57 ? 0F 28 ? F3 0F ? ? 0F 28 ?",

src/plugins/core/scripting/schema.cpp

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -83,22 +83,7 @@ void scripting_StateUpdate(std::string ptr, std::string classname, std::string f
8383
}
8484

8585
if (!starts_with(ptr, "0x")) return;
86-
87-
auto datatable_hash = hash_32_fnv1a_const(classname.c_str());
88-
auto prop_hash = hash_32_fnv1a_const(field.c_str());
89-
90-
auto m_key = sch::GetOffset(classname.c_str(), datatable_hash, field.c_str(), prop_hash);
91-
auto m_chain = sch::FindChainOffset(classname.c_str());
92-
9386
void* vPtr = (void*)(strtol(ptr.c_str(), nullptr, 16));
9487

95-
if (m_chain != 0 && m_key.networked)
96-
g_Signatures->FetchSignature<NetworkSTChange>("NetworkStateChanged")((uintptr_t)(vPtr)+m_chain, m_key.offset, 0xFFFFFFFF);
97-
else if (m_key.networked)
98-
{
99-
if (!isStruct)
100-
SetStateChanged((CBaseEntity*)vPtr, m_key.offset);
101-
else if (IsPlatformPosix())
102-
CALL_VIRTUAL(void, 1, vPtr, m_key.offset, 0xFFFFFFFF, 0xFFFF);
103-
}
88+
SetStateChanged((uintptr_t)vPtr, classname, field, 0, isStruct);
10489
}

src/plugins/core/scripting_includes.h

Lines changed: 2 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -90,17 +90,8 @@ void SetSchemaValue(void* ptr, const char* className, const char* fieldName, boo
9090
auto prop_hash = hash_32_fnv1a_const(fieldName);
9191

9292
auto m_key = sch::GetOffset(className, datatable_hash, fieldName, prop_hash);
93-
auto m_chain = sch::FindChainOffset(className);
9493

95-
if (m_chain != 0 && m_key.networked)
96-
g_Signatures->FetchSignature<NetworkSTChange>("NetworkStateChanged")((uintptr_t)(ptr)+m_chain, m_key.offset, 0xFFFFFFFF);
97-
else if (m_key.networked)
98-
{
99-
if (!isStruct)
100-
SetStateChanged((CBaseEntity*)ptr, m_key.offset);
101-
else if (IsPlatformPosix())
102-
CALL_VIRTUAL(void, 1, ptr, m_key.offset, 0xFFFFFFFF, 0xFFFF);
103-
}
94+
SetStateChanged((uintptr_t)ptr, className, fieldName, 0, isStruct);
10495
*reinterpret_cast<std::add_pointer_t<T>>((uintptr_t)(ptr)+m_key.offset) = value;
10596
}
10697

@@ -120,17 +111,8 @@ void SetSchemaValueCUtlVector(void* ptr, const char* className, const char* fiel
120111
auto prop_hash = hash_32_fnv1a_const(fieldName);
121112

122113
auto m_key = sch::GetOffset(className, datatable_hash, fieldName, prop_hash);
123-
auto m_chain = sch::FindChainOffset(className);
124114

125-
if (m_chain != 0 && m_key.networked)
126-
g_Signatures->FetchSignature<NetworkSTChange>("NetworkStateChanged")((uintptr_t)(ptr)+m_chain, m_key.offset, 0xFFFFFFFF);
127-
else if (m_key.networked)
128-
{
129-
if (!isStruct)
130-
SetStateChanged((CBaseEntity*)ptr, m_key.offset);
131-
else if (IsPlatformPosix())
132-
CALL_VIRTUAL(void, 1, ptr, m_key.offset, 0xFFFFFFFF, 0xFFFF);
133-
}
115+
SetStateChanged((uintptr_t)ptr, className, fieldName, 0, isStruct);
134116

135117
CUtlVector<T>* vec = reinterpret_cast<CUtlVector<T> *>((uintptr_t)(ptr)+m_key.offset);
136118
vec->Purge();

src/sdk/schema.cpp

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -108,15 +108,28 @@ SchemaKey sch::GetOffset(const char* className, uint32_t classKey, const char* m
108108
return tableMap->Element(memberIndex);
109109
}
110110

111-
void SetStateChanged(CBaseEntity* pEntity, int offset)
111+
void SetStateChanged(uintptr_t entityPtr, std::string className, std::string fieldName, int extraOffset, bool isStruct)
112112
{
113-
if (pEntity->m_NetworkTransmitComponent())
114-
{
115-
g_Signatures->FetchSignature<StateChanged>("StateChanged")(pEntity->m_NetworkTransmitComponent(), pEntity, offset, -1, -1);
113+
if ((CBaseEntity*)entityPtr == nullptr) return;
114+
115+
auto datatable_hash = hash_32_fnv1a_const(className.c_str());
116+
auto prop_hash = hash_32_fnv1a_const(fieldName.c_str());
116117

117-
if (engine && engine->GetServerGlobals())
118-
pEntity->m_lastNetworkChange = engine->GetServerGlobals()->curtime;
118+
auto m_key = sch::GetOffset(className.c_str(), datatable_hash, fieldName.c_str(), prop_hash);
119+
auto m_chain = sch::FindChainOffset(className.c_str());
119120

120-
pEntity->m_isSteadyState().ClearAll();
121+
if (!m_key.networked) return;
122+
123+
if (m_chain) {
124+
entityPtr += m_chain;
125+
CEntityInstance* pEntity = *reinterpret_cast<CEntityInstance**>(entityPtr);
126+
if (pEntity && (pEntity->m_pEntity->m_flags & EF_IS_CONSTRUCTION_IN_PROGRESS) == 0)
127+
pEntity->NetworkStateChanged(m_key.offset + extraOffset, -1, *reinterpret_cast<ChangeAccessorFieldPathIndex_t*>(entityPtr + 32));
128+
}
129+
else {
130+
if (!isStruct)
131+
reinterpret_cast<CEntityInstance*>(entityPtr)->NetworkStateChanged(m_key.offset + extraOffset);
132+
else
133+
CALL_VIRTUAL(void, 1, (CBaseEntity*)entityPtr, m_key.offset + extraOffset, 0xFFFFFFFF, 0xFFFF);
121134
}
122135
}

src/sdk/schema.h

Lines changed: 3 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ struct SchemaKey
1313
};
1414

1515
class CBaseEntity;
16-
void SetStateChanged(CBaseEntity* pEntity, int offset);
16+
void SetStateChanged(uintptr_t entityPtr, std::string className, std::string fieldName, int extraOffset, bool isStruct);
1717

1818
constexpr uint32_t val_32_const = 0x811c9dc5;
1919
constexpr uint32_t prime_32_const = 0x1000193;
@@ -62,46 +62,19 @@ namespace sch
6262
static const auto m_key = \
6363
sch::GetOffset(ThisClassName, datatable_hash, #varName, prop_hash); \
6464
\
65-
static const auto m_chain = \
66-
sch::FindChainOffset(ThisClassName); \
67-
\
6865
static const size_t offset = offsetof(ThisClass, varName); \
6966
ThisClass *pThisClass = (ThisClass *)((byte *)this - offset); \
7067
\
71-
if (m_chain != 0 && m_key.networked) \
72-
g_Signatures->FetchSignature<NetworkSTChange>("NetworkStateChanged")((uintptr_t)(pThisClass) + m_chain, m_key.offset + extra_offset, 0xFFFFFFFF); \
73-
else if (m_key.networked) \
74-
{ \
75-
if (!IsStruct) \
76-
SetStateChanged((CBaseEntity *)pThisClass, m_key.offset + extra_offset); \
77-
else if (IsPlatformPosix()) \
78-
CALL_VIRTUAL(void, 1, pThisClass, m_key.offset + extra_offset, 0xFFFFFFFF, 0xFFFF); \
79-
} \
68+
SetStateChanged((uintptr_t)pThisClass, ThisClassName, #varName, extra_offset, IsStruct); \
8069
*reinterpret_cast<std::add_pointer_t<type>>((uintptr_t)(pThisClass) + m_key.offset + extra_offset) = val; \
8170
} \
8271
void StateUpdate() \
8372
{ \
84-
static constexpr auto datatable_hash = hash_32_fnv1a_const(ThisClassName); \
85-
static constexpr auto prop_hash = hash_32_fnv1a_const(#varName); \
86-
\
87-
static const auto m_key = \
88-
sch::GetOffset(ThisClassName, datatable_hash, #varName, prop_hash); \
89-
\
90-
static const auto m_chain = \
91-
sch::FindChainOffset(ThisClassName); \
9273
\
9374
static const size_t offset = offsetof(ThisClass, varName); \
9475
ThisClass *pThisClass = (ThisClass *)((byte *)this - offset); \
9576
\
96-
if (m_chain != 0 && m_key.networked) \
97-
g_Signatures->FetchSignature<NetworkSTChange>("NetworkStateChanged")((uintptr_t)(pThisClass) + m_chain, m_key.offset + extra_offset, 0xFFFFFFFF); \
98-
else if (m_key.networked) \
99-
{ \
100-
if (!IsStruct) \
101-
SetStateChanged((CBaseEntity *)pThisClass, m_key.offset + extra_offset); \
102-
else if (IsPlatformPosix()) \
103-
CALL_VIRTUAL(void, 1, pThisClass, m_key.offset + extra_offset, 0xFFFFFFFF, 0xFFFF); \
104-
} \
77+
SetStateChanged((uintptr_t)pThisClass, ThisClassName, #varName, extra_offset, IsStruct); \
10578
} \
10679
operator std::add_lvalue_reference_t<type>() { return Get(); } \
10780
std::add_lvalue_reference_t<type> operator()() { return Get(); } \

src/signatures/Signatures.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,6 @@ struct EmitSound_t;
2222
struct SndOpEventGuid_t;
2323

2424
typedef void (*ClientPrint)(CBasePlayerController*, int, const char*, const char*, const char*, const char*, const char*);
25-
typedef void (*NetworkSTChange)(uintptr_t, int, int);
26-
typedef void (*StateChanged)(void*, CBaseEntity*, int, int, int);
2725
typedef void (*CCSPlayerController_SwitchTeam)(CCSPlayerController* pController, unsigned int team);
2826
typedef void* (*UTIL_CreateEntityByName)(const char*, int);
2927
typedef void (*CBaseModelEntity_SetModel)(CBaseModelEntity*, const char*);

0 commit comments

Comments
 (0)