Skip to content

Commit d5088fb

Browse files
committed
fix(TakeDamage): Not setting the damage & damage type
1 parent 246b351 commit d5088fb

File tree

5 files changed

+48
-16
lines changed

5 files changed

+48
-16
lines changed

plugin_files/gamedata/core/signatures.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,11 @@
5959
"windows": "48 89 5C 24 ? 48 89 74 24 ? 55 57 41 55 41 56 41 57 48 8D 6C 24 E0",
6060
"linux": "55 48 89 E5 41 57 41 56 4D 89 C6 41 55 49 89 D5 41 54 49 89 F4"
6161
},
62+
"CTakeDamageInfo_Constructor": {
63+
"lib": "server",
64+
"windows": "40 53 48 83 EC 60 48 C7 41 38 FF FF FF FF",
65+
"linux": "55 48 89 E5 48 83 EC 10 4C 8D 15 ? ? ? ?"
66+
},
6267
"FireOutputInternal": {
6368
"lib": "server",
6469
"windows": "4C 89 4C 24 20 53 55 57 41 54 41 56 48 81 EC",

src/memory/signatures/Signatures.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ typedef void (*GiveNamedItem_t)(CCSPlayer_ItemServices*, const char*, int, int,
3333
typedef SndOpEventGuid_t(*CBaseEntity_EmitSoundFilter)(IRecipientFilter& filter, CEntityIndex ent, const EmitSound_t& params);
3434
typedef void (*CBaseEntity_EmitSoundParams)(CBaseEntity*, const char*, int, float, float);
3535
typedef void (*CBaseEntity_TakeDamage_t)(CBaseEntity*, CTakeDamageInfo*);
36+
typedef void (*CTakeDamageInfo_Constructor)(CTakeDamageInfo*, CBaseEntity*, CBaseEntity*, CBaseEntity*, const Vector*, const Vector*, float, int, int, void*);
3637

3738
DynLibUtils::CModule DetermineModuleByLibrary(std::string library);
3839

src/plugins/core/scripting/sdk/sdkaccess.cpp

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -128,19 +128,20 @@ void SDKBaseClass::CBaseEntity_EmitSoundFromEntity(std::string sound_name, float
128128
}
129129

130130
void SDKBaseClass::CBaseEntity_TakeDamage(EValue attacker, EValue inflictor, EValue ability, int damageType, float damage) {
131-
CTakeDamageInfo info;
132-
info.m_flDamage = damage;
133-
info.m_bitsDamageType = (DDamageTypes_t)damageType;
134-
131+
CBaseEntity* pinflictor = nullptr;
132+
CBaseEntity* pability = nullptr;
133+
CBaseEntity* pattacker = nullptr;
134+
135135
if(ability.isInstance<SDKBaseClass>())
136-
info.m_hAbility.Set((CBaseEntity*)ability.cast<SDKBaseClass>().GetPtr());
136+
pability = (CBaseEntity*)ability.cast<SDKBaseClass>().GetPtr();
137137
if(attacker.isInstance<SDKBaseClass>())
138-
info.m_hAttacker.Set((CBaseEntity*)attacker.cast<SDKBaseClass>().GetPtr());
138+
pattacker = (CBaseEntity*)attacker.cast<SDKBaseClass>().GetPtr();
139139
if(inflictor.isInstance<SDKBaseClass>())
140-
info.m_hInflictor.Set((CBaseEntity*)inflictor.cast<SDKBaseClass>().GetPtr());
140+
pinflictor = (CBaseEntity*)inflictor.cast<SDKBaseClass>().GetPtr();
141+
142+
if(!pinflictor) pinflictor = pattacker;
141143

142-
if(!info.m_hInflictor.IsValid())
143-
info.m_hInflictor.Set(info.m_hAttacker);
144+
CTakeDamageInfo info(pinflictor, pattacker, pability, damage, (DDamageTypes_t)damageType);
144145

145146
((CBaseEntity*)this->GetPtr())->TakeDamage(&info);
146147
}

src/plugins/loader/scripting/sdk/schema.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ JSValue SDKBaseClass__SetProp(JSContext* ctx, JSValue this_obj, int argc, JSValu
107107
std::string field_name = EValue::fromJSStack(ct, argv[1]).cast<std::string>();
108108
EValue val = EValue::fromJSStack(ct, argv[2]);
109109

110-
uint64_t id = g_callStack->RegisterPluginCallstack(FetchPluginName(ct), string_format("SDK Set: %s::%s(ptr=%p,value=%s)", th->m_className.c_str(), field_name.c_str(), th->GetPtr(), val.tostring()));
110+
uint64_t id = g_callStack->RegisterPluginCallstack(FetchPluginName(ct), string_format("SDK Set: %s::%s(ptr=%p,value=%s)", th->m_className.c_str(), field_name.c_str(), th->GetPtr(), val.tostring().c_str()));
111111
th->UpdateSDK(field_name, val, ct);
112112
g_callStack->UnregisterPluginCallstack(FetchPluginName(ct), id);
113113
return JS_UNDEFINED;

src/sdk/entity/CTakeDamageInfo.h

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,17 @@ enum TTakeDamageFlags_t : uint32_t
5353
DFLAG_IGNORE_ARMOR = 0x800,
5454
};
5555

56+
struct AttackerInfo_t
57+
{
58+
bool m_bNeedInit;
59+
bool m_bIsPawn;
60+
bool m_bIsWorld;
61+
CHandle<CCSPlayerPawn> m_hAttackerPawn;
62+
uint16_t m_nAttackerPlayerSlot;
63+
int m_iTeamChecked;
64+
int m_nTeam;
65+
};
66+
5667
struct CTakeDamageInfoContainer
5768
{
5869
CTakeDamageInfo *pInfo;
@@ -64,6 +75,11 @@ class CTakeDamageInfo
6475
[[maybe_unused]] uint8_t __pad0000[0x8];
6576

6677
public:
78+
CTakeDamageInfo(CBaseEntity* pInflictor, CBaseEntity* pAttacker, CBaseEntity* pAbility, float flDamage, DDamageTypes_t bitsDamageType)
79+
{
80+
g_Signatures->FetchSignature<CTakeDamageInfo_Constructor>("CTakeDamageInfo_Constructor")(this, pInflictor, pAttacker, pAbility, &vec3_origin, &vec3_origin, flDamage, bitsDamageType, 0, nullptr);
81+
}
82+
6783
Vector m_vecDamageForce;
6884
Vector m_vecDamagePosition;
6985
Vector m_vecReportedPosition;
@@ -73,32 +89,41 @@ class CTakeDamageInfo
7389
CHandle<CBaseEntity> m_hAbility;
7490
float m_flDamage;
7591
float m_flTotalledDamage;
92+
float m_flTotalledDamageAbsorbed;
7693
DDamageTypes_t m_bitsDamageType;
7794
int32_t m_iDamageCustom;
7895
uint8_t m_iAmmoType;
7996

8097
private:
81-
[[maybe_unused]] uint8_t __pad0051[0xf];
98+
[[maybe_unused]] uint8_t __pad0059[0xf];
8299

83100
public:
84101
float m_flOriginalDamage;
85102
bool m_bShouldBleed;
86103
bool m_bShouldSpark;
87104

88105
private:
89-
[[maybe_unused]] uint8_t __pad0066[0xa];
106+
[[maybe_unused]] uint8_t __pad006e[0x2];
107+
108+
public:
109+
float m_flDamageAbsorbed;
110+
111+
private:
112+
[[maybe_unused]] uint8_t __pad0074[0x8];
90113

91114
public:
92115
TTakeDamageFlags_t m_nDamageFlags;
93-
int32_t m_nNumObjectsPenetrated;
94-
uint64_t m_hScriptInstance;
95116

96117
private:
97-
[[maybe_unused]] uint8_t __pad0080[0x14];
118+
[[maybe_unused]] uint8_t __pad0084[0x4];
98119

99120
public:
121+
int32_t m_nNumObjectsPenetrated;
122+
float m_flFriendlyFireDamageReductionRatio;
123+
uint64_t m_hScriptInstance;
124+
AttackerInfo_t m_AttackerInfo;
100125
bool m_bInTakeDamageFlow;
101126

102127
private:
103-
[[maybe_unused]] uint8_t __pad009d[0x8];
128+
[[maybe_unused]] uint8_t __pad00ad[0x4];
104129
};

0 commit comments

Comments
 (0)