ОРИГ: -- ====== 1.
СЕРВИСЫ ======
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")
local TweenService = game:GetService("TweenService")
local Lighting = game:GetService("Lighting")
local player = [Link]
local playerGui = player:WaitForChild("PlayerGui")
local camera = [Link]
-- ====== 2. ИНИЦИАЛЬНАЯ ПОЗИЦИЯ ======
local INIT_POS = [Link](0, 50, 0, 50)
-- ====== 3. ПАРАМЕТРЫ / КОНСТАНТЫ ======
local CONST = {
STIFF_POS = 245, DAMP_POS = 15, MASS_POS = 1,
STIFF_SZ = 200, DAMP_SZ = 12, MASS_SZ = 1,
IDLE_SIZE = [Link](50,50),
PRESSED_SIZE = [Link](65,65),
PRESS_OFF = [Link](0,3),
DRAG_THR = 10,
GUI_SIZE = [Link](0,500,0,300),
GUI_RAD = [Link](0,24),
ANIM_T = 0.4,
}
-- ====== 4. СОСТОЯНИЕ ======
local state = {
origFOV = [Link],
targetPos, currentPos = INIT_POS, INIT_POS,
velPos = [Link],
targetSz, currentSz = CONST.IDLE_SIZE, CONST.IDLE_SIZE,
velSz = [Link],
dragInput, startPt, didDrag = nil, nil, false,
allowGrow = true,
isOpen, isTween = false, false,
savedPos, blurEf, overlay = nil, nil, nil,
btnMinimize, btnClose = nil, nil,
firstOpen = true,
lastSelectedTabIndex = nil,
}
-- ====== 5. HELPERS ======
local function toUDim2(v) return [Link](v.X, v.Y) end
local function dist(a,b) return (a - b).Magnitude end
-- ====== 6. СОЗДАНИЕ GUI ======
local screenGui = [Link]("ScreenGui", playerGui)
[Link] = "MorphGUI"
[Link] = false
local container = [Link]("Frame", screenGui)
[Link] = "MorphContainer"
[Link] = [Link](0.5,0.5)
[Link] = [Link]
[Link] = [Link]([Link].X, [Link].Y)
container.BackgroundColor3 = [Link](30,30,30)
[Link] = 0
[Link] = true
local contCorner = [Link]("UICorner", container)
[Link] = [Link](1,0)
local contStroke = [Link]("UIStroke", container)
[Link] = 2
[Link] = 0.5
local inputBtn = [Link]("ImageButton", container)
[Link] = "InputButton"
[Link] = [Link](1,0,1,0)
[Link] = 1
[Link] = false
[Link] = true
-- ====== 7. SPRING-LOOP ======
[Link]:Connect(function(dt)
if [Link] or [Link] then return end
-- позиция
do
local c = [Link]([Link], [Link])
local t = [Link]([Link], [Link])
local f = -CONST.STIFF_POS*(c - t) - CONST.DAMP_POS*[Link]
local a = f / CONST.MASS_POS
[Link] = [Link] + a*dt
c = c + [Link]*dt
[Link] = [Link](c.X, c.Y)
[Link] = [Link]
end
-- размер
do
local ds = [Link] - [Link]
local fs = -CONST.STIFF_SZ*ds - CONST.DAMP_SZ*[Link]
local asz = fs / CONST.MASS_SZ
[Link] = [Link] + asz*dt
[Link] = [Link] + [Link]*dt
[Link] = [Link]([Link].X, [Link].Y)
end
end)
-- ====== 8. INPUT HANDLERS ======
[Link]:Connect(function(inp)
if [Link] or [Link] then return end
if [Link] == [Link].MouseButton1 or [Link] ==
[Link] then
[Link], [Link], [Link] = inp, [Link], false
if [Link] then
[Link] = CONST.PRESSED_SIZE
[Link] = toUDim2([Link]([Link],
[Link]) + CONST.PRESS_OFF)
end
end
end)
[Link]:Connect(function(inp)
if [Link] or [Link] then return end
if inp == [Link] then
if not [Link] and dist([Link], [Link]) > CONST.DRAG_THR
then
[Link], [Link] = true, [Link]
[Link], [Link] = CONST.IDLE_SIZE, false
end
if [Link] then
[Link] = toUDim2([Link])
end
end
end)
[Link]:Connect(function(inp)
if [Link] or [Link] then return end
if inp == [Link] then
if not [Link] then
[Link], [Link] = [Link], [Link]
[Link] = true
[Link] = [Link]
openMenu()
else
[Link] = CONST.IDLE_SIZE
end
[Link], [Link], [Link] = nil, false, true
end
end)
-- ====== 9. OPEN MENU ======
function openMenu()
[Link] = false
[Link] = true
-- камера + blur
TweenService:Create(camera, [Link](CONST.ANIM_T), {FieldOfView =
[Link] - 20}):Play()
[Link] = [Link]("BlurEffect", Lighting); [Link] = 0
TweenService:Create([Link], [Link](CONST.ANIM_T), {Size =
24}):Play()
-- overlay
[Link] = [Link]("Frame", playerGui)
[Link], [Link] = [Link](1,0,1,0), [Link]()
[Link].BackgroundColor3 = [Link](0,0,0)
[Link] = 1
TweenService:Create([Link], [Link](CONST.ANIM_T),
{BackgroundTransparency = 0.5}):Play()
-- expand container
TweenService:Create(contCorner, [Link](CONST.ANIM_T), {CornerRadius =
CONST.GUI_RAD}):Play()
TweenService:Create(contStroke, [Link](CONST.ANIM_T), {Transparency =
1}):Play()
local tweenCont = TweenService:Create(container,
[Link](CONST.ANIM_T, [Link]),
{Size = CONST.GUI_SIZE, Position = [Link](0.5,0,0.5,0)}
)
tweenCont:Play()
[Link]:Connect(function()
-- === AvatarGreeting ===
local greet = container:FindFirstChild("AvatarGreeting")
if not greet then
greet = [Link]("Frame", container)
[Link] = "AvatarGreeting"
[Link] = [Link](0,1)
[Link] = [Link](0,10,1,-10)
[Link] = 1
[Link] = [Link](0,150,0,40)
else
[Link] = true
end
-- avatar + stroke (теперь серая обводка)
local avatar = greet:FindFirstChild("Avatar")
local stroke
if not avatar then
avatar = [Link]("ImageLabel", greet)
[Link] = "Avatar"
[Link] = [Link](0,36,0,36)
[Link] = [Link](0,4,0,2)
[Link] = 1
[Link] = 1
[Link] = Players:GetUserThumbnailAsync([Link],
[Link], [Link].Size48x48)
[Link]("UICorner", avatar).CornerRadius = [Link](1,0)
stroke = [Link]("UIStroke", avatar)
[Link], [Link] = [Link](150,150,150), 1
[Link] = 1
else
stroke = avatar:FindFirstChildOfClass("UIStroke")
[Link] = 1
if stroke then [Link] = 1; [Link] =
[Link](150,150,150) end
end
-- тексты
for _,name in ipairs({"HelloText","EnjoyText"}) do
local ex = greet:FindFirstChild(name)
if ex then ex:Destroy() end
end
local textX = 4 + 36 + 6
local ht = [Link]("TextLabel", greet)
[Link] = "HelloText"
[Link] = [Link](0,textX,0,4)
[Link] = [Link](0,100,0,16)
[Link] = 1
[Link] = "Hello, "..[Link]
[Link] = [Link]
[Link] = 14
ht.TextColor3 = [Link](1,1,1)
[Link] = 1
local et = [Link]("TextLabel", greet)
[Link] = "EnjoyText"
[Link] = [Link](0,textX,0,22)
[Link] = [Link](0,100,0,12)
[Link] = 1
[Link] = "Enjoy menu"
[Link] = [Link]
[Link] = 10
et.TextColor3 = [Link](150,150,150)
[Link] = 1
-- появление контента
for _,entry in ipairs({
{obj=avatar, props={ImageTransparency=0}},
{obj=stroke, props={Transparency=0}},
{obj=ht, props={TextTransparency=0}},
{obj=et, props={TextTransparency=0}},
}) do
if [Link] then
TweenService:Create([Link], [Link](CONST.ANIM_T),
[Link]):Play()
end
end
-- === Секции (табы) ===
if not container:FindFirstChild("SectionsContainer") then
local sections = {"Раздел 1","Раздел 2","Раздел 3"}
local secCont = [Link]("Frame", container)
[Link] = "SectionsContainer"
[Link] = [Link](0,0)
[Link] = [Link](0,12,0,80)
[Link] = [Link](0,150,0,#sections*28 + (#sections-
1)*4)
[Link] = 1
[Link] = true
local listLayout = [Link]("UIListLayout", secCont)
[Link] = [Link]
[Link] = [Link](0,4)
local tweenFast = [Link](0.15, [Link],
[Link])
local btns = {}
for i,name in ipairs(sections) do
local btn = [Link]("TextButton", secCont)
[Link] = "Tab"..i
[Link] = i
[Link] = [Link](1,0,0,24)
btn.BackgroundColor3 = [Link](40,40,40)
[Link] = 1
[Link] = 0
[Link] = false
[Link] = name
[Link] = [Link]
[Link] = 11
btn.TextColor3 = [Link](230,230,230)
[Link] = 1
[Link]("UICorner", btn).CornerRadius = [Link](0,4)
[Link](btns, btn)
delay(0.05 * i, function()
TweenService:Create(btn, tweenFast, {
BackgroundTransparency = 0,
TextTransparency = 0,
}):Play()
end)
btn.MouseButton1Click:Connect(function()
for _,b in ipairs(btns) do
local props = (b == btn)
and {Size = [Link](1,0,0,28), BackgroundColor3 =
[Link](70,70,70)}
or {Size = [Link](1,0,0,20), BackgroundColor3 =
[Link](40,40,40)}
TweenService:Create(b, tweenFast, props):Play()
end
[Link] = i
end)
end
-- выделить последний или первый
delay(0.1, function()
local idx = [Link] or 1
local btn = secCont:FindFirstChild("Tab"..idx)
if btn then
for _,b in ipairs(btns) do
local props = (b == btn)
and {Size = [Link](1,0,0,28), BackgroundColor3 =
[Link](70,70,70)}
or {Size = [Link](1,0,0,20), BackgroundColor3 =
[Link](40,40,40)}
TweenService:Create(b, tweenFast, props):Play()
end
end
end)
end
-- ====== Buttons Minimize / Close ======
local function makeBtn(name, sym, xOffset, fn)
local b = [Link]("TextButton", container)
[Link] = name
[Link] = [Link](1, 0)
[Link] = [Link](1, xOffset, 0, 10)
[Link] = [Link](0,30,0,30)
[Link] = 1
[Link], [Link], [Link], [Link] = sym,
[Link], 20, 1
[Link] = false
[Link]("UICorner", b).CornerRadius = [Link](1,0)
local s = [Link]("UIStroke", b)
[Link], [Link], [Link] = [Link](150,150,150), 1, 2
b.MouseButton1Click:Connect(fn)
return b
end
[Link] = makeBtn("MinimizeBtn", "–", -50, minimizeMenu)
[Link] = makeBtn("CloseBtn", "×", -15, closeAll)
for _,btn in ipairs({[Link], [Link]}) do
TweenService:Create(btn,
[Link](CONST.ANIM_T*0.6,[Link]), {
TextTransparency = 0
}):Play()
local s = btn:FindFirstChildOfClass("UIStroke")
if s then TweenService:Create(s, [Link](CONST.ANIM_T*0.6),
{Transparency=0}):Play() end
end
[Link], [Link], [Link] = true, false, false
end)
end
-- ====== 10. MINИМИЗИРОВАТЬ ======
function minimizeMenu()
[Link], [Link] = true, false
local g = container:FindFirstChild("AvatarGreeting")
if g then [Link] = false end
local oldSections = container:FindFirstChild("SectionsContainer")
if oldSections then oldSections:Destroy() end
for _,b in ipairs({[Link], [Link]}) do
local s = b:FindFirstChildOfClass("UIStroke")
TweenService:Create(b, [Link](CONST.ANIM_T*0.5),
{TextTransparency=1}):Play()
if s then TweenService:Create(s, [Link](CONST.ANIM_T*0.5),
{Transparency=1}):Play() end
end
TweenService:Create(camera, [Link](CONST.ANIM_T),
{FieldOfView=[Link]}):Play()
if [Link] then [Link]:Destroy() end
if [Link] then [Link]:Destroy() end
TweenService:Create(contStroke, [Link](CONST.ANIM_T),
{Transparency=0.5}):Play()
local t = TweenService:Create(container,
[Link](CONST.ANIM_T, [Link]),
{Size = [Link](CONST.IDLE_SIZE.X,CONST.IDLE_SIZE.Y), Position =
[Link]}
)
t:Play()
[Link]:Connect(function()
[Link]:Destroy()
[Link]:Destroy()
[Link] = CONST.IDLE_SIZE
[Link] = CONST.IDLE_SIZE
[Link] = [Link]
[Link] = [Link]
[Link] = [Link]
[Link] = [Link]
[Link] = true
[Link] = false
end)
end
-- ====== 11. CLOSE ======
function closeAll()
[Link], [Link] = true, false
for _,b in ipairs({[Link], [Link]}) do
local s = b:FindFirstChildOfClass("UIStroke")
TweenService:Create(b, [Link](CONST.ANIM_T*0.5),
{TextTransparency=1}):Play()
if s then TweenService:Create(s, [Link](CONST.ANIM_T*0.5),
{Transparency=1}):Play() end
end
TweenService:Create(camera, [Link](CONST.ANIM_T),
{FieldOfView=[Link]}):Play()
if [Link] then TweenService:Create([Link],
[Link](CONST.ANIM_T), {BackgroundTransparency=1}):Play() end
if [Link] then TweenService:Create([Link],
[Link](CONST.ANIM_T), {Size=0}):Play() end
TweenService:Create(contStroke, [Link](CONST.ANIM_T),
{Transparency=1}):Play()
local t = TweenService:Create(container,
[Link](CONST.ANIM_T, [Link], [Link]),
{Size=[Link](0,0,0,0), Position=[Link](0.5,0,0.5,0),
BackgroundTransparency=1}
)
t:Play()
[Link]:Connect(function()
screenGui:Destroy()
end)
end