CChoreoScene::FileSaveFlexAnimationTrack
0x00bb05e0 · 1731 bytes · __cdecl
_ZN12CChoreoScene26FileSaveFlexAnimationTrackER10CUtlBufferiP19CFlexAnimationTracki
Decompiled
undefined (4 params)
/* CChoreoScene::FileSaveFlexAnimationTrack(CUtlBuffer&, int, CFlexAnimationTrack*, int) */
void CChoreoScene::FileSaveFlexAnimationTrack
(CUtlBuffer *param_1,int param_2,CFlexAnimationTrack *param_3,int param_4)
{
char cVar1;
undefined4 uVar2;
int iVar3;
int iVar4;
float *pfVar5;
uint uVar6;
uint uVar7;
int iVar8;
int in_GS_OFFSET;
longdouble lVar9;
longdouble lVar10;
double dVar11;
char *pcVar12;
char local_720 [256];
char local_620 [512];
char local_420 [1024];
int local_20;
local_20 = *(int *)(in_GS_OFFSET + 0x14);
if ((param_3 != (CFlexAnimationTrack *)0x0) &&
((cVar1 = CFlexAnimationTrack::IsTrackActive(param_3), cVar1 != '\0' ||
(iVar3 = CFlexAnimationTrack::GetNumSamples(param_3,0), 0 < iVar3)))) {
pcVar12 = local_420;
uVar2 = CFlexAnimationTrack::GetFlexControllerName(param_3);
V_snprintf(pcVar12,0x400,"\"%s\" ",uVar2);
cVar1 = CFlexAnimationTrack::IsTrackActive(param_3);
if (cVar1 == '\0') {
V_snprintf(local_620,0x100,"disabled ",uVar2);
uVar2 = 0xffffffff;
V_strncat(pcVar12,local_620,0x400,-1);
}
cVar1 = CFlexAnimationTrack::IsComboType(param_3);
if (cVar1 != '\0') {
V_snprintf(local_620,0x100,"combo ",uVar2);
V_strncat(pcVar12,local_620,0x400,-1);
}
lVar9 = (longdouble)CFlexAnimationTrack::GetMin(param_3,0);
if (((float)lVar9 != 0.0) ||
(lVar9 = (longdouble)CFlexAnimationTrack::GetMax(param_3,0), (float)lVar9 != 1.0)) {
lVar9 = (longdouble)CFlexAnimationTrack::GetMax(param_3,0);
lVar10 = (longdouble)CFlexAnimationTrack::GetMin(param_3,0);
V_snprintf(local_620,0x100,"range %.1f %.1f ",SUB84((double)(float)lVar10,0),
(int)((ulonglong)(double)(float)lVar10 >> 0x20),SUB84((double)(float)lVar9,0),
(int)((ulonglong)(double)(float)lVar9 >> 0x20));
V_strncat(pcVar12,local_620,0x400,-1);
}
cVar1 = CFlexAnimationTrack::IsEdgeActive(param_3,true);
if ((cVar1 != '\0') || (cVar1 = CFlexAnimationTrack::IsEdgeActive(param_3,false), cVar1 != '\0')
) {
local_620[0] = '\0';
cVar1 = CFlexAnimationTrack::IsEdgeActive(param_3,true);
if (cVar1 != '\0') {
lVar9 = (longdouble)CFlexAnimationTrack::GetEdgeZeroValue(param_3,true);
iVar3 = CFlexAnimationTrack::GetEdgeCurveType(param_3,true);
uVar2 = Interpolator_NameForCurveType(iVar3,false);
V_snprintf(local_720,0x100,"leftedge %s %.3f ",uVar2,SUB84((double)(float)lVar9,0),
(int)((ulonglong)(double)(float)lVar9 >> 0x20));
V_strncat(local_620,local_720,0x200,-1);
}
cVar1 = CFlexAnimationTrack::IsEdgeActive(param_3,false);
if (cVar1 != '\0') {
lVar9 = (longdouble)CFlexAnimationTrack::GetEdgeZeroValue(param_3,false);
iVar3 = CFlexAnimationTrack::GetEdgeCurveType(param_3,false);
uVar2 = Interpolator_NameForCurveType(iVar3,false);
V_snprintf(local_720,0x100,"rightedge %s %.3f ",uVar2,SUB84((double)(float)lVar9,0),
(int)((ulonglong)(double)(float)lVar9 >> 0x20));
V_strncat(local_620,local_720,0x200,-1);
}
V_strncat(pcVar12,local_620,0x400,-1);
}
iVar3 = param_2 + 2;
FilePrintf(param_1,iVar3,"%s\n",pcVar12);
iVar8 = 0;
FilePrintf(param_1,iVar3,"{\n");
dVar11 = (double)ZEXT48(pcVar12);
while( true ) {
iVar4 = CFlexAnimationTrack::GetNumSamples(param_3,0);
if (iVar4 <= iVar8) break;
pfVar5 = (float *)CFlexAnimationTrack::GetSample(param_3,iVar8,0);
if (pfVar5 != (float *)0x0) {
uVar7 = (uint)*(byte *)((int)pfVar5 + 9) << 7;
uVar6 = uVar7 | *(byte *)(pfVar5 + 2) >> 1;
if ((param_4 == uVar6) || ((short)uVar7 == 0 && *(byte *)(pfVar5 + 2) >> 1 == 0)) {
dVar11 = (double)pfVar5[1];
FilePrintf(param_1,param_2 + 3,"%.4f %.4f\n",SUB84(dVar11,0),
(int)((ulonglong)dVar11 >> 0x20),SUB84((double)*pfVar5,0),
(int)((ulonglong)(double)*pfVar5 >> 0x20));
}
else {
uVar2 = Interpolator_NameForCurveType(uVar6,false);
dVar11 = (double)pfVar5[1];
FilePrintf(param_1,param_2 + 3,"%.4f %.4f \"%s\"\n",SUB84(dVar11,0),
(int)((ulonglong)dVar11 >> 0x20),SUB84((double)*pfVar5,0),
(int)((ulonglong)(double)*pfVar5 >> 0x20),uVar2);
}
}
iVar8 = iVar8 + 1;
}
FilePrintf(param_1,iVar3,"}\n",SUB84(dVar11,0));
cVar1 = CFlexAnimationTrack::IsComboType(param_3);
if (cVar1 != '\0') {
iVar8 = 0;
FilePrintf(param_1,iVar3,"{\n");
while( true ) {
iVar4 = CFlexAnimationTrack::GetNumSamples(param_3,1);
if (iVar4 <= iVar8) break;
pfVar5 = (float *)CFlexAnimationTrack::GetSample(param_3,iVar8,1);
if (pfVar5 != (float *)0x0) {
uVar7 = (uint)*(byte *)((int)pfVar5 + 9) << 7;
uVar6 = uVar7 | *(byte *)(pfVar5 + 2) >> 1;
if ((param_4 == uVar6) || ((short)uVar7 == 0 && *(byte *)(pfVar5 + 2) >> 1 == 0)) {
dVar11 = (double)pfVar5[1];
FilePrintf(param_1,param_2 + 3,"%.4f %.4f\n",SUB84(dVar11,0),
(int)((ulonglong)dVar11 >> 0x20),SUB84((double)*pfVar5,0),
(int)((ulonglong)(double)*pfVar5 >> 0x20));
}
else {
uVar2 = Interpolator_NameForCurveType(uVar6,false);
dVar11 = (double)pfVar5[1];
FilePrintf(param_1,param_2 + 3,"%.4f %.4f \"%s\"\n",SUB84(dVar11,0),
(int)((ulonglong)dVar11 >> 0x20),SUB84((double)*pfVar5,0),
(int)((ulonglong)(double)*pfVar5 >> 0x20),uVar2);
}
}
iVar8 = iVar8 + 1;
}
FilePrintf(param_1,iVar3,"}\n",SUB84(dVar11,0));
}
}
if (local_20 != *(int *)(in_GS_OFFSET + 0x14)) {
/* WARNING: Subroutine does not return */
__stack_chk_fail();
}
return;
}
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.