我正在对第三方游戏进行修改,我想从游戏的反编译脚本文件中获取脚本。
完整的反编译脚本如下所示:
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
xf
到x.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);
我真的希望有人能帮助我。我的头上没有头发了。
答案 0 :(得分:1)
问题已解决。这与游戏错误有关,游戏错误导致创建新的Vector3
并将z
归零。
将Vector3
更改为所有float
可以解决此问题。