CChoreoScene::ParseFlexAnimations
0x00bb4af0 · 2439 bytes · __cdecl
_ZN12CChoreoScene19ParseFlexAnimationsEP20ISceneTokenProcessorP12CChoreoEventb
Decompiled
undefined (3 params)
/* CChoreoScene::ParseFlexAnimations(ISceneTokenProcessor*, CChoreoEvent*, bool) */
void CChoreoScene::ParseFlexAnimations
(ISceneTokenProcessor *param_1,CChoreoEvent *param_2,bool param_3)
{
float *pfVar1;
byte bVar2;
int *piVar3;
char cVar4;
char *pcVar5;
int iVar6;
int iVar7;
uint uVar8;
CFlexAnimationTrack *this;
int iVar9;
char *pcVar10;
int iVar11;
CUtlVector<CExpressionSample,CUtlMemory<CExpressionSample,int>> *this_00;
int in_GS_OFFSET;
bool bVar12;
longdouble lVar13;
longdouble lVar14;
double dVar15;
double dVar16;
float local_10c;
float local_108;
uint local_100;
int local_f4;
bool local_ef;
EdgeInfo_t local_d6;
ushort local_d5;
float local_d3;
EdgeInfo_t local_cf;
ushort local_ce;
float local_cc;
int local_c8 [5];
undefined4 local_b4;
undefined4 local_b0;
undefined4 local_ac;
undefined4 local_a8;
undefined4 local_a4;
char local_a0 [128];
int local_20;
local_20 = *(int *)(in_GS_OFFSET + 0x14);
if (param_3) {
CChoreoEvent::RemoveAllTracks(param_2);
CChoreoEvent::SetTrackLookupSet(param_2,false);
}
(**(code **)(*(int *)param_1 + 4))(param_1,1);
lVar13 = (longdouble)CChoreoEvent::GetEndTime(param_2);
lVar14 = (longdouble)CChoreoEvent::GetStartTime(param_2);
pcVar5 = (char *)(*(code *)**(undefined4 **)param_1)(param_1);
iVar6 = _V_stricmp(pcVar5,"samples_use_time");
if (iVar6 == 0) {
(**(code **)(*(int *)param_1 + 4))(param_1,1);
}
pcVar5 = (char *)(*(code *)**(undefined4 **)param_1)(param_1);
iVar7 = V_strnicmp(pcVar5,"defaultcurvetype",0x10);
local_f4 = 0;
if (iVar7 == 0) {
iVar7 = (*(code *)**(undefined4 **)param_1)(param_1);
pcVar5 = (char *)(iVar7 + 0x10);
cVar4 = *(char *)(iVar7 + 0x10);
if (cVar4 == '\0') {
(**(code **)(*(int *)param_1 + 4))(param_1,1);
pcVar5 = (char *)(*(code *)**(undefined4 **)param_1)(param_1);
cVar4 = *pcVar5;
}
if (cVar4 != '=') {
(**(code **)(*(int *)param_1 + 0xc))(param_1,"expecting =\n");
}
pcVar10 = pcVar5 + 1;
if (pcVar5[1] == '\0') {
(**(code **)(*(int *)param_1 + 4))(param_1,1);
pcVar10 = (char *)(*(code *)**(undefined4 **)param_1)(param_1);
}
local_f4 = Interpolator_CurveTypeForName(pcVar10);
(**(code **)(*(int *)param_1 + 4))(param_1,1);
CChoreoEvent::SetDefaultCurveType(param_2,local_f4);
}
pcVar5 = (char *)(*(code *)**(undefined4 **)param_1)(param_1);
iVar7 = _V_stricmp(pcVar5,"{");
if (iVar7 != 0) {
(**(code **)(*(int *)param_1 + 0xc))(param_1,"expecting {\n");
}
while( true ) {
(**(code **)(*(int *)param_1 + 4))(param_1,1);
pcVar5 = (char *)(*(code *)**(undefined4 **)param_1)(param_1);
if (*pcVar5 == '\0') break;
pcVar5 = (char *)(*(code *)**(undefined4 **)param_1)(param_1);
iVar7 = _V_stricmp(pcVar5,"}");
if (iVar7 == 0) goto LAB_00bb54e8;
pcVar5 = (char *)(*(code *)**(undefined4 **)param_1)(param_1);
V_strncpy(local_a0,pcVar5,0x80);
(**(code **)(*(int *)param_1 + 4))(param_1,1);
local_d5 = 0;
local_d6 = (EdgeInfo_t)0x0;
local_d3 = 0.0;
local_cf = (EdgeInfo_t)0x0;
local_ce = 0;
local_cc = 0.0;
pcVar5 = (char *)(*(code *)**(undefined4 **)param_1)(param_1);
iVar7 = _V_stricmp(pcVar5,"disabled");
if (iVar7 == 0) {
(**(code **)(*(int *)param_1 + 4))(param_1,1);
}
local_ef = iVar7 != 0;
pcVar5 = (char *)(*(code *)**(undefined4 **)param_1)(param_1);
iVar7 = _V_stricmp(pcVar5,"combo");
bVar12 = iVar7 == 0;
if (bVar12) {
(**(code **)(*(int *)param_1 + 4))(param_1,1);
}
pcVar5 = (char *)(*(code *)**(undefined4 **)param_1)(param_1);
iVar7 = _V_stricmp(pcVar5,"range");
local_10c = 1.0;
local_108 = 0.0;
if (iVar7 == 0) {
(**(code **)(*(int *)param_1 + 4))(param_1,0);
pcVar5 = (char *)(*(code *)**(undefined4 **)param_1)(param_1);
dVar15 = strtod(pcVar5,(char **)0x0);
local_108 = (float)dVar15;
(**(code **)(*(int *)param_1 + 4))(param_1,0);
pcVar5 = (char *)(*(code *)**(undefined4 **)param_1)(param_1);
dVar15 = strtod(pcVar5,(char **)0x0);
local_10c = (float)dVar15;
(**(code **)(*(int *)param_1 + 4))(param_1,1);
}
pcVar5 = (char *)(*(code *)**(undefined4 **)param_1)(param_1);
iVar7 = _V_stricmp(pcVar5,"leftedge");
if (iVar7 == 0) {
ParseEdgeInfo(param_1,&local_d6);
}
pcVar5 = (char *)(*(code *)**(undefined4 **)param_1)(param_1);
iVar7 = _V_stricmp(pcVar5,"rightedge");
if (iVar7 == 0) {
ParseEdgeInfo(param_1,&local_cf);
}
local_c8[0] = 0;
this_00 = (CUtlVector<CExpressionSample,CUtlMemory<CExpressionSample,int>> *)local_c8;
local_c8[1] = 0;
local_c8[2] = 0;
local_c8[3] = 0;
local_c8[4] = 0;
local_b4 = 0;
local_b0 = 0;
local_ac = 0;
local_a8 = 0;
local_a4 = 0;
local_100 = 0;
LAB_00bb4e08:
if ((int)local_100 < (int)(2 - (uint)!bVar12)) {
/* try { // try from 00bb4e25 to 00bb51d8 has its CatchHandler @ 00bb53d9 */
pcVar5 = (char *)(*(code *)**(undefined4 **)param_1)(param_1);
iVar7 = _V_stricmp(pcVar5,"{");
if (iVar7 != 0) {
(**(code **)(*(int *)param_1 + 0xc))(param_1,"expecting {\n");
}
LAB_00bb4e40:
(**(code **)(*(int *)param_1 + 4))(param_1,1);
do {
pcVar5 = (char *)(*(code *)**(undefined4 **)param_1)(param_1);
if (*pcVar5 == '\0') {
(*(code *)(*(undefined4 **)param_1)[3])(param_1,"expecting flex animation data\n");
LAB_00bb4fee:
if (((local_100 & 1) == 0) && (bVar12)) {
(**(code **)(*(int *)param_1 + 4))(param_1,1);
}
local_100 = local_100 + 1;
this_00 = this_00 + 0x14;
goto LAB_00bb4e08;
}
pcVar5 = (char *)(*(code *)**(undefined4 **)param_1)(param_1);
iVar7 = _V_stricmp(pcVar5,"}");
if (iVar7 == 0) goto LAB_00bb4fee;
pcVar5 = (char *)(*(code *)**(undefined4 **)param_1)(param_1);
dVar15 = strtod(pcVar5,(char **)0x0);
(**(code **)(*(int *)param_1 + 4))(param_1,0);
pcVar5 = (char *)(*(code *)**(undefined4 **)param_1)(param_1);
dVar16 = strtod(pcVar5,(char **)0x0);
iVar7 = CUtlVector<CExpressionSample,CUtlMemory<CExpressionSample,int>>::InsertBefore
(this_00,*(int *)(this_00 + 0xc));
pfVar1 = (float *)(*(int *)this_00 + iVar7 * 10);
if (iVar6 == 0) {
pfVar1[1] = (float)dVar15;
}
else {
pfVar1[1] = (float)dVar15 * ((float)lVar13 - (float)lVar14);
}
*pfVar1 = (float)dVar16;
cVar4 = (**(code **)(*(int *)param_1 + 8))(param_1);
if (cVar4 != '\0') goto LAB_00bb4fa0;
*(byte *)(pfVar1 + 2) = *(byte *)(pfVar1 + 2) & 1 | (char)local_f4 * '\x02';
*(char *)((int)pfVar1 + 9) = (char)((ushort)local_f4 >> 7);
(**(code **)(*(int *)param_1 + 4))(param_1,1);
} while( true );
}
if ((local_ef) || (0 < local_c8[3])) {
this = (CFlexAnimationTrack *)CChoreoEvent::AddTrack(param_2,local_a0);
CFlexAnimationTrack::SetTrackActive(this,local_ef);
CFlexAnimationTrack::SetComboType(this,bVar12);
CFlexAnimationTrack::SetMin(this,local_108);
CFlexAnimationTrack::SetMax(this,local_10c);
piVar3 = local_c8;
for (iVar7 = 0; iVar7 < (int)(2 - (uint)!bVar12); iVar7 = iVar7 + 1) {
if (0 < piVar3[3]) {
iVar11 = 0;
do {
pfVar1 = (float *)(*piVar3 + iVar11 * 10);
iVar9 = CFlexAnimationTrack::AddSample(this,pfVar1[1],*pfVar1,iVar7);
bVar2 = *(byte *)(pfVar1 + 2);
iVar11 = iVar11 + 1;
*(undefined1 *)(iVar9 + 9) = *(undefined1 *)((int)pfVar1 + 9);
*(byte *)(iVar9 + 8) = *(byte *)(iVar9 + 8) & 1 | bVar2 & 0xfe;
} while (iVar11 < piVar3[3]);
}
piVar3 = piVar3 + 5;
}
if (local_d6 != (EdgeInfo_t)0x0) {
CFlexAnimationTrack::SetEdgeActive(this,true,true);
CFlexAnimationTrack::SetEdgeInfo(this,true,(uint)local_d5,local_d3);
}
if (local_cf != (EdgeInfo_t)0x0) {
/* try { // try from 00bb535a to 00bb53d3 has its CatchHandler @ 00bb53d9 */
CFlexAnimationTrack::SetEdgeActive(this,false,true);
CFlexAnimationTrack::SetEdgeInfo(this,false,(uint)local_ce,local_cc);
}
CFlexAnimationTrack::Resort(this,0);
CFlexAnimationTrack::Resort(this,1);
}
local_a8 = 0;
CUtlMemory<CExpressionSample,int>::Purge((CUtlMemory<CExpressionSample,int> *)&local_b4);
local_a4 = local_b4;
CUtlMemory<CExpressionSample,int>::Purge((CUtlMemory<CExpressionSample,int> *)&local_b4);
local_c8[3] = 0;
CUtlMemory<CExpressionSample,int>::Purge((CUtlMemory<CExpressionSample,int> *)local_c8);
local_c8[4] = local_c8[0];
CUtlMemory<CExpressionSample,int>::Purge((CUtlMemory<CExpressionSample,int> *)local_c8);
}
(*(code *)(*(undefined4 **)param_1)[3])(param_1,"expecting flex animation data\n");
LAB_00bb54e8:
if (local_20 == *(int *)(in_GS_OFFSET + 0x14)) {
return;
}
/* WARNING: Subroutine does not return */
__stack_chk_fail();
LAB_00bb4fa0:
(**(code **)(*(int *)param_1 + 4))(param_1,0);
pcVar5 = (char *)(*(code *)**(undefined4 **)param_1)(param_1);
uVar8 = Interpolator_CurveTypeForName(pcVar5);
*(char *)((int)pfVar1 + 9) = (char)(uVar8 >> 7);
*(byte *)(pfVar1 + 2) = *(byte *)(pfVar1 + 2) & 1 | (char)uVar8 * '\x02';
goto LAB_00bb4e40;
}
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.