CStudioHdr::RunFlexRulesNew
0x000e36d0 · 1666 bytes · __thiscall
_ZN10CStudioHdr15RunFlexRulesNewEPKfPf
Decompiled
undefined (3 params)
/* CStudioHdr::RunFlexRulesNew(float const*, float*) */
void __thiscall CStudioHdr::RunFlexRulesNew(CStudioHdr *this,float *param_1,float *param_2)
{
float fVar1;
float fVar2;
float fVar3;
bool bVar4;
undefined1 auVar5 [16];
float *pfVar6;
int *piVar7;
undefined4 *puVar8;
int iVar9;
int iVar10;
float *pfVar11;
int iVar12;
int iVar13;
float fVar14;
ulonglong uVar15;
undefined1 auVar16 [16];
undefined1 auVar17 [16];
undefined1 auVar18 [16];
undefined1 auVar19 [16];
float fVar20;
int local_a8;
int local_a4;
float local_1c [3];
memset(param_2,0,*(int *)(*(int *)this + 0x104) << 2);
local_a8 = 0;
local_a4 = 0;
iVar13 = *(int *)this;
if (0 < *(int *)(iVar13 + 0x114)) {
do {
auVar16 = ZEXT816(0);
piVar7 = (int *)(iVar13 + local_a8 + *(int *)(iVar13 + 0x118));
iVar13 = piVar7[1];
if (iVar13 != 0) {
pfVar11 = local_1c;
puVar8 = (undefined4 *)(piVar7[2] + (int)piVar7);
auVar17 = auVar16;
do {
fVar14 = auVar17._0_4_;
auVar19._12_4_ = auVar17._12_4_;
auVar16 = auVar17;
switch(*puVar8) {
case 1:
pfVar11[-1] = fVar14;
pfVar11 = pfVar11 + -1;
auVar16 = ZEXT416((uint)puVar8[1]);
break;
case 2:
pfVar11[-1] = fVar14;
pfVar11 = pfVar11 + -1;
auVar16 = ZEXT416((uint)param_1[*(int *)(*(int *)this + puVar8[1] * 0x14 +
*(int *)(*(int *)this + 0x110) + 8)]);
break;
case 3:
pfVar11[-1] = fVar14;
pfVar11 = pfVar11 + -1;
auVar16 = ZEXT416((uint)param_2[puVar8[1]]);
break;
case 4:
auVar16._0_4_ = fVar14 + *pfVar11;
auVar16._4_12_ = auVar17._4_12_;
pfVar11 = pfVar11 + 1;
break;
case 5:
fVar20 = *pfVar11;
pfVar11 = pfVar11 + 1;
auVar16 = ZEXT416((uint)(fVar20 - fVar14));
break;
case 6:
auVar16._0_4_ = fVar14 * *pfVar11;
auVar16._4_12_ = auVar17._4_12_;
pfVar11 = pfVar11 + 1;
break;
case 7:
if (fVar14 <= 0.0001) {
uVar15 = 0;
}
else {
uVar15 = (ulonglong)(uint)(*pfVar11 / fVar14);
}
auVar16._8_8_ = 0;
auVar16._0_8_ = uVar15;
pfVar11 = pfVar11 + 1;
break;
case 8:
auVar19._0_8_ = auVar17._0_8_ ^ 0x80000000;
auVar19._8_4_ = auVar17._8_4_;
auVar16 = auVar19;
break;
case 0xd:
if (fVar14 <= *pfVar11) {
auVar17._0_4_ = *pfVar11;
}
pfVar11 = pfVar11 + 1;
auVar16 = auVar17;
break;
case 0xe:
if (*pfVar11 <= fVar14) {
auVar17._0_4_ = *pfVar11;
}
pfVar11 = pfVar11 + 1;
auVar16 = auVar17;
break;
case 0xf:
pfVar11 = pfVar11 + -1;
iVar9 = *(int *)(*(int *)this + puVar8[1] * 0x14 + *(int *)(*(int *)this + 0x110) + 8);
*pfVar11 = fVar14;
fVar14 = param_1[iVar9] + 1.0;
if (1.0 <= param_1[iVar9] + 1.0) {
fVar14 = 1.0;
}
if (fVar14 <= 0.0) {
fVar14 = 0.0;
}
auVar16 = ZEXT416((uint)(1.0 - fVar14));
break;
case 0x10:
pfVar11 = pfVar11 + -1;
iVar9 = *(int *)(*(int *)this + puVar8[1] * 0x14 + *(int *)(*(int *)this + 0x110) + 8);
*pfVar11 = fVar14;
auVar16 = ZEXT416((uint)param_1[iVar9]);
if (1.0 <= param_1[iVar9]) {
auVar16._4_12_ = ZEXT812(0);
auVar16._0_4_ = 1.0;
}
if (auVar16._0_4_ <= 0.0) {
auVar5._12_4_ = 0;
auVar5._0_12_ = auVar16._4_12_;
auVar16 = auVar5 << 0x20;
}
break;
case 0x11:
fVar20 = pfVar11[3];
fVar1 = pfVar11[1];
fVar2 = *pfVar11;
iVar9 = *(int *)this;
auVar18 = ZEXT816(0);
fVar14 = param_1[*(int *)(iVar9 + 8 + *(int *)(iVar9 + 0x110) + (int)fVar14 * 0x14)];
fVar3 = pfVar11[2];
iVar9 = *(int *)(iVar9 + 8 + *(int *)(iVar9 + 0x110) + puVar8[1] * 0x14);
if ((fVar20 < fVar14) && (fVar14 < fVar2)) {
if (fVar3 <= fVar14) {
auVar18._0_12_ = ZEXT812(0x3f800000);
auVar18._12_4_ = 0;
if ((fVar1 < fVar14) && (fVar2 != fVar1)) {
pfVar11 = pfVar11 + 4;
fVar14 = (fVar14 - fVar1) / (fVar2 - fVar1);
if (1.0 <= fVar14) {
fVar14 = 1.0;
}
if (fVar14 <= 0.0) {
fVar14 = 0.0;
}
auVar16 = ZEXT416((uint)((1.0 - fVar14) * param_1[iVar9]));
break;
}
}
else if (fVar3 != fVar20) {
fVar14 = (fVar14 - fVar20) / (fVar3 - fVar20);
if (1.0 <= fVar14) {
fVar14 = 1.0;
}
auVar18 = ZEXT416((uint)fVar14);
if (fVar14 <= 0.0) {
auVar18 = ZEXT816(0) << 0x20;
}
}
}
pfVar11 = pfVar11 + 4;
auVar16._4_12_ = auVar18._4_12_;
auVar16._0_4_ = auVar18._0_4_ * param_1[iVar9];
break;
case 0x12:
iVar9 = puVar8[1];
if (iVar9 != 1) {
iVar10 = 0;
do {
auVar17._0_4_ = auVar17._0_4_ * pfVar11[iVar10];
iVar10 = iVar10 + 1;
} while (iVar10 != iVar9 + -1);
pfVar11 = pfVar11 + iVar9 + -1;
auVar16 = auVar17;
}
break;
case 0x13:
iVar9 = puVar8[1];
fVar20 = *pfVar11;
pfVar6 = pfVar11 + 1;
if (iVar9 != 1) {
iVar10 = 0;
do {
fVar20 = fVar20 * pfVar11[iVar10 + 1];
iVar10 = iVar10 + 1;
} while (iVar10 != iVar9 + -1);
pfVar6 = pfVar11 + iVar9;
}
pfVar11 = pfVar6;
fVar14 = (1.0 - fVar20) * fVar14;
auVar16._4_4_ = fVar14;
auVar16._0_4_ = fVar14;
auVar16._8_8_ = 0;
break;
case 0x14:
iVar9 = *(int *)this;
iVar10 = *(int *)(iVar9 + 0x110);
iVar12 = iVar10 + puVar8[1] * 0x14 + iVar9;
fVar20 = *(float *)(iVar12 + 0x10);
fVar1 = *(float *)(iVar12 + 0xc);
if (fVar20 == fVar1) {
fVar20 = (float)(~-(uint)(fVar20 <= param_1[*(int *)(iVar12 + 8)]) & 0x3f800000);
}
else {
fVar20 = (param_1[*(int *)(iVar12 + 8)] - fVar1) / (fVar20 - fVar1);
if (1.0 <= fVar20) {
fVar20 = 1.0;
}
if (fVar20 <= 0.0) {
fVar20 = 0.0;
}
fVar20 = 1.0 - fVar20;
}
iVar12 = iVar10 + (int)fVar14 * 0x14 + iVar9;
fVar14 = *(float *)(iVar12 + 0x10);
fVar1 = *(float *)(iVar12 + 0xc);
if (fVar14 == fVar1) {
auVar16 = ZEXT816(0) |
ZEXT416((uint)fVar20 & -(uint)(fVar14 <= param_1[*(int *)(iVar12 + 8)]));
}
else {
fVar14 = (param_1[*(int *)(iVar12 + 8)] - fVar1) / (fVar14 - fVar1);
if (1.0 <= fVar14) {
fVar14 = 1.0;
}
if (fVar14 <= 0.0) {
fVar14 = 0.0;
}
auVar16 = ZEXT416((uint)(fVar14 * fVar20));
}
fVar14 = auVar16._0_4_;
if (-1 < (int)pfVar11[1]) {
iVar9 = iVar9 + iVar10 + (int)pfVar11[1] * 0x14;
fVar20 = *(float *)(iVar9 + 0x10);
fVar1 = *(float *)(iVar9 + 0xc);
if (fVar20 == fVar1) {
bVar4 = param_1[*(int *)(iVar9 + 8)] < fVar20;
LAB_000e385a:
auVar16 = ZEXT816(0) | ZEXT416((uint)fVar14 & -(uint)bVar4);
}
else {
fVar20 = (param_1[*(int *)(iVar9 + 8)] - fVar1) / (fVar20 - fVar1);
if (1.0 <= fVar20) {
fVar20 = 1.0;
}
if (fVar20 <= 0.0) {
fVar20 = 0.0;
}
fVar20 = (fVar20 + fVar20) - 1.0;
if (0.0 < fVar20) {
auVar16._0_4_ = fVar14 * (1.0 - fVar20);
}
}
}
goto LAB_000e3869;
case 0x15:
iVar9 = *(int *)this;
iVar10 = *(int *)(iVar9 + 0x110);
iVar12 = iVar10 + puVar8[1] * 0x14 + iVar9;
fVar20 = *(float *)(iVar12 + 0x10);
fVar1 = *(float *)(iVar12 + 0xc);
if (fVar20 == fVar1) {
fVar20 = (float)(-(uint)(fVar20 <= param_1[*(int *)(iVar12 + 8)]) & 0x3f800000);
}
else {
fVar20 = (param_1[*(int *)(iVar12 + 8)] - fVar1) / (fVar20 - fVar1);
if (1.0 <= fVar20) {
fVar20 = 1.0;
}
if (fVar20 <= 0.0) {
fVar20 = 0.0;
}
}
iVar12 = iVar10 + (int)fVar14 * 0x14 + iVar9;
fVar14 = *(float *)(iVar12 + 0x10);
fVar1 = *(float *)(iVar12 + 0xc);
if (fVar14 == fVar1) {
auVar16 = ZEXT816(0) |
ZEXT416((uint)fVar20 & -(uint)(fVar14 <= param_1[*(int *)(iVar12 + 8)]));
}
else {
fVar14 = (param_1[*(int *)(iVar12 + 8)] - fVar1) / (fVar14 - fVar1);
if (1.0 <= fVar14) {
fVar14 = 1.0;
}
if (fVar14 <= 0.0) {
fVar14 = 0.0;
}
auVar16 = ZEXT416((uint)(fVar14 * fVar20));
}
fVar14 = auVar16._0_4_;
if (-1 < (int)pfVar11[1]) {
iVar9 = iVar9 + iVar10 + (int)pfVar11[1] * 0x14;
fVar20 = *(float *)(iVar9 + 0x10);
fVar1 = *(float *)(iVar9 + 0xc);
if (fVar20 == fVar1) {
bVar4 = fVar20 <= param_1[*(int *)(iVar9 + 8)];
goto LAB_000e385a;
}
fVar20 = (param_1[*(int *)(iVar9 + 8)] - fVar1) / (fVar20 - fVar1);
if (1.0 <= fVar20) {
fVar20 = 1.0;
}
if (fVar20 <= 0.0) {
fVar20 = 0.0;
}
fVar20 = (fVar20 + fVar20) - 1.0;
if (fVar20 < 0.0) {
auVar16._0_4_ = fVar14 * (fVar20 + 1.0);
}
}
LAB_000e3869:
pfVar11 = pfVar11 + 2;
}
puVar8 = puVar8 + 2;
iVar13 = iVar13 + -1;
auVar17 = auVar16;
} while (iVar13 != 0);
}
local_a4 = local_a4 + 1;
local_a8 = local_a8 + 0xc;
param_2[*piVar7] = auVar16._0_4_;
iVar13 = *(int *)this;
} while (local_a4 < *(int *)(iVar13 + 0x114));
}
return;
}
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.