Studio_IKSequenceError
0x00b86500 · 3376 bytes · __cdecl
_Z22Studio_IKSequenceErrorPK10CStudioHdrR16mstudioseqdesc_tifiPKfPP17mstudioanimdesc_tPfR17ikcontextikrule_t
Decompiled
undefined (9 params)
/* Studio_IKSequenceError(CStudioHdr const*, mstudioseqdesc_t&, int, float, int, float const*,
mstudioanimdesc_t**, float*, ikcontextikrule_t&) */
undefined4
Studio_IKSequenceError
(CStudioHdr *param_1,mstudioseqdesc_t *param_2,int param_3,float param_4,int param_5,
float *param_6,mstudioanimdesc_t **param_7,float *param_8,ikcontextikrule_t *param_9)
{
float fVar1;
ushort uVar2;
short sVar3;
char cVar4;
byte bVar5;
mstudioikrule_t *pmVar6;
mstudioanimdesc_t *pmVar7;
int iVar8;
int iVar9;
uint uVar10;
uint uVar11;
mstudioanimdesc_t **ppmVar12;
ikcontextikrule_t *piVar13;
float *pfVar14;
longdouble lVar15;
float fVar16;
float fVar17;
float fVar18;
float fVar19;
float fVar20;
float local_3c;
float local_38;
float local_34;
float local_30;
Quaternion local_2c [28];
fVar16 = 0.0;
fVar18 = 0.0;
piVar13 = param_9;
for (iVar9 = 0x21; iVar9 != 0; iVar9 = iVar9 + -1) {
*(undefined4 *)piVar13 = 0;
piVar13 = piVar13 + 4;
}
ppmVar12 = param_7;
pfVar14 = param_8;
do {
if (*pfVar14 != 0.0) {
iVar9 = *(int *)(*ppmVar12 + 0x3c);
if (iVar9 <= param_5) {
return 0;
}
if (iVar9 != *(int *)(*param_7 + 0x3c)) {
return 0;
}
iVar9 = mstudioanimdesc_t::pIKRule(*ppmVar12,param_5);
if (iVar9 == 0) {
iVar9 = *(int *)(*ppmVar12 + 0x1c);
if (iVar9 == 0) {
return 0;
}
pmVar7 = *ppmVar12 + iVar9 + param_5 * 0xc;
if (pmVar7 == (mstudioanimdesc_t *)0x0) {
return 0;
}
fVar19 = fVar16;
if (fVar18 == 0.0) {
uVar2 = *(ushort *)(pmVar7 + 4);
uVar10 = (uint)uVar2;
if ((uVar2 & 0x7fff) == 0x7c00) {
fVar18 = 65504.0;
if ((short)uVar2 < 0) {
fVar18 = -65504.0;
}
}
else {
bVar5 = (byte)(uVar2 >> 8);
if ((bVar5 & 0x7c) == 0x7c) {
if ((uVar2 & 0x3ff) == 0) goto LAB_00b86f00;
}
else if (((uVar2 & 0x7c00) == 0) && ((uVar2 & 0x3ff) != 0)) {
fVar18 = 1.0;
if ((short)uVar2 < 0) {
fVar18 = -1.0;
}
fVar18 = ((float)(uVar2 & 0x3ff) + 0.0) * 5.9604645e-08 * fVar18;
}
else {
LAB_00b86f00:
fVar18 = (float)((uVar10 & 0x3ff) << 0xd | (uint)(bVar5 >> 7) << 0x1f |
((uVar2 >> 10 & 0x1f) + 0x70) * (uint)((uVar2 >> 10 & 0x1f) != 0) *
0x800000);
}
}
}
else {
uVar2 = *(ushort *)(pmVar7 + 4);
uVar10 = (uint)uVar2;
if ((uVar2 & 0x7fff) == 0x7c00) {
fVar17 = 65504.0;
if ((short)uVar2 < 0) {
fVar17 = -65504.0;
}
}
else {
bVar5 = (byte)(uVar2 >> 8);
if ((bVar5 & 0x7c) == 0x7c) {
fVar17 = fVar16;
if ((uVar2 & 0x3ff) == 0) goto LAB_00b86f55;
}
else if (((uVar2 & 0x7c00) == 0) && ((uVar2 & 0x3ff) != 0)) {
fVar17 = 1.0;
if ((short)uVar2 < 0) {
fVar17 = -1.0;
}
fVar17 = ((float)(uVar2 & 0x3ff) + 0.0) * 5.9604645e-08 * fVar17;
}
else {
LAB_00b86f55:
fVar17 = (float)((uVar10 & 0x3ff) << 0xd | (uint)(bVar5 >> 7) << 0x1f |
((uVar2 >> 10 & 0x1f) + 0x70) * (uint)((uVar2 >> 10 & 0x1f) != 0) *
0x800000);
}
}
if (0.5 < fVar17 - fVar18) {
fVar19 = -1.0;
}
else if (fVar17 - fVar18 < -0.5) {
fVar19 = 1.0;
}
}
bVar5 = (byte)(uVar10 >> 8);
if (((ushort)uVar10 & 0x7fff) == 0x7c00) {
fVar17 = 65504.0;
if ((char)bVar5 < '\0') {
fVar17 = -65504.0;
}
}
else if ((bVar5 & 0x7c) == 0x7c) {
fVar17 = fVar16;
if ((uVar10 & 0x3ff) == 0) goto LAB_00b870f5;
}
else if (((uVar10 & 0x7c00) == 0) && ((uVar10 & 0x3ff) != 0)) {
fVar17 = 1.0;
if ((char)bVar5 < '\0') {
fVar17 = -1.0;
}
fVar17 = ((float)((ushort)uVar10 & 0x3ff) + 0.0) * 5.9604645e-08 * fVar17;
}
else {
LAB_00b870f5:
uVar11 = uVar10 >> 10 & 0x1f;
fVar17 = (float)((uVar10 & 0x3ff) << 0xd | (uVar10 >> 0xf) << 0x1f |
(uVar11 + 0x70) * (uint)(uVar11 != 0) * 0x800000);
}
*(float *)(param_9 + 0x3c) = (fVar17 + fVar19) * *pfVar14 + *(float *)(param_9 + 0x3c);
uVar2 = *(ushort *)(pmVar7 + 6);
if ((uVar2 & 0x7fff) == 0x7c00) {
fVar17 = 65504.0;
if ((short)uVar2 < 0) {
fVar17 = -65504.0;
}
}
else {
bVar5 = (byte)(uVar2 >> 8);
if ((bVar5 & 0x7c) == 0x7c) {
fVar17 = fVar16;
if ((uVar2 & 0x3ff) == 0) goto LAB_00b87045;
}
else if (((uVar2 & 0x7c00) == 0) && ((uVar2 & 0x3ff) != 0)) {
fVar17 = 1.0;
if ((short)uVar2 < 0) {
fVar17 = -1.0;
}
fVar17 = ((float)(uVar2 & 0x3ff) + 0.0) * 5.9604645e-08 * fVar17;
}
else {
LAB_00b87045:
fVar17 = (float)((uVar2 & 0x3ff) << 0xd | (uint)(bVar5 >> 7) << 0x1f |
((uVar2 >> 10 & 0x1f) + 0x70) * (uint)((uVar2 >> 10 & 0x1f) != 0) *
0x800000);
}
}
*(float *)(param_9 + 0x40) = (fVar17 + fVar19) * *pfVar14 + *(float *)(param_9 + 0x40);
uVar2 = *(ushort *)(pmVar7 + 8);
if ((uVar2 & 0x7fff) == 0x7c00) {
fVar17 = 65504.0;
if ((short)uVar2 < 0) {
fVar17 = -65504.0;
}
}
else {
bVar5 = (byte)(uVar2 >> 8);
if ((bVar5 & 0x7c) == 0x7c) {
fVar17 = fVar16;
if ((uVar2 & 0x3ff) == 0) goto LAB_00b86fed;
}
else if (((uVar2 & 0x7c00) == 0) && ((uVar2 & 0x3ff) != 0)) {
fVar17 = 1.0;
if ((short)uVar2 < 0) {
fVar17 = -1.0;
}
fVar17 = ((float)(uVar2 & 0x3ff) + 0.0) * 5.9604645e-08 * fVar17;
}
else {
LAB_00b86fed:
fVar17 = (float)((uVar2 & 0x3ff) << 0xd | (uint)(bVar5 >> 7) << 0x1f |
((uVar2 >> 10 & 0x1f) + 0x70) * (uint)((uVar2 >> 10 & 0x1f) != 0) *
0x800000);
}
}
*(float *)(param_9 + 0x44) = (fVar17 + fVar19) * *pfVar14 + *(float *)(param_9 + 0x44);
uVar2 = *(ushort *)(pmVar7 + 10);
if ((uVar2 & 0x7fff) == 0x7c00) {
fVar17 = 65504.0;
if ((short)uVar2 < 0) {
fVar17 = -65504.0;
}
}
else {
bVar5 = (byte)(uVar2 >> 8);
if ((bVar5 & 0x7c) == 0x7c) {
fVar17 = fVar16;
if ((uVar2 & 0x3ff) == 0) goto LAB_00b8709d;
}
else if (((uVar2 & 0x7c00) == 0) && ((uVar2 & 0x3ff) != 0)) {
fVar17 = 1.0;
if ((short)uVar2 < 0) {
fVar17 = -1.0;
}
fVar17 = ((float)(uVar2 & 0x3ff) + 0.0) * 5.9604645e-08 * fVar17;
}
else {
LAB_00b8709d:
fVar17 = (float)((uVar2 & 0x3ff) << 0xd | (uint)(bVar5 >> 7) << 0x1f |
((uVar2 >> 10 & 0x1f) + 0x70) * (uint)((uVar2 >> 10 & 0x1f) != 0) *
0x800000);
}
}
*(float *)(param_9 + 0x48) = (fVar19 + fVar17) * *pfVar14 + *(float *)(param_9 + 0x48);
}
else {
if (fVar18 == 0.0) {
fVar19 = *(float *)(iVar9 + 0x4c);
fVar17 = fVar16;
fVar18 = fVar19;
}
else {
fVar19 = *(float *)(iVar9 + 0x4c);
fVar17 = -1.0;
if (fVar19 - fVar18 <= 0.5) {
fVar17 = (float)(-(uint)(fVar19 - fVar18 < -0.5) & 0x3f800000);
}
}
*(float *)(param_9 + 0x3c) = (fVar19 + fVar17) * *pfVar14 + *(float *)(param_9 + 0x3c);
*(float *)(param_9 + 0x40) =
(*(float *)(iVar9 + 0x50) + fVar17) * *pfVar14 + *(float *)(param_9 + 0x40);
*(float *)(param_9 + 0x44) =
(*(float *)(iVar9 + 0x54) + fVar17) * *pfVar14 + *(float *)(param_9 + 0x44);
*(float *)(param_9 + 0x48) =
(fVar17 + *(float *)(iVar9 + 0x58)) * *pfVar14 + *(float *)(param_9 + 0x48);
}
}
ppmVar12 = ppmVar12 + 1;
pfVar14 = pfVar14 + 1;
if (ppmVar12 == param_7 + 4) {
fVar18 = *(float *)(param_9 + 0x3c);
if (fVar18 <= 1.0) {
if (fVar18 < 0.0) {
*(float *)(param_9 + 0x3c) = fVar18 + 1.0;
*(float *)(param_9 + 0x40) = *(float *)(param_9 + 0x40) + 1.0;
*(float *)(param_9 + 0x44) = *(float *)(param_9 + 0x44) + 1.0;
*(float *)(param_9 + 0x48) = *(float *)(param_9 + 0x48) + 1.0;
}
}
else {
*(float *)(param_9 + 0x3c) = fVar18 - 1.0;
*(float *)(param_9 + 0x40) = *(float *)(param_9 + 0x40) - 1.0;
*(float *)(param_9 + 0x44) = *(float *)(param_9 + 0x44) - 1.0;
*(float *)(param_9 + 0x48) = *(float *)(param_9 + 0x48) - 1.0;
}
lVar15 = (longdouble)Studio_IKRuleWeight(param_9,param_4);
*(float *)(param_9 + 0x5c) = (float)lVar15;
if ((float)lVar15 <= 0.001) {
iVar9 = mstudioanimdesc_t::pIKRule(*param_7,param_5);
if (iVar9 == 0) {
return 0;
}
if (((byte)(*param_7)[0xc] & 1) == 0) {
return 0;
}
iVar9 = mstudioanimdesc_t::pIKRule(*param_7,param_5);
if (*(int *)(iVar9 + 4) != 3) {
return 0;
}
if (*(float *)(param_9 + 0x48) - *(float *)(param_9 + 0x3c) <= 0.75) {
return 0;
}
param_4 = *(float *)(param_9 + 0x48) - 0.001;
*(undefined4 *)(param_9 + 0x5c) = 0x3a83126f;
}
*(undefined4 *)(param_9 + 0x20) = 0;
*(undefined4 *)(param_9 + 0x24) = 0;
*(undefined4 *)(param_9 + 0x28) = 0;
iVar9 = 0;
*(undefined4 *)(param_9 + 0x2c) = 0;
*(undefined4 *)(param_9 + 0x30) = 0;
*(undefined4 *)(param_9 + 0x34) = 0;
*(undefined4 *)(param_9 + 0x38) = 0;
fVar18 = fVar16;
do {
if (*param_8 != 0.0) {
pmVar6 = (mstudioikrule_t *)mstudioanimdesc_t::pIKRule(param_7[iVar9],param_5);
if (pmVar6 == (mstudioikrule_t *)0x0) {
iVar8 = *(int *)(param_7[iVar9] + 0x1c);
if (iVar8 == 0) {
return 0;
}
pmVar7 = param_7[iVar9] + iVar8 + param_5 * 0xc;
if (pmVar7 == (mstudioanimdesc_t *)0x0) {
return 0;
}
*(undefined4 *)(param_9 + 4) = 4;
*(int *)(param_9 + 8) = (int)*(short *)pmVar7;
uVar10 = 3;
sVar3 = *(short *)(pmVar7 + 2);
*(undefined4 *)(param_9 + 0xc) = 0xffffffff;
*(int *)(param_9 + 0x10) = (int)sVar3;
iVar8 = 4;
}
else {
*(undefined4 *)(param_9 + 8) = *(undefined4 *)(pmVar6 + 8);
*(undefined4 *)(param_9 + 0xc) = *(undefined4 *)(pmVar6 + 0xc);
iVar8 = *(int *)(pmVar6 + 4);
*(int *)(param_9 + 4) = iVar8;
*(undefined4 *)(param_9 + 0x10) = *(undefined4 *)(pmVar6 + 0x10);
uVar10 = iVar8 - 1;
*(float *)(param_9 + 0x14) =
*param_8 * *(float *)(pmVar6 + 0x14) + *(float *)(param_9 + 0x14);
*(float *)(param_9 + 0x1c) =
*param_8 * *(float *)(pmVar6 + 0x1c) + *(float *)(param_9 + 0x1c);
*(float *)(param_9 + 0x18) =
*param_8 * *(float *)(pmVar6 + 0x18) + *(float *)(param_9 + 0x18);
*(float *)(param_9 + 0x50) =
*param_8 * *(float *)(pmVar6 + 100) + *(float *)(param_9 + 0x50);
*(float *)(param_9 + 0x4c) =
*param_8 * *(float *)(pmVar6 + 0x68) + *(float *)(param_9 + 0x4c);
}
fVar19 = *(float *)(param_9 + 0x48);
fVar17 = param_4;
if (1.0 < fVar19) {
fVar17 = (float)(~-(uint)(param_4 < *(float *)(param_9 + 0x3c)) & (uint)param_4 |
(uint)(param_4 + 1.0) & -(uint)(param_4 < *(float *)(param_9 + 0x3c)));
}
fVar1 = *(float *)(param_9 + 0x44);
fVar20 = fVar16;
if ((fVar1 < fVar17) && (fVar17 < fVar19)) {
fVar20 = (fVar17 - fVar1) / (fVar19 - fVar1);
}
*(float *)(param_9 + 0x58) = *(float *)(param_9 + 0x58) + fVar20 * *param_8;
if ((uVar10 < 5) && ((1 << ((byte)uVar10 & 0x1f) & 0x17U) != 0)) {
cVar4 = Studio_IKAnimationError
(param_1,pmVar6,param_7[iVar9],param_4,(Vector *)&local_38,local_2c,
&local_3c);
if (cVar4 == '\0') {
iVar8 = *(int *)(param_9 + 4);
fVar19 = *(float *)(param_9 + 0x48);
}
else {
fVar19 = *param_8;
*(float *)(param_9 + 0x24) = local_34 * fVar19 + *(float *)(param_9 + 0x24);
*(float *)(param_9 + 0x28) = local_30 * fVar19 + *(float *)(param_9 + 0x28);
*(float *)(param_9 + 0x20) = fVar19 * local_38 + *(float *)(param_9 + 0x20);
QuaternionAccumulate
((Quaternion *)(param_9 + 0x2c),*param_8,local_2c,
(Quaternion *)(param_9 + 0x2c));
iVar8 = *(int *)(param_9 + 4);
fVar18 = fVar18 + *param_8;
fVar19 = *(float *)(param_9 + 0x48);
}
}
else {
fVar18 = fVar18 + *param_8;
}
fVar17 = param_4;
if (1.0 < fVar19) {
fVar17 = (float)(~-(uint)(param_4 < *(float *)(param_9 + 0x3c)) & (uint)param_4 |
(uint)(param_4 + 1.0) & -(uint)(param_4 < *(float *)(param_9 + 0x3c)));
}
if (*(float *)(param_9 + 0x40) <= fVar17) {
*(float *)(param_9 + 100) = (float)(fVar17 < fVar19) * *(float *)(param_9 + 0x5c);
}
else {
*(float *)(param_9 + 100) = *(float *)(param_9 + 0x5c) * 0.0;
}
if (iVar8 == 5) {
*(mstudioikrule_t **)(param_9 + 0x68) = pmVar6 + *(int *)(pmVar6 + 0x78);
}
}
iVar9 = iVar9 + 1;
param_8 = param_8 + 1;
if (iVar9 == 4) {
if (fVar18 <= 0.0001) {
return 0;
}
if (fVar18 < 0.999) {
fVar18 = 1.0 / fVar18;
*(float *)(param_9 + 0x20) = *(float *)(param_9 + 0x20) * fVar18;
*(float *)(param_9 + 0x24) = *(float *)(param_9 + 0x24) * fVar18;
*(float *)(param_9 + 0x28) = *(float *)(param_9 + 0x28) * fVar18;
QuaternionScale((Quaternion *)(param_9 + 0x2c),fVar18,(Quaternion *)(param_9 + 0x2c));
}
if ((*(int *)(param_9 + 4) == 1) && (*(int *)(param_9 + 0xc) != -1)) {
iVar9 = CStudioHdr::RemapSeqBone(param_1,param_3,*(int *)(param_9 + 0xc));
*(int *)(param_9 + 0xc) = iVar9;
if (iVar9 == -1) {
return 0;
}
}
QuaternionNormalize((Quaternion *)(param_9 + 0x2c));
return 1;
}
} while( true );
}
} 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.