CGameMovement::LadderMove
0x004557f0 · 4013 bytes · __thiscall
_ZN13CGameMovement10LadderMoveEv.part.66
Decompiled
undefined (1 param)
/* CGameMovement::LadderMove() [clone .part.66] */
bool __thiscall CGameMovement::LadderMove(CGameMovement *this)
{
code *pcVar1;
CBaseEdict *pCVar2;
uint uVar3;
char cVar4;
bool bVar5;
int *in_EAX;
int iVar6;
undefined4 uVar7;
int iVar8;
float *pfVar9;
float *pfVar10;
bool bVar11;
byte bVar12;
longdouble lVar13;
float fVar14;
float fVar15;
float fVar16;
float fVar17;
float fVar18;
float fVar19;
float fVar20;
float fVar21;
float fVar22;
float fVar23;
float fVar24;
undefined4 uVar25;
undefined1 *puVar26;
undefined1 *puVar27;
float local_c8;
float local_c0;
undefined4 local_b8;
undefined4 local_b4;
float local_b0;
float local_ac [3];
float local_a0;
float local_9c;
float local_98;
float local_94;
float local_90;
float local_8c;
float local_88;
float local_84;
float local_80;
float local_7c;
float local_78;
float local_74;
undefined1 local_70 [24];
float local_58;
float local_54;
float local_50;
float local_44;
short local_30;
CBaseEntity *local_24;
iVar6 = in_EAX[1];
if (*(char *)(iVar6 + 0x186) == '\t') {
local_ac[2] = -*(float *)(iVar6 + 0x2008);
local_ac[1] = -*(float *)(iVar6 + 0x2004);
local_ac[0] = -*(float *)(iVar6 + 0x2000);
}
else {
fVar15 = *(float *)(in_EAX[2] + 0x2c);
fVar14 = *(float *)(in_EAX[2] + 0x30);
if ((fVar15 == 0.0) && (fVar14 == 0.0)) {
return false;
}
iVar6 = 0;
do {
*(float *)((Vector *)local_ac + iVar6 * 4) =
(float)in_EAX[iVar6 + 9] * fVar14 + (float)in_EAX[iVar6 + 6] * fVar15;
iVar6 = iVar6 + 1;
} while (iVar6 != 3);
VectorNormalize((Vector *)local_ac);
}
puVar27 = local_70;
lVar13 = (longdouble)(**(code **)(*in_EAX + 0xb0))();
fVar15 = (float)lVar13;
iVar6 = in_EAX[2];
local_a0 = local_ac[0] * fVar15 + *(float *)(iVar6 + 0x9c);
local_9c = local_ac[1] * fVar15 + *(float *)(iVar6 + 0xa0);
local_98 = fVar15 * local_ac[2] + *(float *)(iVar6 + 0xa4);
pcVar1 = *(code **)(*in_EAX + 0x3c);
uVar7 = (**(code **)(*in_EAX + 0xb4))();
uVar25 = 8;
puVar26 = puVar27;
(*pcVar1)();
if (local_44 == 1.0) {
return false;
}
cVar4 = (**(code **)(*in_EAX + 0xac))();
if (cVar4 == '\0') {
if (*(char *)(in_EAX[1] + 0x186) == '\t') {
return false;
}
cVar4 = CheckInterval();
if (cVar4 == '\0') {
return false;
}
VectorVectors((Vector *)&local_58,(Vector *)&local_88,(Vector *)&local_7c);
if (local_ac[1] * local_84 + local_ac[0] * local_88 + local_ac[2] * local_80 < 0.0) {
local_88 = -local_88;
local_84 = -local_84;
local_80 = -local_80;
}
lVar13 = (longdouble)(**(code **)(*in_EAX + 0xb0))();
fVar15 = (float)lVar13;
iVar6 = in_EAX[2];
local_a0 = local_88 * fVar15 + *(float *)(iVar6 + 0x9c);
local_9c = local_84 * fVar15 + *(float *)(iVar6 + 0xa0);
local_98 = fVar15 * local_80 + *(float *)(iVar6 + 0xa4);
pcVar1 = *(code **)(*in_EAX + 0x3c);
uVar7 = (**(code **)(*in_EAX + 0xb4))();
uVar25 = 8;
(*pcVar1)();
if (local_44 == 1.0) {
return false;
}
cVar4 = (**(code **)(*in_EAX + 0xac))();
puVar26 = puVar27;
if (cVar4 == '\0') {
return false;
}
}
local_c0 = 0.0;
CBaseEntity::SetMoveType((CBaseEntity *)in_EAX[1],9,0,uVar7,uVar25,puVar26);
iVar6 = in_EAX[1];
if (*(char *)(iVar6 + 0x187) != '\0') {
if (*(char *)(iVar6 + 0x6c) == '\0') {
pCVar2 = *(CBaseEdict **)(iVar6 + 0x30);
if (pCVar2 != (CBaseEdict *)0x0) {
*(uint *)pCVar2 = *(uint *)pCVar2 | 0x101;
iVar8 = CBaseEdict::GetChangeAccessor(pCVar2);
*(undefined2 *)(iVar8 + 2) = 0;
}
}
else {
*(byte *)(iVar6 + 0x70) = *(byte *)(iVar6 + 0x70) | 1;
}
*(undefined1 *)(iVar6 + 0x187) = 0;
iVar6 = in_EAX[1];
}
if (((local_58 != *(float *)(iVar6 + 0x2000)) || (local_54 != *(float *)(iVar6 + 0x2004))) ||
(local_50 != *(float *)(iVar6 + 0x2008))) {
if (*(char *)(iVar6 + 0x6c) == '\0') {
pCVar2 = *(CBaseEdict **)(iVar6 + 0x30);
if (pCVar2 != (CBaseEdict *)0x0) {
*(uint *)pCVar2 = *(uint *)pCVar2 | 0x101;
iVar8 = CBaseEdict::GetChangeAccessor(pCVar2);
*(undefined2 *)(iVar8 + 2) = 0;
}
}
else {
*(byte *)(iVar6 + 0x70) = *(byte *)(iVar6 + 0x70) | 1;
}
*(float *)(iVar6 + 0x2000) = local_58;
*(float *)(iVar6 + 0x2004) = local_54;
*(float *)(iVar6 + 0x2008) = local_50;
iVar6 = in_EAX[1];
}
if ((int)local_30 != *(int *)(iVar6 + 0x1ffc)) {
if (*(char *)(iVar6 + 0x6c) == '\0') {
pCVar2 = *(CBaseEdict **)(iVar6 + 0x30);
if (pCVar2 != (CBaseEdict *)0x0) {
*(uint *)pCVar2 = *(uint *)pCVar2 | 0x101;
iVar8 = CBaseEdict::GetChangeAccessor(pCVar2);
*(undefined2 *)(iVar8 + 2) = 0;
}
}
else {
*(byte *)(iVar6 + 0x70) = *(byte *)(iVar6 + 0x70) | 1;
}
*(int *)(iVar6 + 0x1ffc) = (int)local_30;
}
iVar6 = in_EAX[2];
local_b8 = *(undefined4 *)(iVar6 + 0x9c);
local_b4 = *(undefined4 *)(iVar6 + 0xa0);
local_b0 = *(float *)(iVar6 + 0xa4);
iVar6 = (**(code **)(*in_EAX + 0x7c))();
local_b0 = local_b0 + -1.0 + *(float *)(iVar6 + 8);
iVar6 = (**(code **)*enginetrace)(enginetrace,&local_b8,0xffffffff,0);
if ((iVar6 == 1) || (iVar6 = CBaseEntity::GetGroundEntity((CBaseEntity *)in_EAX[1]), iVar6 != 0))
{
bVar12 = 1;
}
else {
bVar12 = 0;
}
*(undefined4 *)(in_EAX[1] + 0x2c0) = 0;
lVar13 = (longdouble)(**(code **)(*in_EAX + 0xb8))();
iVar6 = in_EAX[2];
fVar14 = 0.0;
fVar15 = (float)lVar13;
uVar3 = *(uint *)(iVar6 + 0x24);
if ((uVar3 & 0x10) != 0) {
fVar14 = -fVar15;
}
if ((uVar3 & 8) != 0) {
fVar14 = fVar14 + fVar15;
}
fVar17 = 0.0;
if ((uVar3 & 0x200) != 0) {
fVar17 = -fVar15;
}
if ((uVar3 & 0x400) != 0) {
fVar17 = fVar17 + fVar15;
}
if (((*(byte *)(iVar6 + 0x28) & 2) == 0) && ((uVar3 & 2) != 0)) {
CBaseEntity::SetMoveType((CBaseEntity *)in_EAX[1],2,0);
iVar6 = in_EAX[1];
if (*(char *)(iVar6 + 0x187) != '\0') {
if (*(char *)(iVar6 + 0x6c) == '\0') {
pCVar2 = *(CBaseEdict **)(iVar6 + 0x30);
if (pCVar2 != (CBaseEdict *)0x0) {
*(uint *)pCVar2 = *(uint *)pCVar2 | 0x101;
iVar8 = CBaseEdict::GetChangeAccessor(pCVar2);
*(undefined2 *)(iVar8 + 2) = 0;
}
}
else {
*(byte *)(iVar6 + 0x70) = *(byte *)(iVar6 + 0x70) | 1;
}
*(undefined1 *)(iVar6 + 0x187) = 0;
}
iVar6 = in_EAX[2];
*(float *)(iVar6 + 0x40) = local_58 * 270.0;
*(float *)(iVar6 + 0x44) = local_54 * 270.0;
*(float *)(iVar6 + 0x48) = local_50 * 270.0;
return true;
}
bVar11 = fVar17 != 0.0;
bVar5 = fVar14 != 0.0 || bVar11;
if (fVar14 == 0.0 && !bVar11) {
*(undefined4 *)(iVar6 + 0x40) = 0;
*(undefined4 *)(iVar6 + 0x44) = 0;
*(undefined4 *)(iVar6 + 0x48) = 0;
if (local_24 == (CBaseEntity *)0x0) {
return true;
}
if (((byte)local_24[0x14d] & 0x10) != 0) {
CBaseEntity::CalcAbsoluteVelocity(local_24);
}
iVar6 = in_EAX[2];
*(float *)(iVar6 + 0x40) = *(float *)(iVar6 + 0x40) + *(float *)(local_24 + 0x274);
*(float *)(iVar6 + 0x44) = *(float *)(iVar6 + 0x44) + *(float *)(local_24 + 0x278);
*(float *)(iVar6 + 0x48) = *(float *)(iVar6 + 0x48) + *(float *)(local_24 + 0x27c);
return true;
}
if ((*(int *)(ladder_autocenter._28_4_ + 0x30) != 0) &&
(cVar4 = (**(code **)(*(int *)in_EAX[1] + 0x5ec))((int *)in_EAX[1]), cVar4 != '\0')) {
AngleVectors((QAngle *)(in_EAX[2] + 0x4c),(Vector *)&local_94);
if (ABS(local_8c) == 1.0) {
LAB_004561e1:
iVar6 = CBaseEntity::GetTeamNumber((CBaseEntity *)in_EAX[1]);
cVar4 = IsASurvivorTeam(iVar6);
if (((cVar4 == '\0') && (local_24 != (CBaseEntity *)0x0)) &&
(iVar6 = __dynamic_cast(local_24,&CBaseEntity::typeinfo,&CFuncSimpleLadder::typeinfo,0),
iVar6 != 0)) {
(**(code **)(*(int *)(iVar6 + 0x194) + 0x3c))(iVar6 + 0x194,&local_88,&local_7c);
iVar8 = (**(code **)(*in_EAX + 0x80))();
if (*(float *)(iVar6 + 0x440) == 0.0) {
local_78 = local_7c - local_88;
}
else {
local_78 = local_78 - local_84;
}
if (*(float *)(iVar8 + 4) * 3.0 <= local_78) goto LAB_00455d3b;
}
fVar15 = (float)in_EAX[6];
fVar17 = (float)in_EAX[7];
local_7c = -local_54;
fVar20 = (float)in_EAX[8];
local_78 = local_58;
local_74 = 0.0;
VectorNormalize((Vector *)&local_7c);
fVar24 = local_54 * local_74 - local_78 * local_50;
fVar22 = local_50 * local_7c - local_74 * local_58;
fVar21 = local_78 * local_58 - local_7c * local_54;
if (fVar14 <= 0.0) {
fVar19 = -(float)in_EAX[8];
fVar16 = -(float)in_EAX[7];
fVar23 = -(float)in_EAX[6];
}
else {
fVar23 = (float)in_EAX[6];
fVar16 = (float)in_EAX[7];
fVar19 = (float)in_EAX[8];
}
fVar18 = *(float *)(ladder_horizon._28_4_ + 0x2c);
if (fVar14 < 0.0) {
fVar18 = -fVar18;
}
if (fVar16 * fVar22 + fVar23 * fVar24 + fVar19 * fVar21 <= fVar18) {
fVar21 = -fVar21;
fVar22 = -fVar22;
fVar24 = -fVar24;
}
iVar6 = in_EAX[2];
if (*(int *)(ladder_console_controls._28_4_ + 0x30) != 0) {
if ((*(uint *)(iVar6 + 0x24) & 8) == 0) {
if ((*(uint *)(iVar6 + 0x24) & 0x10) != 0) {
fVar21 = -1.0;
}
}
else {
fVar21 = 1.0;
}
}
fVar23 = ABS(fVar14);
*(float *)(iVar6 + 0x44) = fVar22 * fVar23;
*(float *)(iVar6 + 0x40) = fVar24 * fVar23;
*(float *)(iVar6 + 0x48) = fVar21 * fVar23;
pfVar9 = (float *)(**(code **)(*(int *)local_24 + 0x288))(local_24);
if (((vec3_origin != *pfVar9) || (DAT_01053d4c != pfVar9[1])) || (DAT_01053d50 != pfVar9[2]))
{
pfVar9 = (float *)(**(code **)(*(int *)in_EAX[1] + 0x288))((int *)in_EAX[1]);
pfVar10 = (float *)(**(code **)(*(int *)local_24 + 0x288))(local_24);
iVar6 = in_EAX[2];
fVar22 = (pfVar10[1] - pfVar9[1]) * local_78 + (*pfVar10 - *pfVar9) * local_7c +
(pfVar10[2] - pfVar9[2]) * local_74;
*(float *)(iVar6 + 0x40) = local_7c * fVar22 + *(float *)(iVar6 + 0x40);
*(float *)(iVar6 + 0x44) = *(float *)(iVar6 + 0x44) + local_78 * fVar22;
*(float *)(iVar6 + 0x48) = fVar22 * local_74 + *(float *)(iVar6 + 0x48);
}
fVar14 = (fVar17 * local_54 + fVar15 * local_58 + fVar20 * local_50) * fVar14;
goto LAB_00455ee8;
}
fVar15 = SQRT(local_90 * local_90 + local_94 * local_94);
if (fVar15 == 0.0) {
local_c8 = 0.0;
}
else {
fVar15 = 1.0 / fVar15;
local_c8 = local_94 * fVar15;
local_c0 = local_90 * fVar15;
}
fVar20 = -local_54;
fVar15 = -local_58;
fVar22 = SQRT(fVar20 * fVar20 + fVar15 * fVar15);
if (fVar22 == 0.0) {
fVar22 = 0.0;
}
else {
fVar22 = (fVar20 * local_c0 + fVar15 * local_c8) / fVar22;
}
if ((*(float *)(ZombieMinLadderMountDot._28_4_ + 0x2c) <= fVar22) ||
(fVar22 <= -*(float *)(ZombieMinLadderMountDot._28_4_ + 0x2c))) {
if (fVar14 != 0.0) {
bVar11 = 2.0 < ABS(fVar17 / fVar14);
}
if (!bVar11) goto LAB_004561e1;
}
}
LAB_00455d3b:
fVar20 = (float)in_EAX[6] * fVar14 + (float)in_EAX[9] * fVar17;
fVar15 = fVar14 * (float)in_EAX[8] + fVar17 * (float)in_EAX[0xb];
fVar22 = (float)in_EAX[7] * fVar14 + (float)in_EAX[10] * fVar17;
local_7c = local_50 * DAT_01053d4c - local_54;
local_78 = local_58 - local_50 * vec3_origin;
local_74 = local_54 * vec3_origin - local_58 * DAT_01053d4c;
VectorNormalize((Vector *)&local_7c);
iVar6 = in_EAX[2];
fVar14 = fVar22 * local_54 + fVar20 * local_58 + fVar15 * local_50;
fVar17 = -fVar14;
*(float *)(iVar6 + 0x40) =
((local_74 * local_54 - local_78 * local_50) * fVar17 - fVar14 * local_58) + fVar20;
*(float *)(iVar6 + 0x44) =
((local_7c * local_50 - local_74 * local_58) * fVar17 - fVar14 * local_54) + fVar22;
*(float *)(iVar6 + 0x48) =
((local_78 * local_58 - local_7c * local_54) * fVar17 - fVar14 * local_50) + fVar15;
LAB_00455ee8:
bVar11 = (bool)(0.0 < fVar14 & bVar12);
if (bVar11 != false) {
iVar6 = in_EAX[2];
*(float *)(iVar6 + 0x40) = local_58 * 200.0 + *(float *)(iVar6 + 0x40);
*(float *)(iVar6 + 0x44) = local_54 * 200.0 + *(float *)(iVar6 + 0x44);
*(float *)(iVar6 + 0x48) = local_50 * 200.0 + *(float *)(iVar6 + 0x48);
return bVar11;
}
if (local_24 == (CBaseEntity *)0x0) {
return true;
}
if (((byte)local_24[0x14d] & 0x10) != 0) {
CBaseEntity::CalcAbsoluteVelocity(local_24);
}
iVar6 = in_EAX[2];
*(float *)(iVar6 + 0x40) = *(float *)(iVar6 + 0x40) + *(float *)(local_24 + 0x274);
*(float *)(iVar6 + 0x44) = *(float *)(iVar6 + 0x44) + *(float *)(local_24 + 0x278);
*(float *)(iVar6 + 0x48) = *(float *)(iVar6 + 0x48) + *(float *)(local_24 + 0x27c);
return bVar5;
}
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.