CChoreoEvent::RestoreFlexAnimationsFromBuffer
0x00baa710 · 3057 bytes · __thiscall
_ZN12CChoreoEvent31RestoreFlexAnimationsFromBufferER10CUtlBufferP17IChoreoStringPool
Decompiled
undefined (3 params)
/* CChoreoEvent::RestoreFlexAnimationsFromBuffer(CUtlBuffer&, IChoreoStringPool*) */
undefined4 __thiscall
CChoreoEvent::RestoreFlexAnimationsFromBuffer
(CChoreoEvent *this,CUtlBuffer *param_1,IChoreoStringPool *param_2)
{
byte bVar1;
short sVar2;
code *pcVar3;
byte bVar4;
char cVar5;
CFlexAnimationTrack *this_00;
int iVar6;
int iVar7;
undefined4 *puVar8;
byte bVar9;
ushort uVar10;
ushort uVar11;
uint uVar12;
int iVar13;
int in_GS_OFFSET;
float fVar14;
int local_140;
float local_134;
undefined4 local_128;
undefined2 local_124;
undefined1 local_122;
undefined1 local_121;
char local_120 [256];
int local_20;
local_20 = *(int *)(in_GS_OFFSET + 0x14);
if (((byte)param_1[0x15] & 1) == 0) {
cVar5 = CUtlBuffer::CheckGet(param_1,1);
if (cVar5 == '\0') goto LAB_00baabd9;
bVar1 = *(byte *)(*(int *)param_1 + (*(int *)(param_1 + 0xc) - *(int *)(param_1 + 0x20)));
*(int *)(param_1 + 0xc) = *(int *)(param_1 + 0xc) + 1;
}
else {
local_124 = local_124 & 0xff00;
CUtlBuffer::Scanf(param_1,"%u",&local_124);
bVar1 = (byte)local_124;
}
if (bVar1 != 0) {
local_140 = 1;
do {
pcVar3 = *(code **)(*(int *)param_2 + 4);
if (((byte)param_1[0x15] & 1) == 0) {
cVar5 = CUtlBuffer::CheckGet(param_1,2);
iVar13 = 0;
if (cVar5 != '\0') {
if (((byte)param_1[0x34] & 1) == 0) {
iVar6 = *(int *)(param_1 + 0xc);
sVar2 = *(short *)(*(int *)param_1 + (iVar6 - *(int *)(param_1 + 0x20)));
}
else {
puVar8 = (undefined4 *)
((*(int *)(param_1 + 0xc) - *(int *)(param_1 + 0x20)) + *(int *)param_1);
if (puVar8 == (undefined4 *)0x0) {
puVar8 = &local_128;
}
local_124 = (ushort)local_128;
local_124._1_1_ = (undefined1)((uint)local_128 >> 8);
local_124 = CONCAT11(local_124._1_1_,*(undefined1 *)((int)puVar8 + 1));
local_124 = CONCAT11(*(undefined1 *)puVar8,*(undefined1 *)((int)puVar8 + 1));
_V_memcpy(&local_128,&local_124,2);
iVar6 = *(int *)(param_1 + 0xc);
sVar2 = (ushort)local_128;
}
iVar13 = (int)sVar2;
*(int *)(param_1 + 0xc) = iVar6 + 2;
}
}
else {
local_128 = (float)((uint)local_128 & 0xffff0000);
CUtlBuffer::Scanf(param_1,"%d",&local_128);
iVar13 = (int)(short)(ushort)local_128;
}
(*pcVar3)(param_2,iVar13,local_120,0x100);
this_00 = (CFlexAnimationTrack *)AddTrack(this,local_120);
if (((byte)param_1[0x15] & 1) == 0) {
cVar5 = CUtlBuffer::CheckGet(param_1,1);
bVar9 = 0;
bVar4 = 0;
if (cVar5 != '\0') {
bVar9 = *(byte *)(*(int *)param_1 + (*(int *)(param_1 + 0xc) - *(int *)(param_1 + 0x20)));
*(int *)(param_1 + 0xc) = *(int *)(param_1 + 0xc) + 1;
bVar4 = bVar9 & 1;
bVar9 = bVar9 >> 1 & 1;
}
}
else {
local_124 = local_124 & 0xff00;
CUtlBuffer::Scanf(param_1,"%u",&local_124);
bVar4 = (byte)local_124 & 1;
bVar9 = (byte)local_124 >> 1 & 1;
}
this_00[0x5c] = (CFlexAnimationTrack)((byte)this_00[0x5c] & 0xfc | bVar4 | bVar9 * '\x02');
if (((byte)param_1[0x15] & 1) == 0) {
cVar5 = CUtlBuffer::CheckGet(param_1,4);
fVar14 = 0.0;
if (cVar5 != '\0') {
iVar13 = *(int *)(param_1 + 0xc);
fVar14 = *(float *)(*(int *)param_1 + (iVar13 - *(int *)(param_1 + 0x20)));
local_128 = fVar14;
if (((byte)param_1[0x34] & 1) != 0) {
local_128._3_1_ = (undefined1)((uint)fVar14 >> 0x18);
local_128._2_1_ = (undefined1)((uint)fVar14 >> 0x10);
local_124 = CONCAT11(local_128._2_1_,local_128._3_1_);
local_128._1_1_ = (undefined1)((uint)fVar14 >> 8);
local_122 = local_128._1_1_;
local_128._0_1_ = SUB41(fVar14,0);
local_121 = (undefined1)local_128;
_V_memcpy(&local_128,&local_124,4);
iVar13 = *(int *)(param_1 + 0xc);
}
*(int *)(param_1 + 0xc) = iVar13 + 4;
fVar14 = local_128;
}
}
else {
local_128 = 0.0;
CUtlBuffer::Scanf(param_1,"%f",&local_128);
fVar14 = local_128;
}
*(float *)(this_00 + 8) = fVar14;
if (((byte)param_1[0x15] & 1) == 0) {
cVar5 = CUtlBuffer::CheckGet(param_1,4);
fVar14 = 0.0;
if (cVar5 != '\0') {
iVar13 = *(int *)(param_1 + 0xc);
fVar14 = *(float *)(*(int *)param_1 + (iVar13 - *(int *)(param_1 + 0x20)));
local_128 = fVar14;
if (((byte)param_1[0x34] & 1) != 0) {
local_128._3_1_ = (undefined1)((uint)fVar14 >> 0x18);
local_128._2_1_ = (undefined1)((uint)fVar14 >> 0x10);
local_124 = CONCAT11(local_128._2_1_,local_128._3_1_);
local_128._1_1_ = (undefined1)((uint)fVar14 >> 8);
local_122 = local_128._1_1_;
local_128._0_1_ = SUB41(fVar14,0);
local_121 = (undefined1)local_128;
_V_memcpy(&local_128,&local_124,4);
iVar13 = *(int *)(param_1 + 0xc);
}
*(int *)(param_1 + 0xc) = iVar13 + 4;
fVar14 = local_128;
}
}
else {
local_128 = 0.0;
CUtlBuffer::Scanf(param_1,"%f",&local_128);
fVar14 = local_128;
}
*(float *)(this_00 + 0xc) = fVar14;
if (((byte)param_1[0x15] & 1) == 0) {
cVar5 = CUtlBuffer::CheckGet(param_1,2);
if (cVar5 != '\0') {
if (((byte)param_1[0x34] & 1) == 0) {
iVar13 = *(int *)(param_1 + 0xc);
sVar2 = *(short *)(*(int *)param_1 + (iVar13 - *(int *)(param_1 + 0x20)));
}
else {
puVar8 = (undefined4 *)
((*(int *)(param_1 + 0xc) - *(int *)(param_1 + 0x20)) + *(int *)param_1);
if (puVar8 == (undefined4 *)0x0) {
puVar8 = &local_128;
}
local_124 = (ushort)local_128;
local_124._1_1_ = (undefined1)((uint)local_128 >> 8);
local_124 = CONCAT11(local_124._1_1_,*(undefined1 *)((int)puVar8 + 1));
local_124 = CONCAT11(*(undefined1 *)puVar8,*(undefined1 *)((int)puVar8 + 1));
_V_memcpy(&local_128,&local_124,2);
iVar13 = *(int *)(param_1 + 0xc);
sVar2 = (ushort)local_128;
}
*(int *)(param_1 + 0xc) = iVar13 + 2;
goto LAB_00baa919;
}
}
else {
local_128 = (float)((uint)local_128 & 0xffff0000);
CUtlBuffer::Scanf(param_1,"%d",&local_128);
sVar2 = (ushort)local_128;
LAB_00baa919:
if (0 < sVar2) {
iVar13 = 0;
do {
if (((byte)param_1[0x15] & 1) == 0) {
cVar5 = CUtlBuffer::CheckGet(param_1,4);
local_134 = 0.0;
if (cVar5 == '\0') goto LAB_00baa964;
iVar6 = *(int *)(param_1 + 0xc);
fVar14 = *(float *)(*(int *)param_1 + (iVar6 - *(int *)(param_1 + 0x20)));
local_128 = fVar14;
if (((byte)param_1[0x34] & 1) != 0) {
local_128._3_1_ = (undefined1)((uint)fVar14 >> 0x18);
local_128._2_1_ = (undefined1)((uint)fVar14 >> 0x10);
local_124 = CONCAT11(local_128._2_1_,local_128._3_1_);
local_128._1_1_ = (undefined1)((uint)fVar14 >> 8);
local_122 = local_128._1_1_;
local_128._0_1_ = SUB41(fVar14,0);
local_121 = (undefined1)local_128;
_V_memcpy(&local_128,&local_124,4);
iVar6 = *(int *)(param_1 + 0xc);
}
*(int *)(param_1 + 0xc) = iVar6 + 4;
local_134 = local_128;
if (((byte)param_1[0x15] & 1) != 0) goto LAB_00baa976;
LAB_00baab08:
cVar5 = CUtlBuffer::CheckGet(param_1,1);
fVar14 = 0.0;
if (cVar5 != '\0') {
bVar4 = *(byte *)(*(int *)param_1 +
(*(int *)(param_1 + 0xc) - *(int *)(param_1 + 0x20)));
*(int *)(param_1 + 0xc) = *(int *)(param_1 + 0xc) + 1;
fVar14 = ((float)bVar4 + 0.0) * 0.003921569;
}
}
else {
local_128 = 0.0;
CUtlBuffer::Scanf(param_1,"%f",&local_128);
local_134 = local_128;
LAB_00baa964:
if (((byte)param_1[0x15] & 1) == 0) goto LAB_00baab08;
LAB_00baa976:
local_124 = local_124 & 0xff00;
CUtlBuffer::Scanf(param_1,"%u",&local_124);
fVar14 = ((float)(byte)local_124 + 0.0) * 0.003921569;
}
iVar6 = CFlexAnimationTrack::AddSample(this_00,local_134,fVar14,0);
if (((byte)param_1[0x15] & 1) == 0) {
cVar5 = CUtlBuffer::CheckGet(param_1,2);
uVar12 = 0;
if (cVar5 != '\0') {
if (((byte)param_1[0x34] & 1) == 0) {
iVar7 = *(int *)(param_1 + 0xc);
uVar10 = *(ushort *)(*(int *)param_1 + (iVar7 - *(int *)(param_1 + 0x20)));
}
else {
puVar8 = (undefined4 *)
((*(int *)(param_1 + 0xc) - *(int *)(param_1 + 0x20)) + *(int *)param_1);
if (puVar8 == (undefined4 *)0x0) {
puVar8 = &local_128;
}
local_124 = (ushort)local_128;
local_124._1_1_ = (undefined1)((uint)local_128 >> 8);
local_124 = CONCAT11(local_124._1_1_,*(undefined1 *)((int)puVar8 + 1));
local_124 = CONCAT11(*(undefined1 *)puVar8,*(undefined1 *)((int)puVar8 + 1));
_V_memcpy(&local_128,&local_124,2);
iVar7 = *(int *)(param_1 + 0xc);
uVar10 = (ushort)local_128;
}
uVar12 = (uint)(uVar10 & 0x7fff);
*(int *)(param_1 + 0xc) = iVar7 + 2;
}
}
else {
local_128 = (float)((uint)local_128 & 0xffff0000);
CUtlBuffer::Scanf(param_1,"%u",&local_128);
uVar12 = (uint)((ushort)local_128 & 0x7fff);
}
iVar13 = iVar13 + 1;
*(char *)(iVar6 + 9) = (char)(uVar12 >> 7);
*(byte *)(iVar6 + 8) = *(byte *)(iVar6 + 8) & 1 | (char)uVar12 * '\x02';
} while (iVar13 < sVar2);
}
}
if (((byte)this_00[0x5c] & 2) != 0) {
if (((byte)param_1[0x15] & 1) == 0) {
cVar5 = CUtlBuffer::CheckGet(param_1,2);
if (cVar5 == '\0') goto LAB_00baabc0;
if (((byte)param_1[0x34] & 1) == 0) {
iVar13 = *(int *)(param_1 + 0xc);
uVar10 = *(ushort *)(*(int *)param_1 + (iVar13 - *(int *)(param_1 + 0x20)));
}
else {
puVar8 = (undefined4 *)
((*(int *)(param_1 + 0xc) - *(int *)(param_1 + 0x20)) + *(int *)param_1);
if (puVar8 == (undefined4 *)0x0) {
puVar8 = &local_128;
}
local_124 = (ushort)local_128;
local_124._1_1_ = (undefined1)((uint)local_128 >> 8);
local_124 = CONCAT11(local_124._1_1_,*(undefined1 *)((int)puVar8 + 1));
local_124 = CONCAT11(*(undefined1 *)puVar8,*(undefined1 *)((int)puVar8 + 1));
_V_memcpy(&local_128,&local_124,2);
iVar13 = *(int *)(param_1 + 0xc);
uVar10 = (ushort)local_128;
}
*(int *)(param_1 + 0xc) = iVar13 + 2;
}
else {
local_128 = (float)((uint)local_128 & 0xffff0000);
CUtlBuffer::Scanf(param_1,"%u",&local_128);
uVar10 = (ushort)local_128;
}
if (uVar10 != 0) {
iVar13 = 0;
do {
if (((byte)param_1[0x15] & 1) == 0) {
cVar5 = CUtlBuffer::CheckGet(param_1,4);
local_134 = 0.0;
if (cVar5 == '\0') goto LAB_00baaeec;
iVar6 = *(int *)(param_1 + 0xc);
fVar14 = *(float *)(*(int *)param_1 + (iVar6 - *(int *)(param_1 + 0x20)));
local_128 = fVar14;
if (((byte)param_1[0x34] & 1) != 0) {
local_128._3_1_ = (undefined1)((uint)fVar14 >> 0x18);
local_128._2_1_ = (undefined1)((uint)fVar14 >> 0x10);
local_124 = CONCAT11(local_128._2_1_,local_128._3_1_);
local_128._1_1_ = (undefined1)((uint)fVar14 >> 8);
local_122 = local_128._1_1_;
local_128._0_1_ = SUB41(fVar14,0);
local_121 = (undefined1)local_128;
_V_memcpy(&local_128,&local_124,4);
iVar6 = *(int *)(param_1 + 0xc);
}
*(int *)(param_1 + 0xc) = iVar6 + 4;
local_134 = local_128;
if (((byte)param_1[0x15] & 1) != 0) goto LAB_00baaefe;
LAB_00bab090:
cVar5 = CUtlBuffer::CheckGet(param_1,1);
fVar14 = 0.0;
if (cVar5 != '\0') {
bVar4 = *(byte *)(*(int *)param_1 +
(*(int *)(param_1 + 0xc) - *(int *)(param_1 + 0x20)));
*(int *)(param_1 + 0xc) = *(int *)(param_1 + 0xc) + 1;
fVar14 = ((float)bVar4 + 0.0) * 0.003921569;
}
}
else {
local_128 = 0.0;
CUtlBuffer::Scanf(param_1,"%f",&local_128);
local_134 = local_128;
LAB_00baaeec:
if (((byte)param_1[0x15] & 1) == 0) goto LAB_00bab090;
LAB_00baaefe:
local_124 = local_124 & 0xff00;
CUtlBuffer::Scanf(param_1,"%u",&local_124);
fVar14 = ((float)(byte)local_124 + 0.0) * 0.003921569;
}
iVar6 = CFlexAnimationTrack::AddSample(this_00,local_134,fVar14,1);
if (((byte)param_1[0x15] & 1) == 0) {
cVar5 = CUtlBuffer::CheckGet(param_1,2);
uVar12 = 0;
if (cVar5 != '\0') {
if (((byte)param_1[0x34] & 1) == 0) {
iVar7 = *(int *)(param_1 + 0xc);
uVar11 = *(ushort *)(*(int *)param_1 + (iVar7 - *(int *)(param_1 + 0x20)));
}
else {
puVar8 = (undefined4 *)
((*(int *)(param_1 + 0xc) - *(int *)(param_1 + 0x20)) + *(int *)param_1);
if (puVar8 == (undefined4 *)0x0) {
puVar8 = &local_128;
}
local_124 = (ushort)local_128;
local_124._1_1_ = (undefined1)((uint)local_128 >> 8);
local_124 = CONCAT11(local_124._1_1_,*(undefined1 *)((int)puVar8 + 1));
local_124 = CONCAT11(*(undefined1 *)puVar8,*(undefined1 *)((int)puVar8 + 1));
_V_memcpy(&local_128,&local_124,2);
iVar7 = *(int *)(param_1 + 0xc);
uVar11 = (ushort)local_128;
}
uVar12 = (uint)(uVar11 & 0x7fff);
*(int *)(param_1 + 0xc) = iVar7 + 2;
}
}
else {
local_128 = (float)((uint)local_128 & 0xffff0000);
CUtlBuffer::Scanf(param_1,"%u",&local_128);
uVar12 = (uint)((ushort)local_128 & 0x7fff);
}
iVar13 = iVar13 + 1;
*(char *)(iVar6 + 9) = (char)(uVar12 >> 7);
*(byte *)(iVar6 + 8) = *(byte *)(iVar6 + 8) & 1 | (char)uVar12 * '\x02';
} while (iVar13 < (int)(uint)uVar10);
}
}
LAB_00baabc0:
local_140 = local_140 + 1;
} while (local_140 != bVar1 + 1);
}
LAB_00baabd9:
if (local_20 != *(int *)(in_GS_OFFSET + 0x14)) {
/* WARNING: Subroutine does not return */
__stack_chk_fail();
}
return 1;
}
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.