local Players = game:GetService("Players")
local UserInputService = game:GetService("UserInputService")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local StarterGui = game:GetService("StarterGui")
local TweenService = game:GetService("TweenService")
print("--- ЗАПУСК КОНТРОЛЛЕРА (v14: Mana System Integration) ---")
local player = Players.LocalPlayer
local gui = script.Parent
local hotbar = gui:WaitForChild("Hotbar")
local menuFrame = gui:WaitForChild("AbilityMenu")
local openMenuBtn = gui:WaitForChild("OpenMenuBtn")
local AbilitiesFolder = ReplicatedStorage:WaitForChild("Abilities")
local resetButton = menuFrame:FindFirstChild("ResetButton")
-- ==============================================================
-- 1. ФУНКЦИЯ ВИЗУАЛЬНОГО КУЛДАУНА
-- ==============================================================
local function PlayCooldownAnimation(slotBtn, duration)
local cdFrame = slotBtn:FindFirstChild("CooldownOverlay")
if not cdFrame then
cdFrame = Instance.new("Frame")
cdFrame.Name = "CooldownOverlay"
cdFrame.Size = UDim2.new(1, 0, 1, 0)
cdFrame.Position = UDim2.new(0,0,0,0)
cdFrame.BackgroundColor3 = Color3.new(0, 0, 0)
cdFrame.BackgroundTransparency = 0.3
cdFrame.ZIndex = 10
cdFrame.Parent = slotBtn
local corner = Instance.new("UICorner")
corner.CornerRadius = UDim.new(0, 8)
corner.Parent = cdFrame
local text = Instance.new("TextLabel")
text.Name = "TimerText"
text.Size = UDim2.new(0.5, 0, 0.5, 0)
text.Position = UDim2.new(0.25, 0, 0.25, 0)
text.BackgroundTransparency = 1
text.TextColor3 = Color3.new(1, 1, 1)
text.TextScaled = true
text.Font = Enum.Font.GothamBold
text.ZIndex = 11
text.Parent = cdFrame
end
local textLabel = cdFrame.TimerText
cdFrame.Visible = true
task.spawn(function()
local startTime = tick()
while tick() - startTime < duration do
local timeLeft = duration - (tick() - startTime)
if timeLeft < 1 then
textLabel.Text = string.format("%.1f", timeLeft)
else
textLabel.Text = math.ceil(timeLeft)
end
task.wait(0.1)
end
cdFrame.Visible = false
end)
end
-- ==============================================================
-- 2. ЛОГИКА СБРОСА
-- ==============================================================
local currentLoadout = {}
local cooldowns = {}
if resetButton then
resetButton.MouseButton1Click:Connect(function()
currentLoadout = {}
for _, child in pairs(hotbar:GetChildren()) do
if child:IsA("ImageButton") or child:IsA("TextButton") then
child.Image = ""
local overlay = child:FindFirstChild("CooldownOverlay")
if overlay then overlay.Visible = false end
end
end
end)
end
-- ==============================================================
-- 3. ЗАГРУЗКА И НАСТРОЙКА СЛОТОВ
-- ==============================================================
openMenuBtn.MouseButton1Click:Connect(function()
menuFrame.Visible = not menuFrame.Visible
end)
local AbilityModules = {}
local selectedAbilityName = nil
for _, module in pairs(AbilitiesFolder:GetChildren()) do
if module:IsA("ModuleScript") then
local success, result = pcall(function() return require(module) end)
if success then
AbilityModules[module.Name] = result
local btnName = module.Name .. "Icon"
local btn = menuFrame:FindFirstChild(btnName)
if btn then
btn.MouseButton1Click:Connect(function()
selectedAbilityName = module.Name
print("🔵 ВЫБРАНО: " .. module.Name)
end)
end
end
end
end
for _, child in pairs(hotbar:GetChildren()) do
if child:IsA("ImageButton") or child:IsA("TextButton") then
child.MouseButton1Click:Connect(function()
if selectedAbilityName then
local module = AbilityModules[selectedAbilityName]
if not module or not module.Info then return end
for slot, ability in pairs(currentLoadout) do
if ability == selectedAbilityName then
currentLoadout[slot] = nil
local oldBtn = hotbar:FindFirstChild(slot)
if oldBtn then oldBtn.Image = "" end
end
end
currentLoadout[child.Name] = selectedAbilityName
child.Image = module.Info.Icon
print("🎉 УСПЕХ! " .. selectedAbilityName .. " -> " .. child.Name)
selectedAbilityName = nil
end
end)
end
end
-- ==============================================================
-- 4. АКТИВАЦИЯ С ПРОВЕРКОЙ МАНЫ
-- ==============================================================
local ControllerAPI = {}
function ControllerAPI.ShowNotification(text)
StarterGui:SetCore("SendNotification", {Title = "Ability"; Text = text; Duration = 2;})
end
local keyMap = {
[Enum.KeyCode.E] = "Slot1", [Enum.KeyCode.R] = "Slot2",
[Enum.KeyCode.X] = "Slot3", [Enum.KeyCode.F] = "Slot4",
[Enum.KeyCode.V] = "Slot5", [Enum.KeyCode.C] = "Slot6"
}
UserInputService.InputBegan:Connect(function(input, gp)
if gp then return end
local slotName = keyMap[input.KeyCode]
if slotName then
local abilityName = currentLoadout[slotName]
if abilityName and AbilityModules[abilityName] then
local module = AbilityModules[abilityName]
-- [НОВОЕ] ПРОВЕРКА МАНЫ ПЕРЕД НАЖАТИЕМ
local char = player.Character
if char then
local currentMana = char:GetAttribute("Mana") or 0
local manaCost = module.Info.ManaCost or 0
if currentMana < manaCost then
ControllerAPI.ShowNotification("Мана: " .. math.floor(currentMana) .. "/" .. manaCost)
return -- ОТМЕНА, ЕСЛИ НЕТ МАНЫ
end
end
-- Проверка Кулдауна
local lastTime = cooldowns[abilityName] or 0
local cdTime = module.Info.Cooldown or 0
if tick() - lastTime < cdTime then return end
-- Активация
local success = module.Activate(ControllerAPI)
if success ~= false then
cooldowns[abilityName] = tick()
local slotBtn = hotbar:FindFirstChild(slotName)
if slotBtn then
PlayCooldownAnimation(slotBtn, cdTime)
end
end
end
end
end)