console.execute("clear")
--menu
menu.add_slider_int("Shime.lua",0,0)
menu.add_slider_int("=====Rage=====",0,0)
menu.add_check_box("Resolver")
menu.add_slider_int("======AA======",0,0)
menu.add_check_box("Pitch zero on land")
menu.add_check_box("Random yaw modifier")
menu.add_combo_box("Anti-Aim Types:",{"None", "Desync *****","Center jitter on move"})
menu.add_slider_int( "Desync range min", 1, 60)
menu.add_slider_int( "Desync range max", 1, 60)
menu.add_slider_int( "Custom Slow-Walk Speed", 1, 120)
menu.add_key_bind("Custom Slow-Walk")
menu.add_check_box("Anti backstab")
menu.add_slider_int("====Visuals===",0,0)
menu.add_check_box("Indicators")
local font = render.create_font("Verdana", 12, 500, false, true, false)
menu.add_check_box("Enable keybind list")
menu.add_slider_int("Key binds position X", 0, engine.get_screen_width())
menu.add_slider_int("Key binds position Y", 0, engine.get_screen_height())
local font = render.create_font("Verdana", 12, 500, false, true, false)
menu.add_check_box("Watermark")
menu.add_slider_int("=====Misc=====",0,0)
menu.add_check_box("Custom Teleport")
menu.add_check_box("Moving Teleport")
menu.add_check_box("Moving Lag Exploit")
menu.add_check_box("Standing Teleport")
menu.add_check_box("Standing Lag Exploit")
menu.add_slider_int("Clantag speed", 1, 10)
menu.add_combo_box("Clantags", {"None", "Shime.lua", "onetap.su", "onetap", "fatality", "evolve", "gamesense", "NeverLose", "rifk7"})
-- functions
local types = {"always", "holding", "toggled"}
local get_state, get_mode = menu.get_key_bind_state, menu.get_key_bind_mode
local screen_x, screen_y = engine.get_screen_width(), engine.get_screen_height()
local count = 0
local function add_bind(name, bind_name, x, y)
if get_state(bind_name) then
render.draw_text(font, x, y + 22 + (15 * count), color.new(255, 255, 255), name)
text_width = render.get_text_width(font, "[" .. types[get_mode(bind_name) + 1] .. "]")
render.draw_text(font, x + 151 - text_width - 5, y + 23 + (15 * count), color.new(255, 255, 255), "[" .. types[get_mode(bind_name) + 1] .. "]")
count = count + 1
end
end
local function on_paint()
if not menu.get_bool("Enable keybind list") then
return
end
if not engine.is_in_game() then
return
end
local pos_x = menu.get_int("Key binds position X")
local pos_y = menu.get_int("Key binds position Y")
render.draw_rect_filled(pos_x, pos_y - 3, 150, 2, color.new(125, 125, 255))
render.draw_rect_filled(pos_x, pos_y - 1, 150, 18, color.new(20, 20, 20, 100))
render.draw_text(font, pos_x + 55, pos_y + 2, color.new(255, 255, 255), "keybinds")
count = 0
add_bind(" Hide shots", "rage.hide_shots_key", pos_x + 1, pos_y - 2)
add_bind(" Edge jump", "misc.edge_jump_key", pos_x + 1, pos_y - 2)
add_bind(" Double tap", "rage.double_tap_key", pos_x + 1, pos_y - 2)
add_bind(" Slow walk", "misc.slow_walk_key", pos_x + 1, pos_y - 2)
add_bind(" Force damage", "rage.force_damage_key", pos_x + 1, pos_y - 2)
add_bind(" Invert desync", "anti_aim.invert_desync_key", pos_x + 1, pos_y - 2)
add_bind(" Fake duck", "anti_aim.fake_duck_key", pos_x + 1, pos_y - 2)
add_bind(" Automatic peek", "misc.automatic_peek_key", pos_x + 1, pos_y - 2)
add_bind(" Third person", "misc.third_person_key", pos_x + 1, pos_y - 2)
end
client.add_callback("on_paint", on_paint)
client.add_callback("on_paint", function()
if menu.get_bool("Watermark") then
local screen_width = engine.get_screen_width()
local username = globals.get_username()
local ping = tostring(globals.get_ping())
local tickrate = math.floor(1.0 / globals.get_intervalpertick())
local get_time = os.date("%X", os.time())
--
local text
if engine.is_connected() then
text = tostring(" shime.lua | " .. username .. " | delay: " .. ping .. "ms | " .. tickrate .. "tick | "..get_time.. " ")
else
text = tostring(" shime.lua | " .. username .. " | " ..get_time.. " ")
end
--
local width = render.get_text_width(font, text)
--
local line_color = color.new(125, 125, 255)
local text_color = color.new(255, 255, 255)
local bg_color = color.new(20, 20, 20, 100)
--
local x = screen_width - 10 - width - 4
local y = 10
local w = width + 5
--
render.draw_rect_filled(x, y - 1, w, 2, line_color)
render.draw_rect_filled(x, y + 1, w, 18, bg_color)
--render.draw_rect_filled(x + w - 100, y + 23, 100, 18, bg_color)
render.draw_text(font, x + 2.5, y + 3, text_color, text)
end
end)
local smallfont = render.create_font("Calibri", 15, 100, true, false, false)
local screen_width = engine.get_screen_width()
local screen_height = engine.get_screen_height()
local x, y= engine.get_screen_width()/2,engine.get_screen_height()/2
local add=0
client.add_callback("on_paint", function()
if not engine.is_in_game() then
return
end
if menu.get_bool("Indicators") then
local realtime_fade = math.floor(math.sin(globals.get_realtime() * 2) * 127 + 128)
render.draw_text(smallfont, engine.get_screen_width()/2+2, engine.get_screen_height()/2 +5,color.new(250, 137, 50),"Shime.Lua")
render.draw_text(smallfont, engine.get_screen_width()/2+2, engine.get_screen_height()/2 +15,color.new(166, 130, 250),"DYNAMIC")
if menu.get_key_bind_state("rage.hide_shots_key" ) and add==1 then
render.draw_text(smallfont, engine.get_screen_width()/2+2, engine.get_screen_height()/2 +35,color.new(93, 146, 252, realtime_fade),"HIDE")
elseif menu.get_key_bind_state("rage.hide_shots_key" ) and add==0 then
render.draw_text(smallfont, engine.get_screen_width()/2+2, engine.get_screen_height()/2 +25,color.new(93, 146, 252, realtime_fade),"HIDE")
end
if menu.get_key_bind_state("rage.double_tap_key" ) and menu.get_key_bind_state("anti_aim.fake_duck_key") then
render.draw_text(smallfont, engine.get_screen_width()/2+2, engine.get_screen_height()/2 +25,color.new(255, 0, 0, realtime_fade),"DT(fakeduck)")
elseif menu.get_key_bind_state("rage.double_tap_key" ) then
render.draw_text(smallfont, engine.get_screen_width()/2+2, engine.get_screen_height()/2 +25,color.new(59, 255, 75, realtime_fade),"DT")
add=1
else add=0
end
end
end)
local cpfont = render.create_font("Verdana", 15, 4, true, true, false)
local cpfont2 = render.create_font("Verdana", 12, 2, true, false, false)
local sw, sh = engine.get_screen_width(), engine.get_screen_height()
local ffi = require "ffi"
ffi.cdef[[
typedef int(__fastcall* clantag_t)(const char*, const char*);
]]
local fn_change_clantag = utils.find_signature("engine.dll", "53 56 57 8B DA 8B F9 FF 15")
local set_clantag = ffi.cast("clantag_t", fn_change_clantag)
function round(num, numDecimalPlaces)
local mult = 10^(numDecimalPlaces or 0)
return math.floor(num * mult + 0.5) / mult
end
local clean = {
" ",
}
local animation = {
"Shime.lua",
"Shime.lu",
"Shime.l",
"Shime.",
"Shime",
"Shim",
"Shi",
"Sh",
"S",
" ",
"S",
"Sh",
"Shi",
"Shim",
"Shime",
"Shime.",
"Shime.l",
"Shime.lu",
"Shime.lua",
}
local otsu = {
"onetap.su",
"nepat.su o",
"epat.su on",
"pat.su one",
"ap.su onet",
"t.su oneta",
".su onetap",
"su onetap.",
"u onetap.s",
"onetap.su",
}
local onetap = {
"onetap",
}
local fatality = {
" ",
"f",
"fa",
"fat",
"fata",
"fatal",
"fatali",
"fatality",
"fatality",
"fatality",
"fatality",
"fatality",
"atality",
"tality",
"ality",
"lity",
"ity",
"ty",
"y",
" ",
}
local evolve = {
"ev0lve.xyz",
"ev0lve.xyz",
"ev0lve.xyz",
"ev0lve.xyz",
"ev0lve.xyz",
"v0lve.xyz",
"0lve.xyz",
"lve.xyz",
"ve.xyz",
"e.xyz",
".xyz",
"xyz",
"yz",
"z",
"",
"e",
"ev",
"ev0",
"ev0l",
"ev0lv",
"ev0lve",
"ev0lve.",
"ev0lve.x",
"ev0lve.xyz",
}
local gamesense = {
"gamesense",
"amesense",
"mesense",
"esense",
"sense",
"ense",
"nse",
"se",
"e",
" ",
"ga",
"gam",
"game",
"games",
"gamese",
"gamesen",
"gamesens",
"gamesense",
"gamesense ",
"gamesense ",
"gamesense ",
"gamesense ",
"gamesense ",
"gamesense ",
"gamesense ",
"gamesense ",
"gamesense ",
"gamesense ",
"gamesense ",
"gamesense ",
"gamesense ",
"gamesense ",
"gamesense ",
}
local interwebz = {
" ",
" | ",
" |\\ ",
" |\\| ",
" N ",
" N3 ",
" Ne ",
" Ne\\ ",
" Ne\\/ ",
" Nev ",
" Nev3 ",
" Neve ",
" Neve| ",
" Neve|2 ",
" Never|_ ",
" Neverl ",
" Neverl0 ",
" Neverlo ",
" Neverlo5 ",
" Neverlos ",
" Neverlos3 ",
" Neverlose ",
" Neverlose. ",
" Neverlose.< ",
" Neverlose.c< ",
" Neverlose.cc ",
" Neverlose.cc ",
" Neverlose.c< ",
" Neverlose.< ",
" Neverlose. ",
" Neverlose ",
" Neverlos3 ",
" Neverlos ",
" Neverlo5 ",
" Neverlo ",
" Neverl0 ",
" Neverl ",
" Never|_ ",
" Never|2 ",
" Neve|2 ",
" Neve| ",
" Neve ",
" Nev3 ",
" Nev ",
" Ne\\/ ",
" Ne ",
" N3 ",
" N ",
" |\\| ",
" |\\ ",
" |\\| ",
" |\\ ",
" | ",
" ",
}
local rifk7 = {
"(Яifk7)",
}
local old_time = 0
client.add_callback("on_paint", function()
if menu.get_int("Clantags") == 0 then
local curtime = math.floor(globals.get_curtime()*5)
if old_time ~= curtime then
set_clantag(clean[curtime % #clean+1], clean[curtime % #clean+1])
end
old_time = curtime
elseif menu.get_int("Clantags") == 1 then
local curtime = math.floor(globals.get_curtime()*menu.get_int("Clantag speed"))
if old_time ~= curtime then
set_clantag(animation[curtime % #animation+1], animation[curtime % #animation+1])
end
old_time = curtime
elseif menu.get_int("Clantags") == 2 then
local curtime = math.floor(globals.get_curtime()*menu.get_int("Clantag speed"))
if old_time ~= curtime then
set_clantag(otsu[curtime % #otsu+1], otsu[curtime % #otsu+1])
end
old_time = curtime
elseif menu.get_int("Clantags") == 3 then
local curtime = math.floor(globals.get_curtime()*menu.get_int("Clantag speed"))
if old_time ~= curtime then
set_clantag(onetap[curtime % #onetap+1], onetap[curtime % #onetap+1])
end
old_time = curtime
elseif menu.get_int("Clantags") == 4 then
local curtime = math.floor(globals.get_curtime()*menu.get_int("Clantag speed"))
if old_time ~= curtime then
set_clantag(fatality[curtime % #fatality+1], fatality[curtime % #fatality+1])
end
old_time = curtime
elseif menu.get_int("Clantags") == 5 then
local curtime = math.floor(globals.get_curtime()*menu.get_int("Clantag speed"))
if old_time ~= curtime then
set_clantag(evolve[curtime % #evolve+1], evolve[curtime % #evolve+1])
end
old_time = curtime
elseif menu.get_int("Clantags") == 6 then
local curtime = math.floor(globals.get_curtime()*menu.get_int("Clantag speed"))
if old_time ~= curtime then
set_clantag(gamesense[curtime % #gamesense+1], gamesense[curtime % #gamesense+1])
end
old_time = curtime
elseif menu.get_int("Clantags") == 7 then
local curtime = math.floor(globals.get_curtime()*menu.get_int("Clantag speed"))
if old_time ~= curtime then
set_clantag(interwebz[curtime % #interwebz+1], interwebz[curtime % #interwebz+1])
end
old_time = curtime
elseif menu.get_int("Clantags") == 8 then
local curtime = math.floor(globals.get_curtime()*menu.get_int("Clantag speed"))
if old_time ~= curtime then
set_clantag(rifk7[curtime % #rifk7+1], rifk7[curtime % #rifk7+1])
end
old_time = curtime
end
end)
local bit = require("bit")
local function a(cmd)
if not menu.get_key_bind_state("Custom Slow-Walk") then
return
end
if not entitylist.get_local_player() then
return
end
Forward_Flag = bit.band(cmd.buttons, 8) == 8
Back_Flag = bit.band(cmd.buttons, 16) == 16
Left_Flag = bit.band(cmd.buttons, 512) == 512
Right_Flag = bit.band(cmd.buttons, 1024) == 1024
Movement_Straight = 0
Movement_Side = 0
if Forward_Flag then
Movement_Straight = Movement_Straight + menu.get_int("Custom Slow-Walk Speed")
end
if Back_Flag then
Movement_Straight = Movement_Straight - menu.get_int("Custom Slow-Walk Speed")
end
if Left_Flag then
Movement_Side = Movement_Side - menu.get_int("Custom Slow-Walk Speed")
end
if Right_Flag then
Movement_Side = Movement_Side + menu.get_int("Custom Slow-Walk Speed")
end
cmd.forwardmove = Movement_Straight
cmd.sidemove = Movement_Side
--if()
--cmd.forwardmove = 300
--cmd.sidemove = 300
--client.log(tostring(cmd.forwardmove))
--client.log(tostring(cmd.sidemove))
return
end
client.add_callback("create_move",a)
local function calculateAngle(src, point)
local angles = vector.new(0, 0, 0)
local delta = vector.new(src.x - point.x, src.y - point.y, src.z - point.z)
local hyp = delta:length_2d()
angles.y = math.atan(delta.y / delta.x) * math.pi
angles.x = math.atan(-delta.z / hyp) * -math.pi
angles.z = 0.0
angles.y = angles.y + 180.0
return angles
end
function normalize_yaw(y)
while y > 180 do
y = y - 360
end
while y < -180 do
y = y + 360
end
return y
end
function get_eye_position(player, cmd)
local origin = player:get_origin()
return vector.new(origin.x + cmd.viewangles.x, origin.y + cmd.viewangles.y, origin.z + cmd.viewangles.z)
end
function isKnife(weap)
local idx = weap:get_prop_int("CBaseCombatWeapon", "m_iItemDefinitionIndex")
if idx == 42 or idx == 500 or idx == 515 or idx == 512 or idx == 505 or idx == 506 or idx == 507 or idx == 508 or idx == 516 or idx == 514 or idx == 59 or idx == 509 or idx == 41 or idx == 80 or idx == 520 or idx == 522 or idx == 519 or idx == 523 or idx == 503 or idx == 518 or idx == 517 or idx == 521 or idx == 525 then
return true
end
return false
end
local backup = {
did = false,
yaw = 0,
pitch = 0,
target = 0
}
function antiBackstab(cmd)
local localplayer = entitylist.get_local_player()
if not localplayer then return end
if menu.get_bool("Anti backstab") == false then return end
local lorigin = localplayer:get_origin()
local found_data = {
found = false,
best_dist = 0,
player = nil
}
for i = 0,globals.get_maxclients() do
local ent = entitylist.get_player_by_index(i)
if ent and ent:is_player() then
local player = entitylist.entity_to_player(ent)
if player:get_health() > 0 and player:get_team() ~= localplayer:get_team() then
local weap = entitylist.get_weapon_by_player(player)
if isKnife(weap) == true then
local origin = player:get_origin()
local dist = lorigin:dist_to(origin)
if dist < 400 and (dist < found_data.best_dist or found_data.found == false) then
found_data.found = true
found_data.best_dist = dist
found_data.player = player
end
end
end
end
end
if found_data.found == true then
if backup.did == false then
backup.did = true
backup.yaw = menu.get_int("anti_aim.yaw_offset")
backup.pitch = menu.get_int("anti_aim.pitch")
backup.target = menu.get_int("anti_aim.target_yaw")
end
local angs = calculateAngle(get_eye_position(localplayer, cmd), found_data.player:get_origin())
menu.set_int("anti_aim.yaw_offset", normalize_yaw(menu.get_int("anti_aim.yaw_offset") + math.floor(angs.y)))
menu.set_int("anti_aim.pitch", 0)
menu.set_int("anti_aim.target_yaw", 1)
elseif backup.did == true then
menu.set_int("anti_aim.yaw_offset", backup.yaw)
menu.set_int("anti_aim.pitch", backup.pitch)
menu.set_int("anti_aim.target_yaw", backup.target)
backup.did = false
end
end
client.add_callback("create_move", antiBackstab)
local function teleport()
local local_player = entitylist.get_local_player()
local velocity = local_player:get_velocity()
local speed = velocity:length_2d()
for C = 0,8 do
if speed >= 40 then
menu.set_bool("rage.weapon[".. C .."].extended_teleport", menu.get_bool("Moving Teleport"))
menu.set_bool("rage.weapon[".. C .."].lag_exploit", menu.get_bool("Moving Lag Exploit"))
elseif speed <= 39 then
menu.set_bool("rage.weapon[".. C .."].extended_teleport", menu.get_bool("Standing Teleport"))
menu.set_bool("rage.weapon[".. C .."].lag_exploit", menu.get_bool("Standing Lag Exploit"))
end
end
end
local old_pitch = menu.get_int("anti_aim.pitch")
local int = 0
function createmove_func(cmd)
if menu.get_bool("Pitch zero on land") == false then return end
if entitylist.get_local_player() == nil then return end
flag = entitylist.get_local_player():get_prop_int("CBasePlayer", "m_fFlags")
if flag == 256 or flag == 262 then
int = 0
end
if flag == 257 or flag == 261 or flag == 263 then
int = int + 4
end
if int > 45 and int < 250 then
menu.set_int("anti_aim.pitch", 0)
else
menu.set_int("anti_aim.pitch", old_pitch)
end
end
client.add_callback("create_move", createmove_func)
local function setJitter(a)
menu.set_int("anti_aim.desync_range", a)
menu.set_int("anti_aim.desync_range_inverted", a)
end
local function bebra(cmd)
local local_player = entitylist.get_local_player()
local velocity = local_player:get_velocity()
local speed = velocity:length_2d()
local getJittermin = menu.get_int("Desync range min")
local getJittermax = menu.get_int("Desync range max")
local tickcount = globals.get_tickcount() % 3
if menu.get_bool("Random yaw modifier", true) then
menu.set_int("anti_aim.yaw_modifier",math.random (1, 2))
else
menu.set_int("anti_aim.yaw_modifier", 1)
end
if menu.get_bool("Anti-Aim Types:") == 1 then
if tickcount == 2 then
setJitter(getJittermin)
else
setJitter(getJittermax)
end
elseif menu.get_int("Anti-Aim Types:") == 2 then
if (speed <= 90) then
menu.set_int("anti_aim.yaw_modifier_range", 1)
if tickcount == 2 then
setJitter(getJittermin)
else
setJitter(getJittermax)
end
else
menu.set_int("anti_aim.yaw_modifier_range", math.random( 10, 15))
menu.set_int("anti_aim.desync_range", math.random(50, 60))
menu.set_int("anti_aim.desync_range_inverted", math.random(45, 50))
menu.set_int("anti_aim.yaw_modifier_range",math.random (11, 15))
end
end
end
-- resolver start
local angles = {
[1] = -60,
[2] = 60,
[3] = -58,
[4] = 58,
[5] = -50,
[6] = 50,
[7] = -55,
[8] = 55,
[9] = 48,
[10] = -48,
[11] = 30,
[12] = -29,
[13] = 29,
[14] = -15,
[15] = 15,
[16] = 0
}
local bit_band = bit.band
local math_pi = math.pi
local math_min = math.min
local math_max = math.max
local math_deg = math.deg
local math_rad = math.rad
local math_sqrt = math.sqrt
local math_sin = math.sin
local math_cos = math.cos
local math_atan = math.atan
local math_atan2 = math.atan2
local math_acos = math.acos
local math_fmod = math.fmod
local math_ceil = math.ceil
local math_pow = math.pow
local math_abs = math.abs
local math_floor = math.floor
local last_angle = 0
local new_angle = 0
local last_angle = 0
local new_angle = 0
local switch1 = false
local switch2 = false
local i = 1
local username = globals.get_username()
local function resolve(shot_info)
local result = shot_info.result
local gpinf = engine.get_player_info
local target = shot_info.target_index
local target_name = gpinf(target).name
menu.set_bool("player_list.player_settings[" .. target.. "].force_body_yaw", true) -- we only want to bruteforce our target. not everyone
if last_angle == -new_angle and switch1 then
new_angle = -angles[i]
if switch2 == true then
switch1 = not switch1
end
else
if i < #angles then
i = i + 1
else
i = 1
end
new_angle = angles[i]
end
if last_angle == 0 then
last_angle = "RESOLVER"
end
if result == "Resolver" and menu.get_bool("Enable Resolver lua") then
print("[LEGENDWARE] missed player: " ..target_name .. ", at angle: " .. last_angle .. ", bruteforced to: " .. new_angle)
menu.set_int("player_list.player_settings["..target.."].body_yaw", new_angle)
end
if result == "Hit" and menu.get_bool("Enable Resolver lua") then
print("[LEGENDWARE] hit player " ..target_name.. ", at angle: " .. new_angle)
end
local function set_all_down()
local all = globals.get_maxclients()
if menu.get_bool("force all players down") then
for *****=1,48 do
menu.set_bool("player_list.player_settings[" ..*****.. "].force_pitch", true)
menu.set_int("player_list.player_settings[" ..*****.. "].pitch", 89)
end
end
end
client.add_callback("on_shot", resolve)
client.add_callback("on_paint", set_all_down)
if username == "User" then
console.execute("sv_lan 1")
else
end
end
--region math
function math.round(number, precision)
local mult = 10 ^ (precision or 0)
return math.floor(number * mult + 0.5) / mult
end
--endregion
--region angle
--- @class angle_c
--- @field public p number Angle pitch.
--- @field public y number Angle yaw.
--- @field public r number Angle roll.
local angle_c = {}
local angle_mt = {
__index = angle_c
}
--- Overwrite the angle's angles. Nil values leave the angle unchanged.
--- @param angle angle_c
--- @param p_new number
--- @param y_new number
--- @param r_new number
--- @return void
angle_mt.__call = function(angle, p_new, y_new, r_new)
p_new = p_new or angle.p
y_new = y_new or angle.y
r_new = r_new or angle.r
angle.p = p_new
angle.y = y_new
angle.r = r_new
end
--- Create a new angle object.
--- @param p number
--- @param y number
--- @param r number
--- @return angle_c
local function angle(p, y, r)
return setmetatable(
{
p = p or 0,
y = y or 0,
r = r or 0
},
angle_mt
)
end
--- Overwrite the angle's angles. Nil values leave the angle unchanged.
--- @param p number
--- @param y number
--- @param r number
--- @return void
function angle_c:set(p, y, r)
p = p or self.p
y = y or self.y
r = r or self.r
self.p = p
self.y = y
self.r = r
end
--- Offset the angle's angles. Nil values leave the angle unchanged.
--- @param p number
--- @param y number
--- @param r number
--- @return void
function angle_c:offset(p, y, r)
p = self.p + p or 0
y = self.y + y or 0
r = self.r + r or 0
self.p = self.p + p
self.y = self.y + y
self.r = self.r + r
end
--- Clone the angle object.
--- @return angle_c
function angle_c:clone()
return setmetatable(
{
p = self.p,
y = self.y,
r = self.r
},
angle_mt
)
end
--- Clone and offset the angle's angles. Nil values leave the angle unchanged.
--- @param p number
--- @param y number
--- @param r number
--- @return angle_c
function angle_c:clone_offset(p, y, r)
p = self.p + p or 0
y = self.y + y or 0
r = self.r + r or 0
return angle(
self.p + p,
self.y + y,
self.r + r
)
end
--- Clone the angle and optionally override its coordinates.
--- @param p number
--- @param y number
--- @param r number
--- @return angle_c
function angle_c:clone_set(p, y, r)
p = p or self.p
y = y or self.y
r = r or self.r
return angle(
p,
y,
r
)
end
--- Unpack the angle.
--- @return number, number, number
function angle_c:unpack()
return self.p, self.y, self.r
end
--- Set the angle's euler angles to 0.
--- @return void
function angle_c:nullify()
self.p = 0
self.y = 0
self.r = 0
end
--- Returns a string representation of the angle.
function angle_mt.__tostring(operand_a)
return string.format("%s, %s, %s", operand_a.p, operand_a.y, operand_a.r)
end
--- Concatenates the angle in a string.
function angle_mt.__concat(operand_a)
return string.format("%s, %s, %s", operand_a.p, operand_a.y, operand_a.r)
end
--- Adds the angle to another angle.
function angle_mt.__add(operand_a, operand_b)
if (type(operand_a) == "number") then
return angle(
operand_a + operand_b.p,
operand_a + operand_b.y,
operand_a + operand_b.r
)
end
if (type(operand_b) == "number") then
return angle(
operand_a.p + operand_b,
operand_a.y + operand_b,
operand_a.r + operand_b
)
end
return angle(
operand_a.p + operand_b.p,
operand_a.y + operand_b.y,
operand_a.r + operand_b.r
)
end
--- Subtracts the angle from another angle.
function angle_mt.__sub(operand_a, operand_b)
if (type(operand_a) == "number") then
return angle(
operand_a - operand_b.p,
operand_a - operand_b.y,
operand_a - operand_b.r
)
end
if (type(operand_b) == "number") then
return angle(
operand_a.p - operand_b,
operand_a.y - operand_b,
operand_a.r - operand_b
)
end
return angle(
operand_a.p - operand_b.p,
operand_a.y - operand_b.y,
operand_a.r - operand_b.r
)
end
--- Multiplies the angle with another angle.
function angle_mt.__mul(operand_a, operand_b)
if (type(operand_a) == "number") then
return angle(
operand_a * operand_b.p,
operand_a * operand_b.y,
operand_a * operand_b.r
)
end
if (type(operand_b) == "number") then
return angle(
operand_a.p * operand_b,
operand_a.y * operand_b,
operand_a.r * operand_b
)
end
return angle(
operand_a.p * operand_b.p,
operand_a.y * operand_b.y,
operand_a.r * operand_b.r
)
end
--- Divides the angle by the another angle.
function angle_mt.__div(operand_a, operand_b)
if (type(operand_a) == "number") then
return angle(
operand_a / operand_b.p,
operand_a / operand_b.y,
operand_a / operand_b.r
)
end
if (type(operand_b) == "number") then
return angle(
operand_a.p / operand_b,
operand_a.y / operand_b,
operand_a.r / operand_b
)
end
return angle(
operand_a.p / operand_b.p,
operand_a.y / operand_b.y,
operand_a.r / operand_b.r
)
end
--- Raises the angle to the power of an another angle.
function angle_mt.__pow(operand_a, operand_b)
if (type(operand_a) == "number") then
return angle(
math.pow(operand_a, operand_b.p),
math.pow(operand_a, operand_b.y),
math.pow(operand_a, operand_b.r)
)
end
if (type(operand_b) == "number") then
return angle(
math.pow(operand_a.p, operand_b),
math.pow(operand_a.y, operand_b),
math.pow(operand_a.r, operand_b)
)
end
return angle(
math.pow(operand_a.p, operand_b.p),
math.pow(operand_a.y, operand_b.y),
math.pow(operand_a.r, operand_b.r)
)
end
--- Performs modulo on the angle with another angle.
function angle_mt.__mod(operand_a, operand_b)
if (type(operand_a) == "number") then
return angle(
operand_a % operand_b.p,
operand_a % operand_b.y,
operand_a % operand_b.r
)
end
if (type(operand_b) == "number") then
return angle(
operand_a.p % operand_b,
operand_a.y % operand_b,
operand_a.r % operand_b
)
end
return angle(
operand_a.p % operand_b.p,
operand_a.y % operand_b.y,
operand_a.r % operand_b.r
)
end
--- Perform a unary minus operation on the angle.
function angle_mt.__unm(operand_a)
return angle(
-operand_a.p,
-operand_a.y,
-operand_a.r
)
end
--- Clamps the angles to whole numbers. Equivalent to "angle:round" with no precision.
--- @return void
function angle_c:round_zero()
self.p = math.floor(self.p + 0.5)
self.y = math.floor(self.y + 0.5)
self.r = math.floor(self.r + 0.5)
end
--- Round the angles.
--- @param precision number
function angle_c:round(precision)
self.p = math.round(self.p, precision)
self.y = math.round(self.y, precision)
self.r = math.round(self.r, precision)
end
--- Clamps the angles to the nearest base.
--- @param base number
function angle_c:round_base(base)
self.p = base * math.round(self.p / base)
self.y = base * math.round(self.y / base)
self.r = base * math.round(self.r / base)
end
--- Clamps the angles to whole numbers. Equivalent to "angle:round" with no precision.
--- @return angle_c
function angle_c:rounded_zero()
return angle(
math.floor(self.p + 0.5),
math.floor(self.y + 0.5),
math.floor(self.r + 0.5)
)
end
--- Round the angles.
--- @param precision number
--- @return angle_c
function angle_c:rounded(precision)
return angle(
math.round(self.p, precision),
math.round(self.y, precision),
math.round(self.r, precision)
)
end
--- Clamps the angles to the nearest base.
--- @param base number
--- @return angle_c
function angle_c:rounded_base(base)
return angle(
base * math.round(self.p / base),
base * math.round(self.y / base),
base * math.round(self.r / base)
)
end
--endregion
--region vector
--- @class vector_c
--- @field public x number X coordinate.
--- @field public y number Y coordinate.
--- @field public z number Z coordinate.
local vector_c = {}
local vector_mt = {
__index = vector_c,
}
--- Overwrite the vector's coordinates. Nil will leave coordinates unchanged.
--- @param vector vector_c
--- @param x_new number
--- @param y_new number
--- @param z_new number
--- @return void
vector_mt.__call = function(vector, x_new, y_new, z_new)
x_new = x_new or vector.x
y_new = y_new or vector.y
z_new = z_new or vector.z
vector.x = x_new
vector.y = y_new
vector.z = z_new
end
--- Create a new vector object.
--- @param x number
--- @param y number
--- @param z number
--- @return vector_c
local function vector(x, y, z)
return setmetatable(
{
x = x or 0,
y = y or 0,
z = z or 0
},
vector_mt
)
end
--- Overwrite the vector's coordinates. Nil will leave coordinates unchanged.
--- @param x_new number
--- @param y_new number
--- @param z_new number
--- @return void
function vector_c:set(x_new, y_new, z_new)
x_new = x_new or self.x
y_new = y_new or self.y
z_new = z_new or self.z
self.x = x_new
self.y = y_new
self.z = z_new
end
--- Offset the vector's coordinates. Nil will leave the coordinates unchanged.
--- @param x_offset number
--- @param y_offset number
--- @param z_offset number
--- @return void
function vector_c:offset(x_offset, y_offset, z_offset)
x_offset = x_offset or 0
y_offset = y_offset or 0
z_offset = z_offset or 0
self.x = self.x + x_offset
self.y = self.y + y_offset
self.z = self.z + z_offset
end
--- Clone the vector object.
--- @return vector_c
function vector_c:clone()
return setmetatable(
{
x = self.x,
y = self.y,
z = self.z
},
vector_mt
)
end
--- Clone the vector object and offset its coordinates. Nil will leave the coordinates unchanged.
--- @param x_offset number
--- @param y_offset number
--- @param z_offset number
--- @return vector_c
function vector_c:clone_offset(x_offset, y_offset, z_offset)
x_offset = x_offset or 0
y_offset = y_offset or 0
z_offset = z_offset or 0
return setmetatable(
{
x = self.x + x_offset,
y = self.y + y_offset,
z = self.z + z_offset
},
vector_mt
)
end
--- Clone the vector and optionally override its coordinates.
--- @param x_new number
--- @param y_new number
--- @param z_new number
--- @return vector_c
function vector_c:clone_set(x_new, y_new, z_new)
x_new = x_new or self.x
y_new = y_new or self.y
z_new = z_new or self.z
return vector(
x_new,
y_new,
z_new
)
end
--- Unpack the vector.
--- @return number, number, number
function vector_c:unpack()
return self.x, self.y, self.z
end
--- Set the vector's coordinates to 0.
--- @return void
function vector_c:nullify()
self.x = 0
self.y = 0
self.z = 0
end
--- Returns a string representation of the vector.
function vector_mt.__tostring(operand_a)
return string.format("%s, %s, %s", operand_a.x, operand_a.y, operand_a.z)
end
--- Concatenates the vector in a string.
function vector_mt.__concat(operand_a)
return string.format("%s, %s, %s", operand_a.x, operand_a.y, operand_a.z)
end
--- Returns true if the vector's coordinates are equal to another vector.
function vector_mt.__eq(operand_a, operand_b)
return (operand_a.x == operand_b.x) and (operand_a.y == operand_b.y) and (operand_a.z == operand_b.z)
end
--- Returns true if the vector is less than another vector.
function vector_mt.__lt(operand_a, operand_b)
if (type(operand_a) == "number") then
return (operand_a < operand_b.x) or (operand_a < operand_b.y) or (operand_a < operand_b.z)
end
if (type(operand_b) == "number") then
return (operand_a.x < operand_b) or (operand_a.y < operand_b) or (operand_a.z < operand_b)
end
return (operand_a.x < operand_b.x) or (operand_a.y < operand_b.y) or (operand_a.z < operand_b.z)
end
--- Returns true if the vector is less than or equal to another vector.
function vector_mt.__le(operand_a, operand_b)
if (type(operand_a) == "number") then
return (operand_a <= operand_b.x) or (operand_a <= operand_b.y) or (operand_a <= operand_b.z)
end
if (type(operand_b) == "number") then
return (operand_a.x <= operand_b) or (operand_a.y <= operand_b) or (operand_a.z <= operand_b)
end
return (operand_a.x <= operand_b.x) or (operand_a.y <= operand_b.y) or (operand_a.z <= operand_b.z)
end
--- Add a vector to another vector.
function vector_mt.__add(operand_a, operand_b)
if (type(operand_a) == "number") then
return vector(
operand_a + operand_b.x,
operand_a + operand_b.y,
operand_a + operand_b.z
)
end
if (type(operand_b) == "number") then
return vector(
operand_a.x + operand_b,
operand_a.y + operand_b,
operand_a.z + operand_b
)
end
return vector(
operand_a.x + operand_b.x,
operand_a.y + operand_b.y,
operand_a.z + operand_b.z
)
end
--- Subtract a vector from another vector.
function vector_mt.__sub(operand_a, operand_b)
if (type(operand_a) == "number") then
return vector(
operand_a - operand_b.x,
operand_a - operand_b.y,
operand_a - operand_b.z
)
end
if (type(operand_b) == "number") then
return vector(
operand_a.x - operand_b,
operand_a.y - operand_b,
operand_a.z - operand_b
)
end
return vector(
operand_a.x - operand_b.x,
operand_a.y - operand_b.y,
operand_a.z - operand_b.z
)
end
--- Multiply a vector with another vector.
function vector_mt.__mul(operand_a, operand_b)
if (type(operand_a) == "number") then
return vector(
operand_a * operand_b.x,
operand_a * operand_b.y,
operand_a * operand_b.z
)
end
if (type(operand_b) == "number") then
return vector(
operand_a.x * operand_b,
operand_a.y * operand_b,
operand_a.z * operand_b
)
end
return vector(
operand_a.x * operand_b.x,
operand_a.y * operand_b.y,
operand_a.z * operand_b.z
)
end
--- Divide a vector by another vector.
function vector_mt.__div(operand_a, operand_b)
if (type(operand_a) == "number") then
return vector(
operand_a / operand_b.x,
operand_a / operand_b.y,
operand_a / operand_b.z
)
end
if (type(operand_b) == "number") then
return vector(
operand_a.x / operand_b,
operand_a.y / operand_b,
operand_a.z / operand_b
)
end
return vector(
operand_a.x / operand_b.x,
operand_a.y / operand_b.y,
operand_a.z / operand_b.z
)
end
--- Raised a vector to the power of another vector.
function vector_mt.__pow(operand_a, operand_b)
if (type(operand_a) == "number") then
return vector(
math.pow(operand_a, operand_b.x),
math.pow(operand_a, operand_b.y),
math.pow(operand_a, operand_b.z)
)
end
if (type(operand_b) == "number") then
return vector(
math.pow(operand_a.x, operand_b),
math.pow(operand_a.y, operand_b),
math.pow(operand_a.z, operand_b)
)
end
return vector(
math.pow(operand_a.x, operand_b.x),
math.pow(operand_a.y, operand_b.y),
math.pow(operand_a.z, operand_b.z)
)
end
--- Performs a modulo operation on a vector with another vector.
function vector_mt.__mod(operand_a, operand_b)
if (type(operand_a) == "number") then
return vector(
operand_a % operand_b.x,
operand_a % operand_b.y,
operand_a % operand_b.z
)
end
if (type(operand_b) == "number") then
return vector(
operand_a.x % operand_b,
operand_a.y % operand_b,
operand_a.z % operand_b
)
end
return vector(
operand_a.x % operand_b.x,
operand_a.y % operand_b.y,
operand_a.z % operand_b.z
)
end
--- Perform a unary minus operation on the vector.
function vector_mt.__unm(operand_a)
return vector(
-operand_a.x,
-operand_a.y,
-operand_a.z
)
end
--- Returns the vector's 2 dimensional length squared.
--- @return number
function vector_c:length2_squared()
return (self.x * self.x) + (self.y * self.y);
end
--- Return's the vector's 2 dimensional length.
--- @return number
function vector_c:length2()
return math.sqrt(self:length2_squared())
end
--- Returns the vector's 3 dimensional length squared.
--- @return number
function vector_c:length_squared()
return (self.x * self.x) + (self.y * self.y) + (self.z * self.z);
end
--- Return's the vector's 3 dimensional length.
--- @return number
function vector_c:length()
return math.sqrt(self:length_squared())
end
--- Returns the vector's dot product.
--- @param b vector_c
--- @return number
function vector_c:dot_product(b)
return (self.x * b.x) + (self.y * b.y) + (self.z * b.z)
end
--- Returns the vector's cross product.
--- @param b vector_c
--- @return vector_c
function vector_c:cross_product(b)
return vector(
(self.y * b.z) - (self.z * b.y),
(self.z * b.x) - (self.x * b.z),
(self.x * b.y) - (self.y * b.x)
)
end
--- Returns the 2 dimensional distance between the vector and another vector.
--- @param destination vector_c
--- @return number
function vector_c:distance2(destination)
return (destination - self):length2()
end
--- Returns the 3 dimensional distance between the vector and another vector.
--- @param destination vector_c
--- @return number
function vector_c:distance(destination)
return (destination - self):length()
end
--- Returns the distance on the X axis between the vector and another vector.
--- @param destination vector_c
--- @return number
function vector_c:distance_x(destination)
return math.abs(self.x - destination.x)
end
--- Returns the distance on the Y axis between the vector and another vector.
--- @param destination vector_c
--- @return number
function vector_c:distance_y(destination)
return math.abs(self.y - destination.y)
end
--- Returns the distance on the Z axis between the vector and another vector.
--- @param destination vector_c
--- @return number
function vector_c:distance_z(destination)
return math.abs(self.z - destination.z)
end
--- Returns true if the vector is within the given distance to another vector.
--- @param destination vector_c
--- @param distance number
--- @return boolean
function vector_c:in_range(destination, distance)
return self:distance(destination) <= distance
end
--- Clamps the vector's coordinates to whole numbers. Equivalent to "vector:round" with no precision.
--- @return void
function vector_c:round_zero()
self.x = math.floor(self.x + 0.5)
self.y = math.floor(self.y + 0.5)
self.z = math.floor(self.z + 0.5)
end
--- Round the vector's coordinates.
--- @param precision number
--- @return void
function vector_c:round(precision)
self.x = math.round(self.x, precision)
self.y = math.round(self.y, precision)
self.z = math.round(self.z, precision)
end
--- Clamps the vector's coordinates to the nearest base.
--- @param base number
--- @return void
function vector_c:round_base(base)
self.x = base * math.round(self.x / base)
self.y = base * math.round(self.y / base)
self.z = base * math.round(self.z / base)
end
--- Clamps the vector's coordinates to whole numbers. Equivalent to "vector:round" with no precision.
--- @return vector_c
function vector_c:rounded_zero()
return vector(
math.floor(self.x + 0.5),
math.floor(self.y + 0.5),
math.floor(self.z + 0.5)
)
end
--- Round the vector's coordinates.
--- @param precision number
--- @return vector_c
function vector_c:rounded(precision)
return vector(
math.round(self.x, precision),
math.round(self.y, precision),
math.round(self.z, precision)
)
end
--- Clamps the vector's coordinates to the nearest base.
--- @param base number
--- @return vector_c
function vector_c:rounded_base(base)
return vector(
base * math.round(self.x / base),
base * math.round(self.y / base),
base * math.round(self.z / base)
)
end
--- Normalize the vector.
--- @return void
function vector_c:normalize()
local length = self:length()
-- Prevent possible divide-by-zero errors.
if (length ~= 0) then
self.x = self.x / length
self.y = self.y / length
self.z = self.z / length
else
self.x = 0
self.y = 0
self.z = 1
end
end
--- Returns the normalized length of a vector.
--- @return number
function vector_c:normalized_length()
return self:length()
end
--- Returns a copy of the vector, normalized.
--- @return vector_c
function vector_c:normalized()
local length = self:length()
if (length ~= 0) then
return vector(
self.x / length,
self.y / length,
self.z / length
)
else
return vector(0, 0, 1)
end
end
--- Returns a new 2 dimensional vector of the original vector when mapped to the screen, or nil if the vector is off-screen.
--- @return vector_c
function vector_c:to_screen(only_within_screen_boundary)
local x, y = renderer.world_to_screen(self.x, self.y, self.z)
if (x == nil or y == nil) then
return nil
end
if (only_within_screen_boundary == true) then
local screen_x, screen_y = client.screen_size()
if (x < 0 or x > screen_x or y < 0 or y > screen_y) then
return nil
end
end
return vector(x, y)
end
--- Returns the magnitude of the vector, use this to determine the speed of the vector if it's a velocity vector.
--- @return number
function vector_c:magnitude()
return math.sqrt(
math.pow(self.x, 2) +
math.pow(self.y, 2) +
math.pow(self.z, 2)
)
end
--- Returns the angle of the vector in regards to another vector.
--- @param destination vector_c
--- @return angle_c
function vector_c:angle_to(destination)
-- Calculate the delta of vectors.
local delta_vector = vector(destination.x - self.x, destination.y - self.y, destination.z - self.z)
-- Calculate the yaw.
local yaw = math.deg(math.atan2(delta_vector.y, delta_vector.x))
-- Calculate the pitch.
local hyp = math.sqrt(delta_vector.x * delta_vector.x + delta_vector.y * delta_vector.y)
local pitch = math.deg(math.atan2(-delta_vector.z, hyp))
return angle(pitch, yaw)
end
--- Lerp to another vector.
--- @param destination vector_c
--- @param percentage number
--- @return vector_c
function vector_c:lerp(destination, percentage)
return self + (destination - self) * percentage
end
--- Internally divide a ray.
--- @param source vector_c
--- @param destination vector_c
--- @param m number
--- @param n number
--- @return vector_c
local function vector_internal_division(source, destination, m, n)
return vector((source.x * n + destination.x * m) / (m + n),
(source.y * n + destination.y * m) / (m + n),
(source.z * n + destination.z * m) / (m + n))
end
--- Returns the result of client.trace_line between two vectors.
--- @param destination vector_c
--- @param skip_entindex number
--- @return number, number|nil
function vector_c:trace_line_to(destination, skip_entindex)
skip_entindex = skip_entindex or -1
return client.trace_line(
skip_entindex,
self.x,
self.y,
self.z,
destination.x,
destination.y,
destination.z
)
end
--- Trace line to another vector and returns the fraction, entity, and the impact point.
--- @param destination vector_c
--- @param skip_entindex number
--- @return number, number, vector_c
function vector_c:trace_line_impact(destination, skip_entindex)
skip_entindex = skip_entindex or -1
local fraction, eid = client.trace_line(skip_entindex, self.x, self.y, self.z, destination.x, destination.y, destination.z)
local impact = self:lerp(destination, fraction)
return fraction, eid, impact
end
--- Trace line to another vector, skipping any entity indices returned by the callback and returns the fraction, entity, and the impact point.
--- @param destination vector_c
--- @param callback fun(eid: number): boolean
--- @param max_traces number
--- @return number, number, vector_c
function vector_c:trace_line_skip_indices(destination, max_traces, callback)
max_traces = max_traces or 10
local fraction, eid = 0, -1
local impact = self
local i = 0
while (max_traces >= i and fraction < 1 and ((eid > -1 and callback(eid)) or impact == self)) do
fraction, eid, impact = impact:trace_line_impact(destination, eid)
i = i + 1
end
return self:distance(impact) / self:distance(destination), eid, impact
end
--- Traces a line from source to destination and returns the fraction, entity, and the impact point.
--- @param destination vector_c
--- @param skip_classes table
--- @param skip_distance number
--- @return number, number
function vector_c:trace_line_skip_class(destination, skip_classes, skip_distance)
local should_skip = function(index, skip_entity)
local class_name = entity.get_classname(index) or ""
for i in 1, #skip_entity do
if class_name == skip_entity[i] then
return true
end
end
return false
end
local angles = self:angle_to(destination)
local direction = angles:to_forward_vector()
local last_traced_position = self
while true do -- Start tracing.
local fraction, hit_entity = last_traced_position:trace_line_to(destination)
if fraction == 1 and hit_entity == -1 then -- If we didn't hit anything.
return 1, -1 -- return nothing.
else -- BOIS WE HIT SOMETHING.
if should_skip(hit_entity, skip_classes) then -- If entity should be skipped.
-- Set last traced position according to fraction.
last_traced_position = vector_internal_division(self, destination, fraction, 1 - fraction)
-- Add a little gap per each trace to prevent inf loop caused by intersection.
last_traced_position = last_traced_position + direction * skip_distance
else -- That's the one I want.
return fraction, hit_entity, self:lerp(destination, fraction)
end
end
end
end
--- Returns the result of client.trace_bullet between two vectors.
--- @param eid number
--- @param destination vector_c
--- @return number|nil, number
function vector_c:trace_bullet_to(destination, eid)
return client.trace_bullet(
eid,
self.x,
self.y,
self.z,
destination.x,
destination.y,
destination.z
)
end
--- Returns the vector of the closest point along a ray.
--- @param ray_start vector_c
--- @param ray_end vector_c
--- @return vector_c
function vector_c:closest_ray_point(ray_start, ray_end)
local to = self - ray_start
local direction = ray_end - ray_start
local length = direction:length()
direction:normalize()
local ray_along = to:dot_product(direction)
if (ray_along < 0) then
return ray_start
elseif (ray_along > length) then
return ray_end
end
return ray_start + direction * ray_along
end
--- Returns a point along a ray after dividing it.
--- @param ray_end vector_c
--- @param ratio number
--- @return vector_c
function vector_c:ray_divided(ray_end, ratio)
return (self * ratio + ray_end) / (1 + ratio)
end
--- Returns a ray divided into a number of segments.
--- @param ray_end vector_c
--- @param segments number
--- @return table<number, vector_c>
function vector_c:ray_segmented(ray_end, segments)
local points = {}
for i = 0, segments do
points[i] = vector_internal_division(self, ray_end, i, segments - i)
end
return points
end
--- Returns the best source vector and destination vector to draw a line on-screen using world-to-screen.
--- @param ray_end vector_c
--- @param total_segments number
--- @return vector_c|nil, vector_c|nil
function vector_c:ray(ray_end, total_segments)
total_segments = total_segments or 128
local segments = {}
local step = self:distance(ray_end) / total_segments
local angle = self:angle_to(ray_end)
local direction = angle:to_forward_vector()
for i = 1, total_segments do
table.insert(segments, self + (direction * (step * i)))
end
local src_screen_position = vector(0, 0, 0)
local dst_screen_position = vector(0, 0, 0)
local src_in_screen = false
local dst_in_screen = false
for i = 1, #segments do
src_screen_position = segments[i]:to_screen()
if src_screen_position ~= nil then
src_in_screen = true
break
end
end
for i = #segments, 1, -1 do
dst_screen_position = segments[i]:to_screen()
if dst_screen_position ~= nil then
dst_in_screen = true
break
end
end
if src_in_screen and dst_in_screen then
return src_screen_position, dst_screen_position
end
return nil
end
--- Returns true if the ray goes through a smoke. False if not.
--- @param ray_end vector_c
--- @return boolean
function vector_c:ray_intersects_smoke(ray_end)
if (line_goes_through_smoke == nil) then
error("Unsafe scripts must be allowed in order to use vector_c:ray_intersects_smoke")
end
return line_goes_through_smoke(self.x, self.y, self.z, ray_end.x, ray_end.y, ray_end.z, 1)
end
--- Returns true if the vector lies within the boundaries of a given 2D polygon. The polygon is a table of vectors. The Z axis is ignored.
--- @param polygon table<any, vector_c>
--- @return boolean
function vector_c:inside_polygon2(polygon)
local odd_nodes = false
local polygon_vertices = #polygon
local j = polygon_vertices
for i = 1, polygon_vertices do
if (polygon[i].y < self.y and polygon[j].y >= self.y or polygon[j].y < self.y and polygon[i].y >= self.y) then
if (polygon[i].x + (self.y - polygon[i].y) / (polygon[j].y - polygon[i].y) * (polygon[j].x - polygon[i].x) < self.x) then
odd_nodes = not odd_nodes
end
end
j = i
end
return odd_nodes
end
local resolver_c = {}
local resolver_mt = {
__index = resolver_c
}
local x = 0
function resolver_c.setup()
return setmetatable( {
miss_reason = {},
entity_data = {},
animstate_data = {},
animlayer_data = {},
freestand_data = {},
misses = 0,
hit = 0,
shots = 0,
}, resolver_mt )
end
function resolver_c:reset()
self.miss_reason = {}
self.entity_data = {}
self.animstate_data = {}
self.animlayer_data = {}
self.freestand_data = {}
end
function resolver_c:GetAnimationState(_Entity)
if not (_Entity) then
return
end
local player_ptr = ffi.cast( "void***", get_client_entity(ientitylist, _Entity))
local animstate_ptr = ffi.cast( "char*" , player_ptr ) + 0x3914
local state = ffi.cast( "struct c_animstate**", animstate_ptr )[0]
return state
end
function GetAnimationState1(_Entity)
if not (_Entity) then
return
end
local player_ptr = ffi.cast( "void***", get_client_entity(ientitylist, _Entity))
local animstate_ptr = ffi.cast( "char*" , player_ptr ) + 0x3914
local state = ffi.cast( "struct c_animstate**", animstate_ptr )[0]
return state
end
function GetPlayerMaxFeetYaw1(_Entity)
local S_animationState_t = GetAnimationState1(_Entity)
local nDuckAmount = S_animationState_t.m_fDuckAmount
local nFeetSpeedForwardsOrSideWays = math.max(0, math.min(1, S_animationState_t.m_flFeetSpeedForwardsOrSideWays))
local nFeetSpeedUnknownForwardOrSideways = math.max(1, S_animationState_t.m_flFeetSpeedUnknownForwardOrSideways)
local nValue =
(S_animationState_t.m_flStopToFullRunningFraction * -0.30000001 - 0.19999999) * nFeetSpeedForwardsOrSideWays +
1
if nDuckAmount > 0 then
nValue = nValue + nDuckAmount * nFeetSpeedUnknownForwardOrSideways * (0.5 - nValue)
end
local nDeltaYaw = S_animationState_t.m_flMaxYaw * nValue
return nDeltaYaw < 60 and nDeltaYaw >= 0 and nDeltaYaw or 0
end
function resolver_c:GetPlayerMaxFeetYaw(_Entity)
local S_animationState_t = self:GetAnimationState(_Entity)
local nDuckAmount = S_animationState_t.m_fDuckAmount
local nFeetSpeedForwardsOrSideWays = math.max(0, math.min(1, S_animationState_t.m_flFeetSpeedForwardsOrSideWays))
local nFeetSpeedUnknownForwardOrSideways = math.max(1, S_animationState_t.m_flFeetSpeedUnknownForwardOrSideways)
local nValue =
(S_animationState_t.m_flStopToFullRunningFraction * -0.30000001 - 0.19999999) * nFeetSpeedForwardsOrSideWays +
1
if nDuckAmount > 0 then
nValue = nValue + nDuckAmount * nFeetSpeedUnknownForwardOrSideways * (0.5 - nValue)
end
local nDeltaYaw = S_animationState_t.m_flMaxYaw * nValue
return nDeltaYaw < 60 and nDeltaYaw >= 0 and nDeltaYaw or 0
end
function resolver_c:on_miss(handle)
local hitgroup_names = {
"generic",
"head",
"chest",
"stomach",
"left arm",
"right arm",
"left leg",
"right leg",
"neck",
"gear",
}--hitgroup_names[e.hitgroup + 1] or "?"
if handle.reason ~= "?" then
return
end
self.misses = self.misses + 1
if not self.entity_data[handle.target] then
self.entity_data[handle.target] = {}
end
if not self.miss_reason[handle.target] then
self.miss_reason[handle.target] = {}
end
local miss_count = self.entity_data[handle.target].miss or 0
self.entity_data[handle.target].miss = miss_count + 1
local miss_data = handle
local ent_name = entity.get_player_name(handle.target)
miss_data.name = ent_name
local yaw = (entity.get_prop(handle.target, "m_flPoseParameter", 11) or 0) * 116 - 58
local should_fix = self.entity_data[handle.target].miss > 2 and self.entity_data[handle.target].miss < 5
self.miss_reason[handle.target].count = self.entity_data[handle.target].miss
self.miss_reason[handle.target].reason = self.entity_data[handle.target].miss > 2 and (string.format("lowdelta: %s", yaw) or "?") or "?"
local fix_value = 26*(self.entity_data[handle.target].miss % 2 == 0 and -1 or 1)
end
function resolver_c:on_hit(handle)
self.hit = self.hit + 1
end
function resolver_c:on_fire(handle)
self.shots = self.shots + 1
end
bruteforce_phases = {
-- Standing players
standing = {
[1] = -50,
[2] = 50,
[3] = 30,
[4] = 0
},
moving = {
[1] = 48,
[2] = -48,
[3] = -29,
[4] = 0
},
slowwalk = {
[1] = 48,
[2] = 30,
[3] = -15,
[4] = 0
},
pressing_e = {
[1] = 50,
[2] = -48,
[3] = 48,
[4] = 0,
},
onshot = {
[1] = 60,
[2] = -60,
[3] = 0,
},
}
--standing
if standing then
fix_value = bruteforce_phases.standing[calculate_phase]*calculate_invert*calculate_angles
state = "standing"
end
--moving
if moving then
fix_value = bruteforce_phases.moving[calculate_phase]*calculate_invert*calculate_angles
state = "moving"
end
--slowwalk
if slowwalk then
fix_value = bruteforce_phases.slowwalk[calculate_phase]
state = "slowwalk"
end
--in air
if air then
fix_value = bruteforce_phases.air[calculate_phase]*calculate_invert*calculate_angles
state = "in air"
end
--e peek
if pressing_e then
fix_value = bruteforce_phases.pressing_e[calculate_phase]*calculate_invert*calculate_angles
state = "e"
end
--e peek
if onshot then
fix_value = bruteforce_phases.onshot[calculate_phase]*calculate_invert*calculate_angles
state = "fired"
end
--forward
if sideways_forward then
fix_value = (max_yaw/2 + (max_yaw/4))*calculate_invert*calculate_angles*(-2)
state = "forward"
end
--sideways
if sideways_left_right then
fix_value = (max_yaw/2 - 4)*calculate_invert*calculate_angles
state = "left/right"
end
-- end resolver
if menu.get_bool("Custom Teleport") then
teleport()
end
if menu.get_bool("Clan Tag") then
clan_tag()
end
client.add_callback("create_move", function()
bebra()
end)
console.execute("clear")
--menu
menu.add_slider_int("Shime.lua",0,0)
menu.add_slider_int("=====Rage=====",0,0)
menu.add_check_box("Resolver")
menu.add_slider_int("======AA======",0,0)
menu.add_check_box("Pitch zero on land")
menu.add_check_box("Random yaw modifier")
menu.add_combo_box("Anti-Aim Types:",{"None", "Desync *****","Center jitter on move"})
menu.add_slider_int( "Desync range min", 1, 60)
menu.add_slider_int( "Desync range max", 1, 60)
menu.add_slider_int( "Custom Slow-Walk Speed", 1, 120)
menu.add_key_bind("Custom Slow-Walk")
menu.add_check_box("Anti backstab")
menu.add_slider_int("====Visuals===",0,0)
menu.add_check_box("Indicators")
local font = render.create_font("Verdana", 12, 500, false, true, false)
menu.add_check_box("Enable keybind list")
menu.add_slider_int("Key binds position X", 0, engine.get_screen_width())
menu.add_slider_int("Key binds position Y", 0, engine.get_screen_height())
local font = render.create_font("Verdana", 12, 500, false, true, false)
menu.add_check_box("Watermark")
menu.add_slider_int("=====Misc=====",0,0)
menu.add_check_box("Custom Teleport")
menu.add_check_box("Moving Teleport")
menu.add_check_box("Moving Lag Exploit")
menu.add_check_box("Standing Teleport")
menu.add_check_box("Standing Lag Exploit")
menu.add_slider_int("Clantag speed", 1, 10)
menu.add_combo_box("Clantags", {"None", "Shime.lua", "onetap.su", "onetap", "fatality", "evolve", "gamesense", "NeverLose", "rifk7"})
-- functions
local types = {"always", "holding", "toggled"}
local get_state, get_mode = menu.get_key_bind_state, menu.get_key_bind_mode
local screen_x, screen_y = engine.get_screen_width(), engine.get_screen_height()
local count = 0
local function add_bind(name, bind_name, x, y)
if get_state(bind_name) then
render.draw_text(font, x, y + 22 + (15 * count), color.new(255, 255, 255), name)
text_width = render.get_text_width(font, "[" .. types[get_mode(bind_name) + 1] .. "]")
render.draw_text(font, x + 151 - text_width - 5, y + 23 + (15 * count), color.new(255, 255, 255), "[" .. types[get_mode(bind_name) + 1] .. "]")
count = count + 1
end
end
local function on_paint()
if not menu.get_bool("Enable keybind list") then
return
end
if not engine.is_in_game() then
return
end
local pos_x = menu.get_int("Key binds position X")
local pos_y = menu.get_int("Key binds position Y")
render.draw_rect_filled(pos_x, pos_y - 3, 150, 2, color.new(125, 125, 255))
render.draw_rect_filled(pos_x, pos_y - 1, 150, 18, color.new(20, 20, 20, 100))
render.draw_text(font, pos_x + 55, pos_y + 2, color.new(255, 255, 255), "keybinds")
count = 0
add_bind(" Hide shots", "rage.hide_shots_key", pos_x + 1, pos_y - 2)
add_bind(" Edge jump", "misc.edge_jump_key", pos_x + 1, pos_y - 2)
add_bind(" Double tap", "rage.double_tap_key", pos_x + 1, pos_y - 2)
add_bind(" Slow walk", "misc.slow_walk_key", pos_x + 1, pos_y - 2)
add_bind(" Force damage", "rage.force_damage_key", pos_x + 1, pos_y - 2)
add_bind(" Invert desync", "anti_aim.invert_desync_key", pos_x + 1, pos_y - 2)
add_bind(" Fake duck", "anti_aim.fake_duck_key", pos_x + 1, pos_y - 2)
add_bind(" Automatic peek", "misc.automatic_peek_key", pos_x + 1, pos_y - 2)
add_bind(" Third person", "misc.third_person_key", pos_x + 1, pos_y - 2)
end
client.add_callback("on_paint", on_paint)
client.add_callback("on_paint", function()
if menu.get_bool("Watermark") then
local screen_width = engine.get_screen_width()
local username = globals.get_username()
local ping = tostring(globals.get_ping())
local tickrate = math.floor(1.0 / globals.get_intervalpertick())
local get_time = os.date("%X", os.time())
--
local text
if engine.is_connected() then
text = tostring(" shime.lua | " .. username .. " | delay: " .. ping .. "ms | " .. tickrate .. "tick | "..get_time.. " ")
else
text = tostring(" shime.lua | " .. username .. " | " ..get_time.. " ")
end
--
local width = render.get_text_width(font, text)
--
local line_color = color.new(125, 125, 255)
local text_color = color.new(255, 255, 255)
local bg_color = color.new(20, 20, 20, 100)
--
local x = screen_width - 10 - width - 4
local y = 10
local w = width + 5
--
render.draw_rect_filled(x, y - 1, w, 2, line_color)
render.draw_rect_filled(x, y + 1, w, 18, bg_color)
--render.draw_rect_filled(x + w - 100, y + 23, 100, 18, bg_color)
render.draw_text(font, x + 2.5, y + 3, text_color, text)
end
end)
local smallfont = render.create_font("Calibri", 15, 100, true, false, false)
local screen_width = engine.get_screen_width()
local screen_height = engine.get_screen_height()
local x, y= engine.get_screen_width()/2,engine.get_screen_height()/2
local add=0
client.add_callback("on_paint", function()
if not engine.is_in_game() then
return
end
if menu.get_bool("Indicators") then
local realtime_fade = math.floor(math.sin(globals.get_realtime() * 2) * 127 + 128)
render.draw_text(smallfont, engine.get_screen_width()/2+2, engine.get_screen_height()/2 +5,color.new(250, 137, 50),"Shime.Lua")
render.draw_text(smallfont, engine.get_screen_width()/2+2, engine.get_screen_height()/2 +15,color.new(166, 130, 250),"DYNAMIC")
if menu.get_key_bind_state("rage.hide_shots_key" ) and add==1 then
render.draw_text(smallfont, engine.get_screen_width()/2+2, engine.get_screen_height()/2 +35,color.new(93, 146, 252, realtime_fade),"HIDE")
elseif menu.get_key_bind_state("rage.hide_shots_key" ) and add==0 then
render.draw_text(smallfont, engine.get_screen_width()/2+2, engine.get_screen_height()/2 +25,color.new(93, 146, 252, realtime_fade),"HIDE")
end
if menu.get_key_bind_state("rage.double_tap_key" ) and menu.get_key_bind_state("anti_aim.fake_duck_key") then
render.draw_text(smallfont, engine.get_screen_width()/2+2, engine.get_screen_height()/2 +25,color.new(255, 0, 0, realtime_fade),"DT(fakeduck)")
elseif menu.get_key_bind_state("rage.double_tap_key" ) then
render.draw_text(smallfont, engine.get_screen_width()/2+2, engine.get_screen_height()/2 +25,color.new(59, 255, 75, realtime_fade),"DT")
add=1
else add=0
end
end
end)
local cpfont = render.create_font("Verdana", 15, 4, true, true, false)
local cpfont2 = render.create_font("Verdana", 12, 2, true, false, false)
local sw, sh = engine.get_screen_width(), engine.get_screen_height()
local ffi = require "ffi"
ffi.cdef[[
typedef int(__fastcall* clantag_t)(const char*, const char*);
]]
local fn_change_clantag = utils.find_signature("engine.dll", "53 56 57 8B DA 8B F9 FF 15")
local set_clantag = ffi.cast("clantag_t", fn_change_clantag)
function round(num, numDecimalPlaces)
local mult = 10^(numDecimalPlaces or 0)
return math.floor(num * mult + 0.5) / mult
end
local clean = {
" ",
}
local animation = {
"Shime.lua",
"Shime.lu",
"Shime.l",
"Shime.",
"Shime",
"Shim",
"Shi",
"Sh",
"S",
" ",
"S",
"Sh",
"Shi",
"Shim",
"Shime",
"Shime.",
"Shime.l",
"Shime.lu",
"Shime.lua",
}
local otsu = {
"onetap.su",
"nepat.su o",
"epat.su on",
"pat.su one",
"ap.su onet",
"t.su oneta",
".su onetap",
"su onetap.",
"u onetap.s",
"onetap.su",
}
local onetap = {
"onetap",
}
local fatality = {
" ",
"f",
"fa",
"fat",
"fata",
"fatal",
"fatali",
"fatality",
"fatality",
"fatality",
"fatality",
"fatality",
"atality",
"tality",
"ality",
"lity",
"ity",
"ty",
"y",
" ",
}
local evolve = {
"ev0lve.xyz",
"ev0lve.xyz",
"ev0lve.xyz",
"ev0lve.xyz",
"ev0lve.xyz",
"v0lve.xyz",
"0lve.xyz",
"lve.xyz",
"ve.xyz",
"e.xyz",
".xyz",
"xyz",
"yz",
"z",
"",
"e",
"ev",
"ev0",
"ev0l",
"ev0lv",
"ev0lve",
"ev0lve.",
"ev0lve.x",
"ev0lve.xyz",
}
local gamesense = {
"gamesense",
"amesense",
"mesense",
"esense",
"sense",
"ense",
"nse",
"se",
"e",
" ",
"ga",
"gam",
"game",
"games",
"gamese",
"gamesen",
"gamesens",
"gamesense",
"gamesense ",
"gamesense ",
"gamesense ",
"gamesense ",
"gamesense ",
"gamesense ",
"gamesense ",
"gamesense ",
"gamesense ",
"gamesense ",
"gamesense ",
"gamesense ",
"gamesense ",
"gamesense ",
"gamesense ",
}
local interwebz = {
" ",
" | ",
" |\\ ",
" |\\| ",
" N ",
" N3 ",
" Ne ",
" Ne\\ ",
" Ne\\/ ",
" Nev ",
" Nev3 ",
" Neve ",
" Neve| ",
" Neve|2 ",
" Never|_ ",
" Neverl ",
" Neverl0 ",
" Neverlo ",
" Neverlo5 ",
" Neverlos ",
" Neverlos3 ",
" Neverlose ",
" Neverlose. ",
" Neverlose.< ",
" Neverlose.c< ",
" Neverlose.cc ",
" Neverlose.cc ",
" Neverlose.c< ",
" Neverlose.< ",
" Neverlose. ",
" Neverlose ",
" Neverlos3 ",
" Neverlos ",
" Neverlo5 ",
" Neverlo ",
" Neverl0 ",
" Neverl ",
" Never|_ ",
" Never|2 ",
" Neve|2 ",
" Neve| ",
" Neve ",
" Nev3 ",
" Nev ",
" Ne\\/ ",
" Ne ",
" N3 ",
" N ",
" |\\| ",
" |\\ ",
" |\\| ",
" |\\ ",
" | ",
" ",
}
local rifk7 = {
"(Яifk7)",
}
local old_time = 0
client.add_callback("on_paint", function()
if menu.get_int("Clantags") == 0 then
local curtime = math.floor(globals.get_curtime()*5)
if old_time ~= curtime then
set_clantag(clean[curtime % #clean+1], clean[curtime % #clean+1])
end
old_time = curtime
elseif menu.get_int("Clantags") == 1 then
local curtime = math.floor(globals.get_curtime()*menu.get_int("Clantag speed"))
if old_time ~= curtime then
set_clantag(animation[curtime % #animation+1], animation[curtime % #animation+1])
end
old_time = curtime
elseif menu.get_int("Clantags") == 2 then
local curtime = math.floor(globals.get_curtime()*menu.get_int("Clantag speed"))
if old_time ~= curtime then
set_clantag(otsu[curtime % #otsu+1], otsu[curtime % #otsu+1])
end
old_time = curtime
elseif menu.get_int("Clantags") == 3 then
local curtime = math.floor(globals.get_curtime()*menu.get_int("Clantag speed"))
if old_time ~= curtime then
set_clantag(onetap[curtime % #onetap+1], onetap[curtime % #onetap+1])
end
old_time = curtime
elseif menu.get_int("Clantags") == 4 then
local curtime = math.floor(globals.get_curtime()*menu.get_int("Clantag speed"))
if old_time ~= curtime then
set_clantag(fatality[curtime % #fatality+1], fatality[curtime % #fatality+1])
end
old_time = curtime
elseif menu.get_int("Clantags") == 5 then
local curtime = math.floor(globals.get_curtime()*menu.get_int("Clantag speed"))
if old_time ~= curtime then
set_clantag(evolve[curtime % #evolve+1], evolve[curtime % #evolve+1])
end
old_time = curtime
elseif menu.get_int("Clantags") == 6 then
local curtime = math.floor(globals.get_curtime()*menu.get_int("Clantag speed"))
if old_time ~= curtime then
set_clantag(gamesense[curtime % #gamesense+1], gamesense[curtime % #gamesense+1])
end
old_time = curtime
elseif menu.get_int("Clantags") == 7 then
local curtime = math.floor(globals.get_curtime()*menu.get_int("Clantag speed"))
if old_time ~= curtime then
set_clantag(interwebz[curtime % #interwebz+1], interwebz[curtime % #interwebz+1])
end
old_time = curtime
elseif menu.get_int("Clantags") == 8 then
local curtime = math.floor(globals.get_curtime()*menu.get_int("Clantag speed"))
if old_time ~= curtime then
set_clantag(rifk7[curtime % #rifk7+1], rifk7[curtime % #rifk7+1])
end
old_time = curtime
end
end)
local bit = require("bit")
local function a(cmd)
if not menu.get_key_bind_state("Custom Slow-Walk") then
return
end
if not entitylist.get_local_player() then
return
end
Forward_Flag = bit.band(cmd.buttons, 8) == 8
Back_Flag = bit.band(cmd.buttons, 16) == 16
Left_Flag = bit.band(cmd.buttons, 512) == 512
Right_Flag = bit.band(cmd.buttons, 1024) == 1024
Movement_Straight = 0
Movement_Side = 0
if Forward_Flag then
Movement_Straight = Movement_Straight + menu.get_int("Custom Slow-Walk Speed")
end
if Back_Flag then
Movement_Straight = Movement_Straight - menu.get_int("Custom Slow-Walk Speed")
end
if Left_Flag then
Movement_Side = Movement_Side - menu.get_int("Custom Slow-Walk Speed")
end
if Right_Flag then
Movement_Side = Movement_Side + menu.get_int("Custom Slow-Walk Speed")
end
cmd.forwardmove = Movement_Straight
cmd.sidemove = Movement_Side
--if()
--cmd.forwardmove = 300
--cmd.sidemove = 300
--client.log(tostring(cmd.forwardmove))
--client.log(tostring(cmd.sidemove))
return
end
client.add_callback("create_move",a)
local function calculateAngle(src, point)
local angles = vector.new(0, 0, 0)
local delta = vector.new(src.x - point.x, src.y - point.y, src.z - point.z)
local hyp = delta:length_2d()
angles.y = math.atan(delta.y / delta.x) * math.pi
angles.x = math.atan(-delta.z / hyp) * -math.pi
angles.z = 0.0
angles.y = angles.y + 180.0
return angles
end
function normalize_yaw(y)
while y > 180 do
y = y - 360
end
while y < -180 do
y = y + 360
end
return y
end
function get_eye_position(player, cmd)
local origin = player:get_origin()
return vector.new(origin.x + cmd.viewangles.x, origin.y + cmd.viewangles.y, origin.z + cmd.viewangles.z)
end
function isKnife(weap)
local idx = weap:get_prop_int("CBaseCombatWeapon", "m_iItemDefinitionIndex")
if idx == 42 or idx == 500 or idx == 515 or idx == 512 or idx == 505 or idx == 506 or idx == 507 or idx == 508 or idx == 516 or idx == 514 or idx == 59 or idx == 509 or idx == 41 or idx == 80 or idx == 520 or idx == 522 or idx == 519 or idx == 523 or idx == 503 or idx == 518 or idx == 517 or idx == 521 or idx == 525 then
return true
end
return false
end
local backup = {
did = false,
yaw = 0,
pitch = 0,
target = 0
}
function antiBackstab(cmd)
local localplayer = entitylist.get_local_player()
if not localplayer then return end
if menu.get_bool("Anti backstab") == false then return end
local lorigin = localplayer:get_origin()
local found_data = {
found = false,
best_dist = 0,
player = nil
}
for i = 0,globals.get_maxclients() do
local ent = entitylist.get_player_by_index(i)
if ent and ent:is_player() then
local player = entitylist.entity_to_player(ent)
if player:get_health() > 0 and player:get_team() ~= localplayer:get_team() then
local weap = entitylist.get_weapon_by_player(player)
if isKnife(weap) == true then
local origin = player:get_origin()
local dist = lorigin:dist_to(origin)
if dist < 400 and (dist < found_data.best_dist or found_data.found == false) then
found_data.found = true
found_data.best_dist = dist
found_data.player = player
end
end
end
end
end
if found_data.found == true then
if backup.did == false then
backup.did = true
backup.yaw = menu.get_int("anti_aim.yaw_offset")
backup.pitch = menu.get_int("anti_aim.pitch")
backup.target = menu.get_int("anti_aim.target_yaw")
end
local angs = calculateAngle(get_eye_position(localplayer, cmd), found_data.player:get_origin())
menu.set_int("anti_aim.yaw_offset", normalize_yaw(menu.get_int("anti_aim.yaw_offset") + math.floor(angs.y)))
menu.set_int("anti_aim.pitch", 0)
menu.set_int("anti_aim.target_yaw", 1)
elseif backup.did == true then
menu.set_int("anti_aim.yaw_offset", backup.yaw)
menu.set_int("anti_aim.pitch", backup.pitch)
menu.set_int("anti_aim.target_yaw", backup.target)
backup.did = false
end
end
client.add_callback("create_move", antiBackstab)
local function teleport()
local local_player = entitylist.get_local_player()
local velocity = local_player:get_velocity()
local speed = velocity:length_2d()
for C = 0,8 do
if speed >= 40 then
menu.set_bool("rage.weapon[".. C .."].extended_teleport", menu.get_bool("Moving Teleport"))
menu.set_bool("rage.weapon[".. C .."].lag_exploit", menu.get_bool("Moving Lag Exploit"))
elseif speed <= 39 then
menu.set_bool("rage.weapon[".. C .."].extended_teleport", menu.get_bool("Standing Teleport"))
menu.set_bool("rage.weapon[".. C .."].lag_exploit", menu.get_bool("Standing Lag Exploit"))
end
end
end
local old_pitch = menu.get_int("anti_aim.pitch")
local int = 0
function createmove_func(cmd)
if menu.get_bool("Pitch zero on land") == false then return end
if entitylist.get_local_player() == nil then return end
flag = entitylist.get_local_player():get_prop_int("CBasePlayer", "m_fFlags")
if flag == 256 or flag == 262 then
int = 0
end
if flag == 257 or flag == 261 or flag == 263 then
int = int + 4
end
if int > 45 and int < 250 then
menu.set_int("anti_aim.pitch", 0)
else
menu.set_int("anti_aim.pitch", old_pitch)
end
end
client.add_callback("create_move", createmove_func)
local function setJitter(a)
menu.set_int("anti_aim.desync_range", a)
menu.set_int("anti_aim.desync_range_inverted", a)
end
local function bebra(cmd)
local local_player = entitylist.get_local_player()
local velocity = local_player:get_velocity()
local speed = velocity:length_2d()
local getJittermin = menu.get_int("Desync range min")
local getJittermax = menu.get_int("Desync range max")
local tickcount = globals.get_tickcount() % 3
if menu.get_bool("Random yaw modifier", true) then
menu.set_int("anti_aim.yaw_modifier",math.random (1, 2))
else
menu.set_int("anti_aim.yaw_modifier", 1)
end
if menu.get_bool("Anti-Aim Types:") == 1 then
if tickcount == 2 then
setJitter(getJittermin)
else
setJitter(getJittermax)
end
elseif menu.get_int("Anti-Aim Types:") == 2 then
if (speed <= 90) then
menu.set_int("anti_aim.yaw_modifier_range", 1)
if tickcount == 2 then
setJitter(getJittermin)
else
setJitter(getJittermax)
end
else
menu.set_int("anti_aim.yaw_modifier_range", math.random( 10, 15))
menu.set_int("anti_aim.desync_range", math.random(50, 60))
menu.set_int("anti_aim.desync_range_inverted", math.random(45, 50))
menu.set_int("anti_aim.yaw_modifier_range",math.random (11, 15))
end
end
end
-- resolver start
local angles = {
[1] = -60,
[2] = 60,
[3] = -58,
[4] = 58,
[5] = -50,
[6] = 50,
[7] = -55,
[8] = 55,
[9] = 48,
[10] = -48,
[11] = 30,
[12] = -29,
[13] = 29,
[14] = -15,
[15] = 15,
[16] = 0
}
local bit_band = bit.band
local math_pi = math.pi
local math_min = math.min
local math_max = math.max
local math_deg = math.deg
local math_rad = math.rad
local math_sqrt = math.sqrt
local math_sin = math.sin
local math_cos = math.cos
local math_atan = math.atan
local math_atan2 = math.atan2
local math_acos = math.acos
local math_fmod = math.fmod
local math_ceil = math.ceil
local math_pow = math.pow
local math_abs = math.abs
local math_floor = math.floor
local last_angle = 0
local new_angle = 0
local last_angle = 0
local new_angle = 0
local switch1 = false
local switch2 = false
local i = 1
local username = globals.get_username()
local function resolve(shot_info)
local result = shot_info.result
local gpinf = engine.get_player_info
local target = shot_info.target_index
local target_name = gpinf(target).name
menu.set_bool("player_list.player_settings[" .. target.. "].force_body_yaw", true) -- we only want to bruteforce our target. not everyone
if last_angle == -new_angle and switch1 then
new_angle = -angles[i]
if switch2 == true then
switch1 = not switch1
end
else
if i < #angles then
i = i + 1
else
i = 1
end
new_angle = angles[i]
end
if last_angle == 0 then
last_angle = "RESOLVER"
end
if result == "Resolver" and menu.get_bool("Enable Resolver lua") then
print("[LEGENDWARE] missed player: " ..target_name .. ", at angle: " .. last_angle .. ", bruteforced to: " .. new_angle)
menu.set_int("player_list.player_settings["..target.."].body_yaw", new_angle)
end
if result == "Hit" and menu.get_bool("Enable Resolver lua") then
print("[LEGENDWARE] hit player " ..target_name.. ", at angle: " .. new_angle)
end
local function set_all_down()
local all = globals.get_maxclients()
if menu.get_bool("force all players down") then
for *****=1,48 do
menu.set_bool("player_list.player_settings[" ..*****.. "].force_pitch", true)
menu.set_int("player_list.player_settings[" ..*****.. "].pitch", 89)
end
end
end
client.add_callback("on_shot", resolve)
client.add_callback("on_paint", set_all_down)
if username == "User" then
console.execute("sv_lan 1")
else
end
end
--region math
function math.round(number, precision)
local mult = 10 ^ (precision or 0)
return math.floor(number * mult + 0.5) / mult
end
--endregion
--region angle
--- @class angle_c
--- @field public p number Angle pitch.
--- @field public y number Angle yaw.
--- @field public r number Angle roll.
local angle_c = {}
local angle_mt = {
__index = angle_c
}
--- Overwrite the angle's angles. Nil values leave the angle unchanged.
--- @param angle angle_c
--- @param p_new number
--- @param y_new number
--- @param r_new number
--- @return void
angle_mt.__call = function(angle, p_new, y_new, r_new)
p_new = p_new or angle.p
y_new = y_new or angle.y
r_new = r_new or angle.r
angle.p = p_new
angle.y = y_new
angle.r = r_new
end
--- Create a new angle object.
--- @param p number
--- @param y number
--- @param r number
--- @return angle_c
local function angle(p, y, r)
return setmetatable(
{
p = p or 0,
y = y or 0,
r = r or 0
},
angle_mt
)
end
--- Overwrite the angle's angles. Nil values leave the angle unchanged.
--- @param p number
--- @param y number
--- @param r number
--- @return void
function angle_c:set(p, y, r)
p = p or self.p
y = y or self.y
r = r or self.r
self.p = p
self.y = y
self.r = r
end
--- Offset the angle's angles. Nil values leave the angle unchanged.
--- @param p number
--- @param y number
--- @param r number
--- @return void
function angle_c:offset(p, y, r)
p = self.p + p or 0
y = self.y + y or 0
r = self.r + r or 0
self.p = self.p + p
self.y = self.y + y
self.r = self.r + r
end
--- Clone the angle object.
--- @return angle_c
function angle_c:clone()
return setmetatable(
{
p = self.p,
y = self.y,
r = self.r
},
angle_mt
)
end
--- Clone and offset the angle's angles. Nil values leave the angle unchanged.
--- @param p number
--- @param y number
--- @param r number
--- @return angle_c
function angle_c:clone_offset(p, y, r)
p = self.p + p or 0
y = self.y + y or 0
r = self.r + r or 0
return angle(
self.p + p,
self.y + y,
self.r + r
)
end
--- Clone the angle and optionally override its coordinates.
--- @param p number
--- @param y number
--- @param r number
--- @return angle_c
function angle_c:clone_set(p, y, r)
p = p or self.p
y = y or self.y
r = r or self.r
return angle(
p,
y,
r
)
end
--- Unpack the angle.
--- @return number, number, number
function angle_c:unpack()
return self.p, self.y, self.r
end
--- Set the angle's euler angles to 0.
--- @return void
function angle_c:nullify()
self.p = 0
self.y = 0
self.r = 0
end
--- Returns a string representation of the angle.
function angle_mt.__tostring(operand_a)
return string.format("%s, %s, %s", operand_a.p, operand_a.y, operand_a.r)
end
--- Concatenates the angle in a string.
function angle_mt.__concat(operand_a)
return string.format("%s, %s, %s", operand_a.p, operand_a.y, operand_a.r)
end
--- Adds the angle to another angle.
function angle_mt.__add(operand_a, operand_b)
if (type(operand_a) == "number") then
return angle(
operand_a + operand_b.p,
operand_a + operand_b.y,
operand_a + operand_b.r
)
end
if (type(operand_b) == "number") then
return angle(
operand_a.p + operand_b,
operand_a.y + operand_b,
operand_a.r + operand_b
)
end
return angle(
operand_a.p + operand_b.p,
operand_a.y + operand_b.y,
operand_a.r + operand_b.r
)
end
--- Subtracts the angle from another angle.
function angle_mt.__sub(operand_a, operand_b)
if (type(operand_a) == "number") then
return angle(
operand_a - operand_b.p,
operand_a - operand_b.y,
operand_a - operand_b.r
)
end
if (type(operand_b) == "number") then
return angle(
operand_a.p - operand_b,
operand_a.y - operand_b,
operand_a.r - operand_b
)
end
return angle(
operand_a.p - operand_b.p,
operand_a.y - operand_b.y,
operand_a.r - operand_b.r
)
end
--- Multiplies the angle with another angle.
function angle_mt.__mul(operand_a, operand_b)
if (type(operand_a) == "number") then
return angle(
operand_a * operand_b.p,
operand_a * operand_b.y,
operand_a * operand_b.r
)
end
if (type(operand_b) == "number") then
return angle(
operand_a.p * operand_b,
operand_a.y * operand_b,
operand_a.r * operand_b
)
end
return angle(
operand_a.p * operand_b.p,
operand_a.y * operand_b.y,
operand_a.r * operand_b.r
)
end
--- Divides the angle by the another angle.
function angle_mt.__div(operand_a, operand_b)
if (type(operand_a) == "number") then
return angle(
operand_a / operand_b.p,
operand_a / operand_b.y,
operand_a / operand_b.r
)
end
if (type(operand_b) == "number") then
return angle(
operand_a.p / operand_b,
operand_a.y / operand_b,
operand_a.r / operand_b
)
end
return angle(
operand_a.p / operand_b.p,
operand_a.y / operand_b.y,
operand_a.r / operand_b.r
)
end
--- Raises the angle to the power of an another angle.
function angle_mt.__pow(operand_a, operand_b)
if (type(operand_a) == "number") then
return angle(
math.pow(operand_a, operand_b.p),
math.pow(operand_a, operand_b.y),
math.pow(operand_a, operand_b.r)
)
end
if (type(operand_b) == "number") then
return angle(
math.pow(operand_a.p, operand_b),
math.pow(operand_a.y, operand_b),
math.pow(operand_a.r, operand_b)
)
end
return angle(
math.pow(operand_a.p, operand_b.p),
math.pow(operand_a.y, operand_b.y),
math.pow(operand_a.r, operand_b.r)
)
end
--- Performs modulo on the angle with another angle.
function angle_mt.__mod(operand_a, operand_b)
if (type(operand_a) == "number") then
return angle(
operand_a % operand_b.p,
operand_a % operand_b.y,
operand_a % operand_b.r
)
end
if (type(operand_b) == "number") then
return angle(
operand_a.p % operand_b,
operand_a.y % operand_b,
operand_a.r % operand_b
)
end
return angle(
operand_a.p % operand_b.p,
operand_a.y % operand_b.y,
operand_a.r % operand_b.r
)
end
--- Perform a unary minus operation on the angle.
function angle_mt.__unm(operand_a)
return angle(
-operand_a.p,
-operand_a.y,
-operand_a.r
)
end
--- Clamps the angles to whole numbers. Equivalent to "angle:round" with no precision.
--- @return void
function angle_c:round_zero()
self.p = math.floor(self.p + 0.5)
self.y = math.floor(self.y + 0.5)
self.r = math.floor(self.r + 0.5)
end
--- Round the angles.
--- @param precision number
function angle_c:round(precision)
self.p = math.round(self.p, precision)
self.y = math.round(self.y, precision)
self.r = math.round(self.r, precision)
end
--- Clamps the angles to the nearest base.
--- @param base number
function angle_c:round_base(base)
self.p = base * math.round(self.p / base)
self.y = base * math.round(self.y / base)
self.r = base * math.round(self.r / base)
end
--- Clamps the angles to whole numbers. Equivalent to "angle:round" with no precision.
--- @return angle_c
function angle_c:rounded_zero()
return angle(
math.floor(self.p + 0.5),
math.floor(self.y + 0.5),
math.floor(self.r + 0.5)
)
end
--- Round the angles.
--- @param precision number
--- @return angle_c
function angle_c:rounded(precision)
return angle(
math.round(self.p, precision),
math.round(self.y, precision),
math.round(self.r, precision)
)
end
--- Clamps the angles to the nearest base.
--- @param base number
--- @return angle_c
function angle_c:rounded_base(base)
return angle(
base * math.round(self.p / base),
base * math.round(self.y / base),
base * math.round(self.r / base)
)
end
--endregion
--region vector
--- @class vector_c
--- @field public x number X coordinate.
--- @field public y number Y coordinate.
--- @field public z number Z coordinate.
local vector_c = {}
local vector_mt = {
__index = vector_c,
}
--- Overwrite the vector's coordinates. Nil will leave coordinates unchanged.
--- @param vector vector_c
--- @param x_new number
--- @param y_new number
--- @param z_new number
--- @return void
vector_mt.__call = function(vector, x_new, y_new, z_new)
x_new = x_new or vector.x
y_new = y_new or vector.y
z_new = z_new or vector.z
vector.x = x_new
vector.y = y_new
vector.z = z_new
end
--- Create a new vector object.
--- @param x number
--- @param y number
--- @param z number
--- @return vector_c
local function vector(x, y, z)
return setmetatable(
{
x = x or 0,
y = y or 0,
z = z or 0
},
vector_mt
)
end
--- Overwrite the vector's coordinates. Nil will leave coordinates unchanged.
--- @param x_new number
--- @param y_new number
--- @param z_new number
--- @return void
function vector_c:set(x_new, y_new, z_new)
x_new = x_new or self.x
y_new = y_new or self.y
z_new = z_new or self.z
self.x = x_new
self.y = y_new
self.z = z_new
end
--- Offset the vector's coordinates. Nil will leave the coordinates unchanged.
--- @param x_offset number
--- @param y_offset number
--- @param z_offset number
--- @return void
function vector_c:offset(x_offset, y_offset, z_offset)
x_offset = x_offset or 0
y_offset = y_offset or 0
z_offset = z_offset or 0
self.x = self.x + x_offset
self.y = self.y + y_offset
self.z = self.z + z_offset
end
--- Clone the vector object.
--- @return vector_c
function vector_c:clone()
return setmetatable(
{
x = self.x,
y = self.y,
z = self.z
},
vector_mt
)
end
--- Clone the vector object and offset its coordinates. Nil will leave the coordinates unchanged.
--- @param x_offset number
--- @param y_offset number
--- @param z_offset number
--- @return vector_c
function vector_c:clone_offset(x_offset, y_offset, z_offset)
x_offset = x_offset or 0
y_offset = y_offset or 0
z_offset = z_offset or 0
return setmetatable(
{
x = self.x + x_offset,
y = self.y + y_offset,
z = self.z + z_offset
},
vector_mt
)
end
--- Clone the vector and optionally override its coordinates.
--- @param x_new number
--- @param y_new number
--- @param z_new number
--- @return vector_c
function vector_c:clone_set(x_new, y_new, z_new)
x_new = x_new or self.x
y_new = y_new or self.y
z_new = z_new or self.z
return vector(
x_new,
y_new,
z_new
)
end
--- Unpack the vector.
--- @return number, number, number
function vector_c:unpack()
return self.x, self.y, self.z
end
--- Set the vector's coordinates to 0.
--- @return void
function vector_c:nullify()
self.x = 0
self.y = 0
self.z = 0
end
--- Returns a string representation of the vector.
function vector_mt.__tostring(operand_a)
return string.format("%s, %s, %s", operand_a.x, operand_a.y, operand_a.z)
end
--- Concatenates the vector in a string.
function vector_mt.__concat(operand_a)
return string.format("%s, %s, %s", operand_a.x, operand_a.y, operand_a.z)
end
--- Returns true if the vector's coordinates are equal to another vector.
function vector_mt.__eq(operand_a, operand_b)
return (operand_a.x == operand_b.x) and (operand_a.y == operand_b.y) and (operand_a.z == operand_b.z)
end
--- Returns true if the vector is less than another vector.
function vector_mt.__lt(operand_a, operand_b)
if (type(operand_a) == "number") then
return (operand_a < operand_b.x) or (operand_a < operand_b.y) or (operand_a < operand_b.z)
end
if (type(operand_b) == "number") then
return (operand_a.x < operand_b) or (operand_a.y < operand_b) or (operand_a.z < operand_b)
end
return (operand_a.x < operand_b.x) or (operand_a.y < operand_b.y) or (operand_a.z < operand_b.z)
end
--- Returns true if the vector is less than or equal to another vector.
function vector_mt.__le(operand_a, operand_b)
if (type(operand_a) == "number") then
return (operand_a <= operand_b.x) or (operand_a <= operand_b.y) or (operand_a <= operand_b.z)
end
if (type(operand_b) == "number") then
return (operand_a.x <= operand_b) or (operand_a.y <= operand_b) or (operand_a.z <= operand_b)
end
return (operand_a.x <= operand_b.x) or (operand_a.y <= operand_b.y) or (operand_a.z <= operand_b.z)
end
--- Add a vector to another vector.
function vector_mt.__add(operand_a, operand_b)
if (type(operand_a) == "number") then
return vector(
operand_a + operand_b.x,
operand_a + operand_b.y,
operand_a + operand_b.z
)
end
if (type(operand_b) == "number") then
return vector(
operand_a.x + operand_b,
operand_a.y + operand_b,
operand_a.z + operand_b
)
end
return vector(
operand_a.x + operand_b.x,
operand_a.y + operand_b.y,
operand_a.z + operand_b.z
)
end
--- Subtract a vector from another vector.
function vector_mt.__sub(operand_a, operand_b)
if (type(operand_a) == "number") then
return vector(
operand_a - operand_b.x,
operand_a - operand_b.y,
operand_a - operand_b.z
)
end
if (type(operand_b) == "number") then
return vector(
operand_a.x - operand_b,
operand_a.y - operand_b,
operand_a.z - operand_b
)
end
return vector(
operand_a.x - operand_b.x,
operand_a.y - operand_b.y,
operand_a.z - operand_b.z
)
end
--- Multiply a vector with another vector.
function vector_mt.__mul(operand_a, operand_b)
if (type(operand_a) == "number") then
return vector(
operand_a * operand_b.x,
operand_a * operand_b.y,
operand_a * operand_b.z
)
end
if (type(operand_b) == "number") then
return vector(
operand_a.x * operand_b,
operand_a.y * operand_b,
operand_a.z * operand_b
)
end
return vector(
operand_a.x * operand_b.x,
operand_a.y * operand_b.y,
operand_a.z * operand_b.z
)
end
--- Divide a vector by another vector.
function vector_mt.__div(operand_a, operand_b)
if (type(operand_a) == "number") then
return vector(
operand_a / operand_b.x,
operand_a / operand_b.y,
operand_a / operand_b.z
)
end
if (type(operand_b) == "number") then
return vector(
operand_a.x / operand_b,
operand_a.y / operand_b,
operand_a.z / operand_b
)
end
return vector(
operand_a.x / operand_b.x,
operand_a.y / operand_b.y,
operand_a.z / operand_b.z
)
end
--- Raised a vector to the power of another vector.
function vector_mt.__pow(operand_a, operand_b)
if (type(operand_a) == "number") then
return vector(
math.pow(operand_a, operand_b.x),
math.pow(operand_a, operand_b.y),
math.pow(operand_a, operand_b.z)
)
end
if (type(operand_b) == "number") then
return vector(
math.pow(operand_a.x, operand_b),
math.pow(operand_a.y, operand_b),
math.pow(operand_a.z, operand_b)
)
end
return vector(
math.pow(operand_a.x, operand_b.x),
math.pow(operand_a.y, operand_b.y),
math.pow(operand_a.z, operand_b.z)
)
end
--- Performs a modulo operation on a vector with another vector.
function vector_mt.__mod(operand_a, operand_b)
if (type(operand_a) == "number") then
return vector(
operand_a % operand_b.x,
operand_a % operand_b.y,
operand_a % operand_b.z
)
end
if (type(operand_b) == "number") then
return vector(
operand_a.x % operand_b,
operand_a.y % operand_b,
operand_a.z % operand_b
)
end
return vector(
operand_a.x % operand_b.x,
operand_a.y % operand_b.y,
operand_a.z % operand_b.z
)
end
--- Perform a unary minus operation on the vector.
function vector_mt.__unm(operand_a)
return vector(
-operand_a.x,
-operand_a.y,
-operand_a.z
)
end
--- Returns the vector's 2 dimensional length squared.
--- @return number
function vector_c:length2_squared()
return (self.x * self.x) + (self.y * self.y);
end
--- Return's the vector's 2 dimensional length.
--- @return number
function vector_c:length2()
return math.sqrt(self:length2_squared())
end
--- Returns the vector's 3 dimensional length squared.
--- @return number
function vector_c:length_squared()
return (self.x * self.x) + (self.y * self.y) + (self.z * self.z);
end
--- Return's the vector's 3 dimensional length.
--- @return number
function vector_c:length()
return math.sqrt(self:length_squared())
end
--- Returns the vector's dot product.
--- @param b vector_c
--- @return number
function vector_c:dot_product(b)
return (self.x * b.x) + (self.y * b.y) + (self.z * b.z)
end
--- Returns the vector's cross product.
--- @param b vector_c
--- @return vector_c
function vector_c:cross_product(b)
return vector(
(self.y * b.z) - (self.z * b.y),
(self.z * b.x) - (self.x * b.z),
(self.x * b.y) - (self.y * b.x)
)
end
--- Returns the 2 dimensional distance between the vector and another vector.
--- @param destination vector_c
--- @return number
function vector_c:distance2(destination)
return (destination - self):length2()
end
--- Returns the 3 dimensional distance between the vector and another vector.
--- @param destination vector_c
--- @return number
function vector_c:distance(destination)
return (destination - self):length()
end
--- Returns the distance on the X axis between the vector and another vector.
--- @param destination vector_c
--- @return number
function vector_c:distance_x(destination)
return math.abs(self.x - destination.x)
end
--- Returns the distance on the Y axis between the vector and another vector.
--- @param destination vector_c
--- @return number
function vector_c:distance_y(destination)
return math.abs(self.y - destination.y)
end
--- Returns the distance on the Z axis between the vector and another vector.
--- @param destination vector_c
--- @return number
function vector_c:distance_z(destination)
return math.abs(self.z - destination.z)
end
--- Returns true if the vector is within the given distance to another vector.
--- @param destination vector_c
--- @param distance number
--- @return boolean
function vector_c:in_range(destination, distance)
return self:distance(destination) <= distance
end
--- Clamps the vector's coordinates to whole numbers. Equivalent to "vector:round" with no precision.
--- @return void
function vector_c:round_zero()
self.x = math.floor(self.x + 0.5)
self.y = math.floor(self.y + 0.5)
self.z = math.floor(self.z + 0.5)
end
--- Round the vector's coordinates.
--- @param precision number
--- @return void
function vector_c:round(precision)
self.x = math.round(self.x, precision)
self.y = math.round(self.y, precision)
self.z = math.round(self.z, precision)
end
--- Clamps the vector's coordinates to the nearest base.
--- @param base number
--- @return void
function vector_c:round_base(base)
self.x = base * math.round(self.x / base)
self.y = base * math.round(self.y / base)
self.z = base * math.round(self.z / base)
end
--- Clamps the vector's coordinates to whole numbers. Equivalent to "vector:round" with no precision.
--- @return vector_c
function vector_c:rounded_zero()
return vector(
math.floor(self.x + 0.5),
math.floor(self.y + 0.5),
math.floor(self.z + 0.5)
)
end
--- Round the vector's coordinates.
--- @param precision number
--- @return vector_c
function vector_c:rounded(precision)
return vector(
math.round(self.x, precision),
math.round(self.y, precision),
math.round(self.z, precision)
)
end
--- Clamps the vector's coordinates to the nearest base.
--- @param base number
--- @return vector_c
function vector_c:rounded_base(base)
return vector(
base * math.round(self.x / base),
base * math.round(self.y / base),
base * math.round(self.z / base)
)
end
--- Normalize the vector.
--- @return void
function vector_c:normalize()
local length = self:length()
-- Prevent possible divide-by-zero errors.
if (length ~= 0) then
self.x = self.x / length
self.y = self.y / length
self.z = self.z / length
else
self.x = 0
self.y = 0
self.z = 1
end
end
--- Returns the normalized length of a vector.
--- @return number
function vector_c:normalized_length()
return self:length()
end
--- Returns a copy of the vector, normalized.
--- @return vector_c
function vector_c:normalized()
local length = self:length()
if (length ~= 0) then
return vector(
self.x / length,
self.y / length,
self.z / length
)
else
return vector(0, 0, 1)
end
end
--- Returns a new 2 dimensional vector of the original vector when mapped to the screen, or nil if the vector is off-screen.
--- @return vector_c
function vector_c:to_screen(only_within_screen_boundary)
local x, y = renderer.world_to_screen(self.x, self.y, self.z)
if (x == nil or y == nil) then
return nil
end
if (only_within_screen_boundary == true) then
local screen_x, screen_y = client.screen_size()
if (x < 0 or x > screen_x or y < 0 or y > screen_y) then
return nil
end
end
return vector(x, y)
end
--- Returns the magnitude of the vector, use this to determine the speed of the vector if it's a velocity vector.
--- @return number
function vector_c:magnitude()
return math.sqrt(
math.pow(self.x, 2) +
math.pow(self.y, 2) +
math.pow(self.z, 2)
)
end
--- Returns the angle of the vector in regards to another vector.
--- @param destination vector_c
--- @return angle_c
function vector_c:angle_to(destination)
-- Calculate the delta of vectors.
local delta_vector = vector(destination.x - self.x, destination.y - self.y, destination.z - self.z)
-- Calculate the yaw.
local yaw = math.deg(math.atan2(delta_vector.y, delta_vector.x))
-- Calculate the pitch.
local hyp = math.sqrt(delta_vector.x * delta_vector.x + delta_vector.y * delta_vector.y)
local pitch = math.deg(math.atan2(-delta_vector.z, hyp))
return angle(pitch, yaw)
end
--- Lerp to another vector.
--- @param destination vector_c
--- @param percentage number
--- @return vector_c
function vector_c:lerp(destination, percentage)
return self + (destination - self) * percentage
end
--- Internally divide a ray.
--- @param source vector_c
--- @param destination vector_c
--- @param m number
--- @param n number
--- @return vector_c
local function vector_internal_division(source, destination, m, n)
return vector((source.x * n + destination.x * m) / (m + n),
(source.y * n + destination.y * m) / (m + n),
(source.z * n + destination.z * m) / (m + n))
end
--- Returns the result of client.trace_line between two vectors.
--- @param destination vector_c
--- @param skip_entindex number
--- @return number, number|nil
function vector_c:trace_line_to(destination, skip_entindex)
skip_entindex = skip_entindex or -1
return client.trace_line(
skip_entindex,
self.x,
self.y,
self.z,
destination.x,
destination.y,
destination.z
)
end
--- Trace line to another vector and returns the fraction, entity, and the impact point.
--- @param destination vector_c
--- @param skip_entindex number
--- @return number, number, vector_c
function vector_c:trace_line_impact(destination, skip_entindex)
skip_entindex = skip_entindex or -1
local fraction, eid = client.trace_line(skip_entindex, self.x, self.y, self.z, destination.x, destination.y, destination.z)
local impact = self:lerp(destination, fraction)
return fraction, eid, impact
end
--- Trace line to another vector, skipping any entity indices returned by the callback and returns the fraction, entity, and the impact point.
--- @param destination vector_c
--- @param callback fun(eid: number): boolean
--- @param max_traces number
--- @return number, number, vector_c
function vector_c:trace_line_skip_indices(destination, max_traces, callback)
max_traces = max_traces or 10
local fraction, eid = 0, -1
local impact = self
local i = 0
while (max_traces >= i and fraction < 1 and ((eid > -1 and callback(eid)) or impact == self)) do
fraction, eid, impact = impact:trace_line_impact(destination, eid)
i = i + 1
end
return self:distance(impact) / self:distance(destination), eid, impact
end
--- Traces a line from source to destination and returns the fraction, entity, and the impact point.
--- @param destination vector_c
--- @param skip_classes table
--- @param skip_distance number
--- @return number, number
function vector_c:trace_line_skip_class(destination, skip_classes, skip_distance)
local should_skip = function(index, skip_entity)
local class_name = entity.get_classname(index) or ""
for i in 1, #skip_entity do
if class_name == skip_entity[i] then
return true
end
end
return false
end
local angles = self:angle_to(destination)
local direction = angles:to_forward_vector()
local last_traced_position = self
while true do -- Start tracing.
local fraction, hit_entity = last_traced_position:trace_line_to(destination)
if fraction == 1 and hit_entity == -1 then -- If we didn't hit anything.
return 1, -1 -- return nothing.
else -- BOIS WE HIT SOMETHING.
if should_skip(hit_entity, skip_classes) then -- If entity should be skipped.
-- Set last traced position according to fraction.
last_traced_position = vector_internal_division(self, destination, fraction, 1 - fraction)
-- Add a little gap per each trace to prevent inf loop caused by intersection.
last_traced_position = last_traced_position + direction * skip_distance
else -- That's the one I want.
return fraction, hit_entity, self:lerp(destination, fraction)
end
end
end
end
--- Returns the result of client.trace_bullet between two vectors.
--- @param eid number
--- @param destination vector_c
--- @return number|nil, number
function vector_c:trace_bullet_to(destination, eid)
return client.trace_bullet(
eid,
self.x,
self.y,
self.z,
destination.x,
destination.y,
destination.z
)
end
--- Returns the vector of the closest point along a ray.
--- @param ray_start vector_c
--- @param ray_end vector_c
--- @return vector_c
function vector_c:closest_ray_point(ray_start, ray_end)
local to = self - ray_start
local direction = ray_end - ray_start
local length = direction:length()
direction:normalize()
local ray_along = to:dot_product(direction)
if (ray_along < 0) then
return ray_start
elseif (ray_along > length) then
return ray_end
end
return ray_start + direction * ray_along
end
--- Returns a point along a ray after dividing it.
--- @param ray_end vector_c
--- @param ratio number
--- @return vector_c
function vector_c:ray_divided(ray_end, ratio)
return (self * ratio + ray_end) / (1 + ratio)
end
--- Returns a ray divided into a number of segments.
--- @param ray_end vector_c
--- @param segments number
--- @return table<number, vector_c>
function vector_c:ray_segmented(ray_end, segments)
local points = {}
for i = 0, segments do
points[i] = vector_internal_division(self, ray_end, i, segments - i)
end
return points
end
--- Returns the best source vector and destination vector to draw a line on-screen using world-to-screen.
--- @param ray_end vector_c
--- @param total_segments number
--- @return vector_c|nil, vector_c|nil
function vector_c:ray(ray_end, total_segments)
total_segments = total_segments or 128
local segments = {}
local step = self:distance(ray_end) / total_segments
local angle = self:angle_to(ray_end)
local direction = angle:to_forward_vector()
for i = 1, total_segments do
table.insert(segments, self + (direction * (step * i)))
end
local src_screen_position = vector(0, 0, 0)
local dst_screen_position = vector(0, 0, 0)
local src_in_screen = false
local dst_in_screen = false
for i = 1, #segments do
src_screen_position = segments[i]:to_screen()
if src_screen_position ~= nil then
src_in_screen = true
break
end
end
for i = #segments, 1, -1 do
dst_screen_position = segments[i]:to_screen()
if dst_screen_position ~= nil then
dst_in_screen = true
break
end
end
if src_in_screen and dst_in_screen then
return src_screen_position, dst_screen_position
end
return nil
end
--- Returns true if the ray goes through a smoke. False if not.
--- @param ray_end vector_c
--- @return boolean
function vector_c:ray_intersects_smoke(ray_end)
if (line_goes_through_smoke == nil) then
error("Unsafe scripts must be allowed in order to use vector_c:ray_intersects_smoke")
end
return line_goes_through_smoke(self.x, self.y, self.z, ray_end.x, ray_end.y, ray_end.z, 1)
end
--- Returns true if the vector lies within the boundaries of a given 2D polygon. The polygon is a table of vectors. The Z axis is ignored.
--- @param polygon table<any, vector_c>
--- @return boolean
function vector_c:inside_polygon2(polygon)
local odd_nodes = false
local polygon_vertices = #polygon
local j = polygon_vertices
for i = 1, polygon_vertices do
if (polygon[i].y < self.y and polygon[j].y >= self.y or polygon[j].y < self.y and polygon[i].y >= self.y) then
if (polygon[i].x + (self.y - polygon[i].y) / (polygon[j].y - polygon[i].y) * (polygon[j].x - polygon[i].x) < self.x) then
odd_nodes = not odd_nodes
end
end
j = i
end
return odd_nodes
end
local resolver_c = {}
local resolver_mt = {
__index = resolver_c
}
local x = 0
function resolver_c.setup()
return setmetatable( {
miss_reason = {},
entity_data = {},
animstate_data = {},
animlayer_data = {},
freestand_data = {},
misses = 0,
hit = 0,
shots = 0,
}, resolver_mt )
end
function resolver_c:reset()
self.miss_reason = {}
self.entity_data = {}
self.animstate_data = {}
self.animlayer_data = {}
self.freestand_data = {}
end
function resolver_c:GetAnimationState(_Entity)
if not (_Entity) then
return
end
local player_ptr = ffi.cast( "void***", get_client_entity(ientitylist, _Entity))
local animstate_ptr = ffi.cast( "char*" , player_ptr ) + 0x3914
local state = ffi.cast( "struct c_animstate**", animstate_ptr )[0]
return state
end
function GetAnimationState1(_Entity)
if not (_Entity) then
return
end
local player_ptr = ffi.cast( "void***", get_client_entity(ientitylist, _Entity))
local animstate_ptr = ffi.cast( "char*" , player_ptr ) + 0x3914
local state = ffi.cast( "struct c_animstate**", animstate_ptr )[0]
return state
end
function GetPlayerMaxFeetYaw1(_Entity)
local S_animationState_t = GetAnimationState1(_Entity)
local nDuckAmount = S_animationState_t.m_fDuckAmount
local nFeetSpeedForwardsOrSideWays = math.max(0, math.min(1, S_animationState_t.m_flFeetSpeedForwardsOrSideWays))
local nFeetSpeedUnknownForwardOrSideways = math.max(1, S_animationState_t.m_flFeetSpeedUnknownForwardOrSideways)
local nValue =
(S_animationState_t.m_flStopToFullRunningFraction * -0.30000001 - 0.19999999) * nFeetSpeedForwardsOrSideWays +
1
if nDuckAmount > 0 then
nValue = nValue + nDuckAmount * nFeetSpeedUnknownForwardOrSideways * (0.5 - nValue)
end
local nDeltaYaw = S_animationState_t.m_flMaxYaw * nValue
return nDeltaYaw < 60 and nDeltaYaw >= 0 and nDeltaYaw or 0
end
function resolver_c:GetPlayerMaxFeetYaw(_Entity)
local S_animationState_t = self:GetAnimationState(_Entity)
local nDuckAmount = S_animationState_t.m_fDuckAmount
local nFeetSpeedForwardsOrSideWays = math.max(0, math.min(1, S_animationState_t.m_flFeetSpeedForwardsOrSideWays))
local nFeetSpeedUnknownForwardOrSideways = math.max(1, S_animationState_t.m_flFeetSpeedUnknownForwardOrSideways)
local nValue =
(S_animationState_t.m_flStopToFullRunningFraction * -0.30000001 - 0.19999999) * nFeetSpeedForwardsOrSideWays +
1
if nDuckAmount > 0 then
nValue = nValue + nDuckAmount * nFeetSpeedUnknownForwardOrSideways * (0.5 - nValue)
end
local nDeltaYaw = S_animationState_t.m_flMaxYaw * nValue
return nDeltaYaw < 60 and nDeltaYaw >= 0 and nDeltaYaw or 0
end
function resolver_c:on_miss(handle)
local hitgroup_names = {
"generic",
"head",
"chest",
"stomach",
"left arm",
"right arm",
"left leg",
"right leg",
"neck",
"gear",
}--hitgroup_names[e.hitgroup + 1] or "?"
if handle.reason ~= "?" then
return
end
self.misses = self.misses + 1
if not self.entity_data[handle.target] then
self.entity_data[handle.target] = {}
end
if not self.miss_reason[handle.target] then
self.miss_reason[handle.target] = {}
end
local miss_count = self.entity_data[handle.target].miss or 0
self.entity_data[handle.target].miss = miss_count + 1
local miss_data = handle
local ent_name = entity.get_player_name(handle.target)
miss_data.name = ent_name
local yaw = (entity.get_prop(handle.target, "m_flPoseParameter", 11) or 0) * 116 - 58
local should_fix = self.entity_data[handle.target].miss > 2 and self.entity_data[handle.target].miss < 5
self.miss_reason[handle.target].count = self.entity_data[handle.target].miss
self.miss_reason[handle.target].reason = self.entity_data[handle.target].miss > 2 and (string.format("lowdelta: %s", yaw) or "?") or "?"
local fix_value = 26*(self.entity_data[handle.target].miss % 2 == 0 and -1 or 1)
end
function resolver_c:on_hit(handle)
self.hit = self.hit + 1
end
function resolver_c:on_fire(handle)
self.shots = self.shots + 1
end
bruteforce_phases = {
-- Standing players
standing = {
[1] = -50,
[2] = 50,
[3] = 30,
[4] = 0
},
moving = {
[1] = 48,
[2] = -48,
[3] = -29,
[4] = 0
},
slowwalk = {
[1] = 48,
[2] = 30,
[3] = -15,
[4] = 0
},
pressing_e = {
[1] = 50,
[2] = -48,
[3] = 48,
[4] = 0,
},
onshot = {
[1] = 60,
[2] = -60,
[3] = 0,
},
}
--standing
if standing then
fix_value = bruteforce_phases.standing[calculate_phase]*calculate_invert*calculate_angles
state = "standing"
end
--moving
if moving then
fix_value = bruteforce_phases.moving[calculate_phase]*calculate_invert*calculate_angles
state = "moving"
end
--slowwalk
if slowwalk then
fix_value = bruteforce_phases.slowwalk[calculate_phase]
state = "slowwalk"
end
--in air
if air then
fix_value = bruteforce_phases.air[calculate_phase]*calculate_invert*calculate_angles
state = "in air"
end
--e peek
if pressing_e then
fix_value = bruteforce_phases.pressing_e[calculate_phase]*calculate_invert*calculate_angles
state = "e"
end
--e peek
if onshot then
fix_value = bruteforce_phases.onshot[calculate_phase]*calculate_invert*calculate_angles
state = "fired"
end
--forward
if sideways_forward then
fix_value = (max_yaw/2 + (max_yaw/4))*calculate_invert*calculate_angles*(-2)
state = "forward"
end
--sideways
if sideways_left_right then
fix_value = (max_yaw/2 - 4)*calculate_invert*calculate_angles
state = "left/right"
end
-- end resolver
if menu.get_bool("Custom Teleport") then
teleport()
end
if menu.get_bool("Clan Tag") then
clan_tag()
end
client.add_callback("create_move", function()
bebra()
end)
Write, Run & Share Lua code online using OneCompiler's Lua online compiler for free. It's one of the robust, feature-rich online compilers for Lua language, running the latest Lua version 5.4. Getting started with the OneCompiler's Lua editor is easy and fast. The editor shows sample boilerplate code when you choose language as Lua and start coding.
OneCompiler's Lua online editor supports stdin and users can give inputs to programs using the STDIN textbox under the I/O tab. Following is a sample Lua program which takes name as input and prints hello message with your name.
name = io.read("*a")
print ("Hello ", name)
Lua is a light weight embeddable scripting language which is built on top of C. It is used in almost all kind of applications like games, web applications, mobile applications, image processing etc. It's a very powerful, fast, easy to learn, open-source scripting language.
-- global variables
a = 10
-- local variables
local x = 30
| Value Type | Description |
|---|---|
| number | Represents numbers |
| string | Represents text |
| nil | Differentiates values whether it has data or not |
| boolean | Value can be either true or false |
| function | Represents a sub-routine |
| userdata | Represents arbitary C data |
| thread | Represents independent threads of execution. |
| table | Can hold any value except nil |
While is also used to iterate a set of statements based on a condition. Usually while is preferred when number of iterations are not known in advance.
while(condition)
do
--code
end
Repeat-Until is also used to iterate a set of statements based on a condition. It is very similar to Do-While, it is mostly used when you need to execute the statements atleast once.
repeat
--code
until( condition )
For loop is used to iterate a set of statements based on a condition.
for init,max/min value, increment
do
--code
end
Function is a sub-routine which contains set of statements. Usually functions are written when multiple calls are required to same set of statements which increase re-usuability and modularity.
optional_function_scope function function_name( argument1, argument2, argument3........, argumentn)
--code
return params with comma seperated
end