function aim_bot()
local lp = proc.read_int64(base_address + offsets.global.localplayer)
if not lp or lp == 0 then return end
local localEye = proc.read_vec3(lp + offsets.entity.camera_origin)
local viewAngles = proc.read_vec3(lp + offsets.global.view_angles)
local punchAngle = proc.read_vec3(lp + offsets.entity.punch_angle)
local bestFov, bestAngle = 10.0, nil
for i = 0, maxticks do
local ent_data = entlist[i]
if not (ent_data and ent_data.valid and ent_data.cname == "CPlayer") then goto continue end
if ent_data.health <= 0 then goto continue end
--if is_knocked(i) then goto continue end
--if is_same_team(i) then goto continue end
--if not is_visible(i) then goto continue end
local entHead = ent_data.head
if not entHead then goto continue end
local weapon_handle = proc.read_int64(lp + 0x19b4); --//[RecvTable.DT_Player]->m_latestPrimaryWeapons
local weapon_entity = proc.read_int64(base_address + offsets.global.entity_list + (weapon_handle << 5))
local projectile_speed = proc.read_float(weapon_entity + 0x2810) --//CWeaponX!m_flProjectileSpeed or [WeaponSettings]->projectile_launch_speed + [WeaponSettingsMeta]->base
local projectile_gravity = proc.read_float(weapon_entity + 0x2818) --//CWeaponX!m_flProjectileScale or [WeaponSettings]->projectile_gravity_scale + [WeaponSettingsMeta]->base
local distance = ent_data.distance
local velocity = ent_data.velocity
if distance > 100 then
projectile_speed = projectile_speed * 0.02
elseif distance > 200 then
projectile_speed = projectile_speed * 0.016
else
projectile_speed = projectile_speed * 0.025
end
local time = distance / projectile_speed
local predicted = {
entHead[1] + velocity[1] * time,
entHead[2] + velocity[2] * time,
entHead[3] + velocity[3] * time + 32.0 * (projectile_gravity * time)
}
local angle = calculate_angle(localEye, predicted, viewAngles)
local fov = math.sqrt(angle[1]^2 + angle[2]^2)
if fov < bestFov then
bestFov = fov
bestAngle = angle
end
::continue::
end
if input.is_key_down(2) and bestAngle then
local newAngle = vec3_add(viewAngles, bestAngle)
newAngle[1] = newAngle[1] - punchAngle[1] * 1.0
newAngle[2] = newAngle[2] - punchAngle[2] * 1.0
proc.write_vec3(lp + offsets.global.view_angles, newAngle)
end
end