C ++-从反编译脚本重新创建脚本

时间:2019-12-13 14:55:50

标签: c++ math decompiling

我正在对第三方游戏进行修改,我想从游戏的反编译脚本文件中获取脚本。

完整的反编译脚本如下所示:

Vector3 func_65(vector3 vParam0)
{
    float fVar0;
    float fVar1;

    fVar0 = SYSTEM::VMAG(vParam0);
    if (fVar0 != 0f)
    {
        fVar1 = (1f / fVar0);
        vParam0 = { vParam0 * Vector(fVar1, fVar1, fVar1) };
    }
    else
    {
        vParam0.x = 0f;
        vParam0.y = 0f;
        vParam0.z = 0f;
    }
    return vParam0;
}

void func_814(int iParam0, int iParam1, bool bParam2, float fParam3, int iParam4)
{
    vector3 vVar0;
    vector3 vVar1;
    vector3 vVar2;
    vector3 vVar3;

    if (ENTITY::DOES_ENTITY_EXIST(iParam0) && !ENTITY::IS_ENTITY_DEAD(iParam1, 0))
    {
        if (ENTITY::HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(iParam0, iParam1, 1) && WEAPON::HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(iParam0, 0, 1))
        {
            ENTITY::IS_ENTITY_DEAD(iParam0, 0);
            vVar0 = { PED::GET_PED_BONE_COORDS(iParam1, 57005, 0f, 0f, 0f) };
            vVar1 = { PED::GET_PED_BONE_COORDS(iParam1, 28252, 0f, 0f, 0f) };
            vVar2 = { func_65(vVar0 - vVar1) * FtoV((fParam3 / 2f)) };
            vVar3 = { 0f, 0f, 0f };
            WEAPON::GET_PED_LAST_WEAPON_IMPACT_COORD(iParam0, &vVar3);
            if (!PED::IS_PED_INJURED(iParam0))
            {
                PED::SET_PED_TO_RAGDOLL(iParam0, 0, 2000, 2, 0, 0, 0);
            }
            ENTITY::APPLY_FORCE_TO_ENTITY(iParam0, 3, vVar2, vVar3, 0, 0, 0, 1, 0, 1);
            ENTITY::CLEAR_ENTITY_LAST_DAMAGE_ENTITY(iParam0);
            WEAPON::CLEAR_ENTITY_LAST_WEAPON_DAMAGE(iParam0);
            if (bParam2)
            {
                ENTITY::SET_ENTITY_HEALTH(iParam0, 0, 0);
            }
            else if (iParam4 != 0)
            {
                PED::APPLY_DAMAGE_TO_PED(iParam0, iParam4, 0, 0);
            }
        }
    }
}

我正在尝试使此反编译脚本与我的编译器兼容,并希望重新创建它以便使其在游戏中正常工作。

为此,我必须改变数学,以免出现任何错误。我已成功完成此操作,并且可以编译。但是,一旦我在游戏中对其进行了测试,游戏就会冻结。调试到停止冻结的程度后,似乎冻结是由数学引起的。因为我对其进行了很多更改以使其无错误,所以可能是我造成的。

我花了很多时间调试代码,但是我找不到问题,我希望有人可以“查看”代码以查看是否有任何错误可能冻结游戏。

我将在下面显示确切的行以及将其更改为的行。


  

微小变化

  • 我已将vector3更改为Vector3
  • xfx.0f的浮动
  

代码更改1-func_65

原文:

fVar1 = (1f / fVar0);   
vParam0 = { vParam0 * Vector(fVar1, fVar1, fVar1) };

更改为:

fVar1 = (1.0f / fVar0);
Vector3 newVector = { (vParam0.x * fVar1), (vParam0.y * fVar1), (vParam0.z * fVar1) };
vParam0 = { newVector.x, newVector.y, newVector.z };

在我看来这似乎还不错,它应该输出与原始代码相同的数据。

  

代码更改2-func_814

原文:

vVar0 = { PED::GET_PED_BONE_COORDS(iParam1, 57005, 0f, 0f, 0f) };
vVar1 = { PED::GET_PED_BONE_COORDS(iParam1, 28252, 0f, 0f, 0f) };
vVar2 = { func_65(vVar0 - vVar1) * FtoV((fParam3 / 2f)) };
vVar3 = { 0f, 0f, 0f };
WEAPON::GET_PED_LAST_WEAPON_IMPACT_COORD(iParam0, &vVar3);
if (!PED::IS_PED_INJURED(iParam0))
{
    PED::SET_PED_TO_RAGDOLL(iParam0, 0, 2000, 2, 0, 0, 0);
}
ENTITY::APPLY_FORCE_TO_ENTITY(iParam0, 3, vVar2, vVar3, 0, 0, 0, 1, 0, 1);

这是我怀疑错误在哪里的原因,也是因为在原始脚本中有一个由反编译器创建的名为FtoV(浮点到矢量)的函数,我认为我的输出正确,但是不确定我将其更改为:

vVar0 = PED::GET_PED_BONE_COORDS(iParam1, 57005, 0.0f, 0.0f, 0.0f);
vVar1 = PED::GET_PED_BONE_COORDS(iParam1, 28252, 0.0f, 0.0f, 0.0f);

Vector3 boneCoords = { vVar0.x - vVar1.x, vVar0.y - vVar1.y, vVar0.z - vVar1.z };
Vector3 floatToVector = { (fParam3 / 2.0f), (fParam3 / 2.0f), (fParam3 / 2.0f) }; //float to vector done correctly?

Vector3 returnResult = func_65(boneCoords);

vVar2 = { returnResult.x * floatToVector.x, returnResult.y * floatToVector.y, returnResult.z * floatToVector.z };

vVar3 = { 0.0f, 0.0f, 0.0f };
WEAPON::GET_PED_LAST_WEAPON_IMPACT_COORD(iParam0, &vVar3);

if (!PED::IS_PED_INJURED(iParam0)) {
    PED::SET_PED_TO_RAGDOLL(iParam0, 0, 2000, 2, 0, 0, 0);
}

ENTITY::APPLY_FORCE_TO_ENTITY(iParam0, 3, vVar2.x, vVar2.y, vVar2.z, vVar3.x, vVar3.y, vVar3.z, 0, 0, 0, 1, 0, 1);

我真的希望有人能帮助我。我的头上没有头发了。

1 个答案:

答案 0 :(得分:1)

问题已解决。这与游戏错误有关,游戏错误导致创建新的Vector3并将z归零。

Vector3更改为所有float可以解决此问题。