Начинающий
Начинающий
- Статус
- Оффлайн
- Регистрация
- 13 Ноя 2022
- Сообщения
- 146
- Реакции
- 3
что не так с моим предиктом он не попадает в цель с с 100 метров, скажите как его можно улучшить в external чтобы он попадал в цель. вот код
predict:
inline Vector3 PredictTargetPosition(Process& process, Vector3& localPos, const Vector3& targetPos, Vector3 Velocity, const std::string& weaponName) {
//printf("PredictTargetPosition called: localPos=(%.2f, %.2f, %.2f), targetPos=(%.2f, %.2f, %.2f), weaponName=%s\n",localPos.x, localPos.y, localPos.z, targetPos.x, targetPos.y, targetPos.z, weaponName.c_str());
const float distance = localPos.distance(targetPos);
Vector3 prediction = targetPos;
float timestep = 1 / 60;
if (distance > 0) {
const float BulletTime = distance / ProjectileSpeed_Normal(distance, weaponName, process);
const Vector3 vel = Velocity;
Vector3 PredictVel;
PredictVel.x = vel.x * BulletTime * 0.75f;
PredictVel.y = vel.y * BulletTime * 0.75f;
PredictVel.z = vel.z * BulletTime * 0.75f;
prediction.x += PredictVel.x;
prediction.y += PredictVel.y;
prediction.z += PredictVel.z;
prediction.y += (4.905f * powf(BulletTime, 2));
} return prediction;
}
get_speed:
inline float ProjectileSpeed_Normal(float dist, std::string currentweapon, Process& process)
{
const float default_speed = 500.0f;
float bullet_multiplier = 0;
uint64_t clActiveItem = process.read<uint64_t>(local_datas.clActiveItem);
uint64_t activeItem = decryption::decrypt_cl_active_item(clActiveItem);
uint64_t localActiveItem = process.read<uint64_t>(globals->object_local + offsets::BasePlayer::clActiveItem);
uint64_t localInventoryItem = process.read<uint64_t>(globals->object_local + offsets::BasePlayer::inventoryValue);
uint64_t active_item = decryption::decrypt_cl_active_item(localActiveItem);
uint64_t object_inventory = decryption::decrypt_player_inventory(localInventoryItem, process);
uint64_t current_item = 0;
if (object_inventory && active_item) {
uint64_t inventory_belt = process.read<uint64_t>(object_inventory + offsets::PlayerInventory::invBelt);
if (inventory_belt) {
uint64_t belt_list = process.read<uint64_t>(inventory_belt + offsets::ItemContainer::itemList);
if (belt_list) {
uint64_t belt_array = process.read<uint64_t>(belt_list + 0x10);
if (belt_array) {
for (int idx = 0; idx < 6; idx++) {
current_item = process.read<uint64_t>(belt_array + 0x20 + (idx * 0x8));
// //printf("0x%llX\n", current_item);
if (!current_item) continue;
bullet_multiplier += GetAmmoMultiplier(process, current_item);;
}
}
}
}
}
auto HandWeapon = currentweapon.c_str();
if (HandWeapon == std::string("rifle.ak") || HandWeapon == std::string("rifle.ak.ice") || HandWeapon == std::string("rifle.ak.diver"))
{
if (dist <= 0.f) return 375.9f * bullet_multiplier;
else if (dist <= 150.f) return 386.f * bullet_multiplier;
else if (dist <= 200.f) return 390.f * bullet_multiplier;
else if (dist <= 250.f) return 400.f * bullet_multiplier;
else if (dist <= 300.0f) return 410.f * bullet_multiplier;
}
if (HandWeapon == std::string("hmlmg")) return 500.f * bullet_multiplier;
if (HandWeapon == std::string("rifle.lr300")) return 300.f * bullet_multiplier;
if (HandWeapon == std::string("rifle.bolt")) return 579.f * bullet_multiplier;
if (HandWeapon == std::string("rifle.l96")) return 1126.0f * bullet_multiplier;
if (HandWeapon == std::string("rifle.m39")) return 445.f * bullet_multiplier;
if (HandWeapon == std::string("rifle.semiauto") || HandWeapon == std::string("rifle.sks")) return 358.0f * bullet_multiplier;
if (HandWeapon == std::string("lmg.m249")) return 450.f * bullet_multiplier;
if (HandWeapon == std::string("smg.thompson"))
{
if (dist <= 180.f) return 270.f * bullet_multiplier;
else if (dist <= 204.f) return 250.f * bullet_multiplier;
else if (dist <= 250.f) return 245.f * bullet_multiplier;
else if (dist <= 350.f) return 230.f * bullet_multiplier;
}
if (HandWeapon == std::string("smg.2"))
{
if (dist <= 160.f) return 220.f * bullet_multiplier;
else if (dist <= 200.f) return 195.f * bullet_multiplier;
}
if (HandWeapon == std::string("smg.mp5")) return 240.f * bullet_multiplier;
if (HandWeapon == std::string("pistol.prototype17"))
{
if (dist <= 110.f) return 300.f * bullet_multiplier;
else if (dist <= 169.f) return 290.f * bullet_multiplier;
else if (dist <= 170.f) return 280.f * bullet_multiplier;
else if (dist <= 180.f) return 275.f * bullet_multiplier;
else if (dist <= 190.f) return 270.f * bullet_multiplier;
else if (dist <= 200.f) return 265.f * bullet_multiplier;
}
if (HandWeapon == std::string("pistol.python")) return 300.f * bullet_multiplier;
if (HandWeapon == std::string("pistol.semiauto")) return 300.f * bullet_multiplier;
if (HandWeapon == std::string("pistol.revolver")) return 270.f * bullet_multiplier;
if (HandWeapon == std::string("pistol.m92")) return 300.f * bullet_multiplier;
if (HandWeapon == std::string("pistol.eoka")) return 90.f * bullet_multiplier;
if (HandWeapon == std::string("pistol.nailgun"))
{
if (dist <= 60.f) return 59.f * bullet_multiplier;
else if (dist <= 85.f) return 58.3f * bullet_multiplier;
else return 57.8f * bullet_multiplier;
}
if (HandWeapon == std::string("crossbow"))
{
if (dist <= 83.f) return 90.f * bullet_multiplier;
else if (dist <= 100.f) return 88.f * bullet_multiplier;
else if (dist <= 150.f) return 86.f * bullet_multiplier;
else return 86.f * bullet_multiplier;
}
if (HandWeapon == std::string("bow.compound"))
{
if (dist <= 90.f) return 120.f * bullet_multiplier;
else if (dist <= 150.f) return 115.76f * bullet_multiplier;
else return 115.5f * bullet_multiplier;
}
if (HandWeapon == std::string("bow.hunting") || HandWeapon == std::string("legacy bow"))
{
if (dist <= 41.f) return 60.f * bullet_multiplier;
else if (dist <= 82.f) return 58.f * bullet_multiplier;
else if (dist <= 102.f) return 57.5f * bullet_multiplier;
else if (dist <= 112.f) return 57.3f * bullet_multiplier;
else if (dist <= 127.f) return 57.f * bullet_multiplier;
else if (dist <= 146.f) return 56.5f * bullet_multiplier;
else if (dist <= 153.f) return 56.3f * bullet_multiplier;
else if (dist <= 163.f) return 56.f * bullet_multiplier;
else if (dist <= 172.f) return 55.7f * bullet_multiplier;
else if (dist <= 178.f) return 55.5f * bullet_multiplier;
else if (dist <= 184.f) return 55.3f * bullet_multiplier;
else if (dist <= 189.f) return 55.1f * bullet_multiplier;
else if (dist <= 196.f) return 54.9f * bullet_multiplier;
else if (dist <= 201.f) return 54.7f * bullet_multiplier;
else if (dist <= 206.f) return 54.5f * bullet_multiplier;
else if (dist <= 210.f) return 54.3f * bullet_multiplier;
else if (dist <= 215.f) return 54.1f * bullet_multiplier;
else if (dist <= 220.f) return 53.9f * bullet_multiplier;
else if (dist <= 225.1f) return 53.7f * bullet_multiplier;
else if (dist <= 230.1f) return 53.5f * bullet_multiplier;
else if (dist <= 233.1f) return 53.3f * bullet_multiplier;
else if (dist <= 237.1f) return 53.1f * bullet_multiplier;
else if (dist <= 241.1f) return 52.9f * bullet_multiplier;
else if (dist <= 244.1f) return 52.7f * bullet_multiplier;
else if (dist <= 248.1f) return 52.5f * bullet_multiplier;
else if (dist <= 252.1f) return 52.3f * bullet_multiplier;
else if (dist <= 255.1f) return 52.1f * bullet_multiplier;
else if (dist <= 500.f) return 50.f * bullet_multiplier;
}
if (HandWeapon == std::string("shotgun.pump")) return 100.0f * bullet_multiplier;
if (HandWeapon == std::string("shotgun.spas12")) return 100.0f * bullet_multiplier;
if (HandWeapon == std::string("shotgun.waterpipe")) return 100.0f * bullet_multiplier;
if (HandWeapon == std::string("shotgun.double")) return 100.0f * bullet_multiplier;
return default_speed * bullet_multiplier;
}
inline float GetAmmoMultiplier(Process& process, uintptr_t activeItem) {
//printf("GetAmmoMultiplier called: activeItem=0x%llX\n", activeItem);
const uintptr_t baseProjectile = process.read<uintptr_t>(activeItem + 0x58);
if (!baseProjectile) {
//printf("GetAmmoMultiplier returning 1.0 (no baseProjectile)\n");
return 1.0f;
}
const uintptr_t primaryMagazine = process.read<uintptr_t>(baseProjectile + offsets::BaseProjectile::primaryMagazine);
if (!primaryMagazine) {
//printf("GetAmmoMultiplier returning 1.0 (no primaryMagazine)\n");
return 1.0f;
}
const uintptr_t ammoType = process.read<uintptr_t>(primaryMagazine + 0x20);
if (!ammoType) {
//printf("GetAmmoMultiplier returning 1.0 (no ammoType)\n");
return 1.0f;
}
const uintptr_t ammoInfo = process.read<uintptr_t>(ammoType + 0x28);
if (!ammoInfo) {
//printf("GetAmmoMultiplier returning 1.0 (no ammoInfo)\n");
return 1.0f;
}
std::string ammoName = GameUtils::ReadWeaponName(process, ammoInfo);
auto it = BULLET_VELOCITIES.find(ammoName);
float result = it != BULLET_VELOCITIES.end() ? it->second : 1.0f;
//printf("GetAmmoMultiplier returning: %.2f\n", result);
return result;
}
const std::map<std::string, float> BULLET_VELOCITIES = {
{ "ammo.rifle", 1.0f }, { "ammo.rifle.hv", 1.2f }, { "ammo.rifle.explosive", 0.49f },
{ "ammo.rifle.incendiary", 0.55f }, { "ammo.pistol", 1.0f }, { "ammo.pistol.hv", 1.33333f },
{ "ammo.pistol.fire", 0.75f }, { "arrow.wooden", 1.0f }, { "arrow.hv", 1.6f },
{ "arrow.fire", 0.8f }, { "arrow.bone", 0.9f }, { "ammo.handmade.shell", 1.0f },
{ "ammo.shotgun.slug", 2.25f }, { "ammo.shotgun.fire", 1.0f }, { "ammo.shotgun", 2.25f },
{ "ammo.nailgun.nails", 1.0f }
};