local lp = entity.get_local_player
--elements
local enable = ui.new_checkbox("LUA", "A", "Enable China hat", true)
local color = ui.new_color_picker("LUA", "A", "China color", 0, 255, 255, 255)
local gradient = ui.new_checkbox("LUA", "A", "Gradient")
local speed = ui.new_slider("LUA", "A", "Speed \n China", 1, 10, 5)
local thirdperson = {ui.reference("Visuals", "Effects", "Force third person (alive)")}
--cope triangle function (by some nigga on forums)
local renderer_triangle = function(v2_A, v2_B, v2_C, r, g, b, a)
local function i(j,k,l)
local m=(k.y-j.y)*(l.x-k.x)-(k.x-j.x)*(l.y-k.y)
if m<0 then return true end
return false
end
if i(v2_A,v2_B,v2_C) then renderer.triangle(v2_A.x,v2_A.y,v2_B.x,v2_B.y,v2_C.x,v2_C.y,r,g,b,a)
elseif i(v2_A,v2_C,v2_B) then renderer.triangle(v2_A.x,v2_A.y,v2_C.x,v2_C.y,v2_B.x,v2_B.y,r,g,b,a)
elseif i(v2_B,v2_C,v2_A) then renderer.triangle(v2_B.x,v2_B.y,v2_C.x,v2_C.y,v2_A.x,v2_A.y,r,g,b,a)
elseif i(v2_B,v2_A,v2_C) then renderer.triangle(v2_B.x,v2_B.y,v2_A.x,v2_A.y,v2_C.x,v2_C.y,r,g,b,a)
elseif i(v2_C,v2_A,v2_B) then renderer.triangle(v2_C.x,v2_C.y,v2_A.x,v2_A.y,v2_B.x,v2_B.y,r,g,b,a)
else renderer.triangle(v2_C.x,v2_C.y,v2_B.x,v2_B.y,v2_A.x,v2_A.y,r,g,b,a)end
end
--Pasted from internet
local function hsv_to_rgb(h, s, v)
local r, g, b
local i = math.floor(h * 6);
local f = h * 6 - i;
local p = v * (1 - s);
local q = v * (1 - f * s);
local t = v * (1 - (1 - f) * s);
i = i % 6
if i == 0 then r, g, b = v, t, p
elseif i == 1 then r, g, b = q, v, p
elseif i == 2 then r, g, b = p, v, t
elseif i == 3 then r, g, b = p, q, v
elseif i == 4 then r, g, b = t, p, v
elseif i == 5 then r, g, b = v, p, q
end
return r * 255, g * 255, b * 255
end
local function world_circle(origin, size)
if origin[1] == nil then
return
end
local last_point = nil
--Get shit
local gradient_g = ui.get(gradient)
local color_g = {ui.get(color)}
for i = 0, 360, 5 do
local new_point = { --Rotate point
origin[1] - (math.sin(math.rad(i)) * size),
origin[2] - (math.cos(math.rad(i)) * size),
origin[3]
}
local actual_color = color_g
if (gradient_g) then
local hue_offset = 0
hue_offset = ((globals.realtime() * (ui.get(speed) * 50)) + i) % 360
hue_offset = math.min(360, math.max(0, hue_offset))
local r, g, b = hsv_to_rgb(hue_offset / 360, 1, 1)
color_g = {r, g, b, 255}
end
--Draw line and polygon
if last_point ~= nil then
local old_screen_point = {renderer.world_to_screen(last_point[1], last_point[2], last_point[3])}
local new_screen_point = {renderer.world_to_screen(new_point[1], new_point[2], new_point[3])}
local origin_screen_point = {renderer.world_to_screen(origin[1], origin[2], origin[3] + 8)}
if old_screen_point[1] ~= nil and new_screen_point[1] ~= nil and origin_screen_point[1] ~= nil then
renderer_triangle({x = old_screen_point[1], y = old_screen_point[2]}, {x = new_screen_point[1], y = new_screen_point[2]}, {x = origin_screen_point[1], y = origin_screen_point[2]}, color_g[1], color_g[2], color_g[3], 50)
renderer.line(old_screen_point[1], old_screen_point[2], new_screen_point[1], new_screen_point[2], color_g[1], color_g[2], color_g[3], 255)
end
end
--Update
last_point = new_point
end
end
client.set_event_callback("paint_ui", function()
--Menu elements
local master_state = ui.get(enable)
ui.set_visible(color, master_state)
ui.set_visible(gradient, master_state)
ui.set_visible(speed, master_state and ui.get(gradient))
--make actual hat
if not master_state or (not ui.get(thirdperson[1]) or not ui.get(thirdperson[2])) or lp() == nil or entity.is_alive(lp()) == false then
return
end
world_circle({entity.hitbox_position(lp(), 0)}, 10)
end)