CEntityParticleTrail::Create
0x006803e0 · 603 bytes · __cdecl
_ZN20CEntityParticleTrail6CreateEP11CBaseEntityRK25EntityParticleTrailInfo_tS1_
Decompiled
undefined (3 params)
/* CEntityParticleTrail::Create(CBaseEntity*, EntityParticleTrailInfo_t const&, CBaseEntity*) */
CEntityParticleTrail *
CEntityParticleTrail::Create
(CBaseEntity *param_1,EntityParticleTrailInfo_t *param_2,CBaseEntity *param_3)
{
uint uVar1;
CBaseEdict *pCVar2;
char *pcVar3;
int iVar4;
CEntityParticleTrail *pCVar5;
int iVar6;
undefined4 *puVar7;
undefined *puVar8;
undefined *puVar9;
int iVar10;
CBaseEntity *pCVar11;
pcVar3 = "";
if (*(char **)(param_2 + 4) != (char *)0x0) {
pcVar3 = *(char **)(param_2 + 4);
}
iVar4 = GetMaterialIndex(pcVar3);
puVar9 = g_pEntityList;
uVar1 = *(uint *)(param_1 + 0x18c);
if (((uVar1 != 0xffffffff) &&
(puVar8 = g_pEntityList + (uVar1 & 0xfff) * 0x10, puVar8 != (undefined *)0xfffffffc)) &&
(*(uint *)(puVar8 + 8) == uVar1 >> 0xc)) {
iVar6 = *(int *)(puVar8 + 4);
while (iVar6 != 0) {
uVar1 = *(uint *)(iVar6 + 400);
iVar10 = 0;
if (((uVar1 != 0xffffffff) &&
(puVar8 = puVar9 + (uVar1 & 0xfff) * 0x10, puVar8 != (undefined *)0xfffffffc)) &&
(*(uint *)(puVar8 + 8) == uVar1 >> 0xc)) {
iVar10 = *(int *)(puVar8 + 4);
}
pCVar5 = (CEntityParticleTrail *)__dynamic_cast(iVar6,&CBaseEntity::typeinfo,&typeinfo,0);
iVar6 = iVar10;
if ((pCVar5 != (CEntityParticleTrail *)0x0) && (iVar4 == *(int *)(pCVar5 + 0x440))) {
IncrementRefCount(pCVar5);
return pCVar5;
}
}
}
pCVar5 = (CEntityParticleTrail *)CreateEntityByName("env_particle_trail",-1,true);
if (pCVar5 == (CEntityParticleTrail *)0x0) {
pCVar5 = (CEntityParticleTrail *)0x0;
}
else {
uVar1 = *(uint *)(pCVar5 + 0x458);
pCVar11 = (CBaseEntity *)0x0;
if (((uVar1 != 0xffffffff) &&
(puVar9 = g_pEntityList + (uVar1 & 0xfff) * 0x10, puVar9 != (undefined *)0xfffffffc)) &&
(*(uint *)(puVar9 + 8) == uVar1 >> 0xc)) {
pCVar11 = *(CBaseEntity **)(puVar9 + 4);
}
if (param_3 != pCVar11) {
if (pCVar5[0x6c] == (CEntityParticleTrail)0x0) {
pCVar2 = *(CBaseEdict **)(pCVar5 + 0x30);
if (pCVar2 != (CBaseEdict *)0x0) {
*(uint *)pCVar2 = *(uint *)pCVar2 | 0x101;
iVar6 = CBaseEdict::GetChangeAccessor(pCVar2);
*(undefined2 *)(iVar6 + 2) = 0;
}
}
else {
pCVar5[0x70] = (CEntityParticleTrail)((byte)pCVar5[0x70] | 1);
}
if (param_3 == (CBaseEntity *)0x0) {
*(undefined4 *)(pCVar5 + 0x458) = 0xffffffff;
}
else {
puVar7 = (undefined4 *)(**(code **)(*(int *)param_3 + 0xc))(param_3);
*(undefined4 *)(pCVar5 + 0x458) = *puVar7;
}
}
if (iVar4 != *(int *)(pCVar5 + 0x440)) {
if (pCVar5[0x6c] == (CEntityParticleTrail)0x0) {
pCVar2 = *(CBaseEdict **)(pCVar5 + 0x30);
if (pCVar2 != (CBaseEdict *)0x0) {
*(uint *)pCVar2 = *(uint *)pCVar2 | 0x101;
iVar6 = CBaseEdict::GetChangeAccessor(pCVar2);
*(undefined2 *)(iVar6 + 2) = 0;
}
}
else {
pCVar5[0x70] = (CEntityParticleTrail)((byte)pCVar5[0x70] | 1);
}
*(int *)(pCVar5 + 0x440) = iVar4;
}
*(undefined4 *)(pCVar5 + 0x448) = *(undefined4 *)(param_2 + 4);
*(undefined4 *)(pCVar5 + 0x44c) = *(undefined4 *)(param_2 + 8);
*(undefined4 *)(pCVar5 + 0x450) = *(undefined4 *)(param_2 + 0xc);
*(undefined4 *)(pCVar5 + 0x454) = *(undefined4 *)(param_2 + 0x10);
(*(code *)**(undefined4 **)(pCVar5 + 0x444))(pCVar5 + 0x444);
*(undefined4 *)(pCVar5 + 0x45c) = 1;
AttachToEntity(pCVar5,param_1);
(**(code **)(*(int *)pCVar5 + 100))(pCVar5);
}
return pCVar5;
}
SourceMod gamedata
paste intoaddons/sourcemod/gamedata/<your_plugin>.txt
used as the SourceMod key — change to fit your plugin's convention
SourceMod library name (server / engine / matchmaking)
Just a Signatures{} block, ready to drop into a gamedata
file. Wire it up in your plugin however you like - SDKCall, DHooks,
raw memory ops, or anything else.
Signatures + Functions block. The plugin uses
DHookCreateFromConf - DHooks reads return type, this-type,
calling convention, and argument types straight from the gamedata. Less
boilerplate in the plugin, types travel with the gamedata.
Gamedata KeyValues
DHooks plugin example
Type inference is best-effort from the C signature - sanity-check the DHooks types before shipping.