CPhysicsHook::FindOrAddVehicleScript
0x007804c0 · 1822 bytes · __thiscall
_ZN12CPhysicsHook22FindOrAddVehicleScriptEPKcP15vehicleparams_tP15vehiclesounds_t
Decompiled
undefined (4 params)
/* CPhysicsHook::FindOrAddVehicleScript(char const*, vehicleparams_t*, vehiclesounds_t*) */
undefined4 __thiscall
CPhysicsHook::FindOrAddVehicleScript
(CPhysicsHook *this,char *param_1,vehicleparams_t *param_2,vehiclesounds_t *param_3)
{
bool bVar1;
char cVar2;
char *pcVar3;
int iVar4;
vehicleparams_t *pvVar5;
vehicleparams_t *pvVar6;
vehicleparams_t *pvVar7;
uchar *puVar8;
int *piVar9;
int iVar10;
undefined4 *puVar11;
int iVar12;
undefined4 *puVar13;
int iVar14;
int iVar15;
int iVar16;
vehiclesounds_t *pvVar17;
byte bVar18;
int local_5c;
undefined4 local_30;
CVehicleSoundsParser local_2c [28];
bVar18 = 0;
if (0 < *(int *)(this + 0x4c)) {
iVar16 = 0;
local_5c = 0;
do {
pcVar3 = *(char **)(*(int *)(this + 0x40) + iVar16);
if (pcVar3 == (char *)0x0) {
pcVar3 = "";
}
iVar4 = _V_stricmp(pcVar3,param_1);
if (iVar4 == 0) {
bVar1 = true;
LAB_0078052d:
if (param_2 != (vehicleparams_t *)0x0) {
iVar12 = local_5c * 0x394 + *(int *)(this + 0x40);
puVar13 = (undefined4 *)(iVar12 + 0x34);
iVar16 = iVar12 + 0x40;
*(undefined4 *)param_2 = *(undefined4 *)(iVar12 + 4);
*(undefined4 *)(param_2 + 4) = *(undefined4 *)(iVar12 + 8);
pvVar5 = param_2 + 0x30;
*(undefined4 *)(param_2 + 8) = *(undefined4 *)(iVar12 + 0xc);
*(undefined4 *)(param_2 + 0xc) = *(undefined4 *)(iVar12 + 0x10);
*(undefined4 *)(param_2 + 0x10) = *(undefined4 *)(iVar12 + 0x14);
*(undefined4 *)(param_2 + 0x14) = *(undefined4 *)(iVar12 + 0x18);
*(undefined4 *)(param_2 + 0x18) = *(undefined4 *)(iVar12 + 0x1c);
*(undefined4 *)(param_2 + 0x1c) = *(undefined4 *)(iVar12 + 0x20);
*(undefined4 *)(param_2 + 0x20) = *(undefined4 *)(iVar12 + 0x24);
*(undefined4 *)(param_2 + 0x24) = *(undefined4 *)(iVar12 + 0x28);
*(undefined4 *)(param_2 + 0x28) = *(undefined4 *)(iVar12 + 0x2c);
*(undefined4 *)(param_2 + 0x2c) = *(undefined4 *)(iVar12 + 0x30);
iVar4 = iVar12 + 0x4c;
iVar10 = iVar12 + 0x58;
pvVar6 = pvVar5;
puVar11 = puVar13;
do {
*(undefined4 *)pvVar6 = *puVar11;
*(undefined4 *)(pvVar6 + 4) = puVar11[1];
*(undefined4 *)(pvVar6 + 8) = puVar11[2];
pvVar7 = pvVar6 + 0x74;
*(undefined4 *)(param_2 + (int)(pvVar6 + (0x3c - (int)pvVar5))) =
*(undefined4 *)((int)puVar11 + (iVar16 - (int)puVar13));
*(undefined4 *)(param_2 + (int)(pvVar6 + (0x40 - (int)pvVar5))) =
*(undefined4 *)((int)puVar11 + iVar16 + (4 - (int)puVar13));
*(undefined4 *)(param_2 + (int)(pvVar6 + (0x44 - (int)pvVar5))) =
*(undefined4 *)((int)puVar11 + iVar16 + (8 - (int)puVar13));
*(undefined4 *)(param_2 + (int)(pvVar6 + (0x48 - (int)pvVar5))) =
*(undefined4 *)((int)puVar11 + (iVar4 - (int)puVar13));
*(undefined4 *)(param_2 + (int)(pvVar6 + (0x4c - (int)pvVar5))) =
*(undefined4 *)((int)puVar11 + iVar4 + (4 - (int)puVar13));
*(undefined4 *)(param_2 + (int)(pvVar6 + (0x50 - (int)pvVar5))) =
*(undefined4 *)((int)puVar11 + iVar4 + (8 - (int)puVar13));
*(undefined4 *)(param_2 + (int)(pvVar6 + (0x54 - (int)pvVar5))) =
*(undefined4 *)((int)puVar11 + (iVar10 - (int)puVar13));
*(undefined4 *)(param_2 + (int)(pvVar6 + (0x58 - (int)pvVar5))) =
*(undefined4 *)((int)puVar11 + iVar10 + (4 - (int)puVar13));
*(undefined4 *)(param_2 + (int)(pvVar6 + (0x5c - (int)pvVar5))) =
*(undefined4 *)((int)puVar11 + iVar10 + (8 - (int)puVar13));
*(undefined4 *)(pvVar6 + 0x30) = puVar11[0xc];
*(undefined4 *)(pvVar6 + 0x34) = puVar11[0xd];
*(undefined4 *)(pvVar6 + 0x38) = puVar11[0xe];
*(undefined4 *)(pvVar6 + 0x3c) = puVar11[0xf];
*(undefined4 *)(pvVar6 + 0x40) = puVar11[0x10];
*(undefined4 *)(pvVar6 + 0x44) = puVar11[0x11];
*(undefined4 *)(pvVar6 + 0x48) = puVar11[0x12];
*(undefined4 *)(pvVar6 + 0x4c) = puVar11[0x13];
*(undefined4 *)(pvVar6 + 0x50) = puVar11[0x14];
*(undefined4 *)(pvVar6 + 0x54) = puVar11[0x15];
*(undefined4 *)(pvVar6 + 0x58) = puVar11[0x16];
*(undefined4 *)(pvVar6 + 0x5c) = puVar11[0x17];
*(undefined4 *)(pvVar6 + 0x60) = puVar11[0x18];
*(undefined4 *)(pvVar6 + 100) = puVar11[0x19];
*(undefined4 *)(pvVar6 + 0x68) = puVar11[0x1a];
*(undefined4 *)(pvVar6 + 0x6c) = puVar11[0x1b];
*(undefined4 *)(pvVar6 + 0x70) = puVar11[0x1c];
pvVar6 = pvVar7;
puVar11 = puVar11 + 0x1d;
} while (pvVar7 != param_2 + 0x200);
puVar13 = (undefined4 *)(iVar12 + 0x204);
for (iVar16 = 0x16; iVar16 != 0; iVar16 = iVar16 + -1) {
*(undefined4 *)pvVar7 = *puVar13;
puVar13 = puVar13 + (uint)bVar18 * -2 + 1;
pvVar7 = pvVar7 + (uint)bVar18 * -8 + 4;
}
puVar13 = (undefined4 *)(iVar12 + 0x25c);
pvVar6 = param_2 + 600;
for (iVar16 = 0x12; iVar16 != 0; iVar16 = iVar16 + -1) {
*(undefined4 *)pvVar6 = *puVar13;
puVar13 = puVar13 + (uint)bVar18 * -2 + 1;
pvVar6 = pvVar6 + (uint)bVar18 * -8 + 4;
}
}
if (param_3 == (vehiclesounds_t *)0x0) {
return 1;
}
if (!bVar1) {
return 0;
}
iVar4 = local_5c * 0x394 + *(int *)(this + 0x40);
iVar16 = *(int *)(iVar4 + 0x2b4);
*(undefined4 *)(param_3 + 0x10) = 0;
if (iVar16 != 0) {
CUtlVector<vehicle_gear_t,CUtlMemory<vehicle_gear_t,int>>::GrowVector
((CUtlVector<vehicle_gear_t,CUtlMemory<vehicle_gear_t,int>> *)(param_3 + 4),
iVar16);
if (*(int *)(param_3 + 0x10) - iVar16 < 1) {
if (0 < iVar16) {
LAB_00780a24:
iVar10 = *(int *)(param_3 + 4);
iVar12 = 0;
do {
puVar13 = (undefined4 *)(iVar12 * 0x10 + iVar10);
if (puVar13 != (undefined4 *)0x0) {
*puVar13 = &PTR_GetDataDescMap_00d4a858;
iVar10 = *(int *)(param_3 + 4);
}
iVar12 = iVar12 + 1;
} while (iVar12 < iVar16);
iVar12 = 0;
while( true ) {
iVar14 = *(int *)(iVar4 + 0x2a8) + iVar12 * 0x10;
iVar10 = iVar12 * 0x10 + iVar10;
*(undefined4 *)(iVar10 + 4) = *(undefined4 *)(iVar14 + 4);
*(undefined4 *)(iVar10 + 8) = *(undefined4 *)(iVar14 + 8);
*(undefined4 *)(iVar10 + 0xc) = *(undefined4 *)(iVar14 + 0xc);
if (iVar16 <= iVar12 + 1) break;
iVar10 = *(int *)(param_3 + 4);
iVar12 = iVar12 + 1;
}
}
}
else if (0 < iVar16) {
_V_memmove((void *)((int)*(void **)(param_3 + 4) + iVar16 * 0x10),
*(void **)(param_3 + 4),(*(int *)(param_3 + 0x10) - iVar16) * 0x10);
goto LAB_00780a24;
}
}
iVar16 = *(int *)(iVar4 + 0x2c8);
*(undefined4 *)(param_3 + 0x24) = 0;
if (iVar16 != 0) {
CUtlVector<vehicle_crashsound_t,CUtlMemory<vehicle_crashsound_t,int>>::GrowVector
((CUtlVector<vehicle_crashsound_t,CUtlMemory<vehicle_crashsound_t,int>> *)
(param_3 + 0x18),iVar16);
if (*(int *)(param_3 + 0x24) - iVar16 < 1) {
if (iVar16 < 1) goto LAB_007807c1;
}
else {
if (iVar16 < 1) goto LAB_007807c1;
_V_memmove((void *)((int)*(void **)(param_3 + 0x18) + iVar16 * 0x14),
*(void **)(param_3 + 0x18),(*(int *)(param_3 + 0x24) - iVar16) * 0x14);
}
iVar14 = 0;
iVar12 = 0;
iVar10 = *(int *)(param_3 + 0x18);
do {
if ((undefined4 *)(iVar10 + iVar14) != (undefined4 *)0x0) {
*(undefined4 *)(iVar10 + iVar14) = &PTR_GetDataDescMap_00d4a868;
iVar10 = *(int *)(param_3 + 0x18);
}
iVar12 = iVar12 + 1;
iVar14 = iVar14 + 0x14;
} while (iVar12 < iVar16);
iVar12 = 0;
iVar14 = 0;
while( true ) {
iVar10 = iVar10 + iVar12;
iVar14 = iVar14 + 1;
iVar15 = *(int *)(iVar4 + 700) + iVar12;
iVar12 = iVar12 + 0x14;
*(undefined4 *)(iVar10 + 4) = *(undefined4 *)(iVar15 + 4);
*(undefined4 *)(iVar10 + 8) = *(undefined4 *)(iVar15 + 8);
*(undefined4 *)(iVar10 + 0xc) = *(undefined4 *)(iVar15 + 0xc);
*(undefined4 *)(iVar10 + 0x10) = *(undefined4 *)(iVar15 + 0x10);
if (iVar16 <= iVar14) break;
iVar10 = *(int *)(param_3 + 0x18);
}
}
LAB_007807c1:
*(undefined4 *)(param_3 + 0x2c) = *(undefined4 *)(iVar4 + 0x2d0);
*(undefined4 *)(param_3 + 0x30) = *(undefined4 *)(iVar4 + 0x2d4);
*(undefined4 *)(param_3 + 0x34) = *(undefined4 *)(iVar4 + 0x2d8);
*(undefined4 *)(param_3 + 0x38) = *(undefined4 *)(iVar4 + 0x2dc);
*(undefined4 *)(param_3 + 0x3c) = *(undefined4 *)(iVar4 + 0x2e0);
*(undefined4 *)(param_3 + 0x40) = *(undefined4 *)(iVar4 + 0x2e4);
*(undefined4 *)(param_3 + 0x44) = *(undefined4 *)(iVar4 + 0x2e8);
*(undefined4 *)(param_3 + 0x48) = *(undefined4 *)(iVar4 + 0x2ec);
*(undefined4 *)(param_3 + 0x4c) = *(undefined4 *)(iVar4 + 0x2f0);
puVar13 = (undefined4 *)(iVar4 + 0x2f4);
pvVar17 = param_3 + 0x50;
for (iVar16 = 0x14; iVar16 != 0; iVar16 = iVar16 + -1) {
*(undefined4 *)pvVar17 = *puVar13;
puVar13 = puVar13 + (uint)bVar18 * -2 + 1;
pvVar17 = pvVar17 + (uint)bVar18 * -8 + 4;
}
puVar13 = (undefined4 *)(iVar4 + 0x344);
pvVar17 = param_3 + 0xa0;
for (iVar16 = 0x14; iVar16 != 0; iVar16 = iVar16 + -1) {
*(undefined4 *)pvVar17 = *puVar13;
puVar13 = puVar13 + (uint)bVar18 * -2 + 1;
pvVar17 = pvVar17 + (uint)bVar18 * -8 + 4;
}
return 1;
}
local_5c = local_5c + 1;
iVar16 = iVar16 + 0x394;
} while (local_5c < *(int *)(this + 0x4c));
}
puVar8 = (uchar *)UTIL_LoadFileForMe(param_1,(int *)0x0);
if (puVar8 == (uchar *)0x0) {
return 0;
}
local_5c = CUtlVector<vehiclescript_t,CUtlMemory<vehiclescript_t,int>>::InsertBefore
((CUtlVector<vehiclescript_t,CUtlMemory<vehiclescript_t,int>> *)(this + 0x40)
,*(int *)(this + 0x4c));
iVar4 = local_5c * 0x394;
iVar16 = *(int *)(this + 0x40);
AllocPooledString((char *)&local_30);
*(undefined4 *)(iVar16 + iVar4) = local_30;
iVar10 = iVar4 + *(int *)(this + 0x40);
*(undefined4 *)(iVar10 + 0x2b4) = 0;
CUtlMemory<vehicle_gear_t,int>::Purge((CUtlMemory<vehicle_gear_t,int> *)(iVar10 + 0x2a8));
*(undefined4 *)(iVar10 + 0x2c8) = 0;
*(undefined4 *)(iVar10 + 0x2b8) = *(undefined4 *)(iVar10 + 0x2a8);
CUtlMemory<vehicle_crashsound_t,int>::Purge
((CUtlMemory<vehicle_crashsound_t,int> *)(iVar10 + 700));
*(undefined4 *)(iVar10 + 0x2cc) = *(undefined4 *)(iVar10 + 700);
iVar16 = 0;
do {
*(undefined4 *)(iVar10 + 0x2d0 + iVar16 * 4) = 0;
iVar16 = iVar16 + 1;
} while (iVar16 != 9);
iVar16 = 0;
do {
*(undefined4 *)(iVar10 + 0x2f4 + iVar16 * 4) = 0;
*(undefined4 *)(iVar10 + 0x344 + iVar16 * 4) = 0;
iVar16 = iVar16 + 1;
} while (iVar16 != 0x14);
piVar9 = (int *)(**(code **)(*physcollision + 0x9c))(physcollision,puVar8);
bVar1 = false;
do {
cVar2 = (**(code **)(*piVar9 + 0xc))(piVar9);
while( true ) {
if (cVar2 != '\0') {
(**(code **)(*physcollision + 0xa4))(physcollision,piVar9);
UTIL_FreeFile(puVar8);
if (local_5c < 0) {
return 0;
}
goto LAB_0078052d;
}
pcVar3 = (char *)(**(code **)(*piVar9 + 8))(piVar9);
iVar16 = _V_stricmp(pcVar3,"vehicle");
if (iVar16 != 0) break;
(**(code **)(*piVar9 + 0x24))(piVar9,iVar4 + *(int *)(this + 0x40) + 4,0);
cVar2 = (**(code **)(*piVar9 + 0xc))(piVar9);
}
iVar16 = _V_stricmp(pcVar3,"vehicle_sounds");
if (iVar16 == 0) {
CVehicleSoundsParser::CVehicleSoundsParser(local_2c);
(**(code **)(*piVar9 + 0x20))(piVar9,iVar4 + *(int *)(this + 0x40) + 0x2a4,local_2c);
bVar1 = true;
}
else {
(**(code **)(*piVar9 + 0x28))(piVar9);
}
} while( true );
}
SourceMod gamedata
paste intoaddons/sourcemod/gamedata/<your_plugin>.txt
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.
Type inference is best-effort from the C signature - sanity-check the DHooks types before shipping.