local ReplicatedStorage = game:GetService("ReplicatedStorage")
local PentagramEvent = ReplicatedStorage:WaitForChild("PentagramEvent")
local PentagramModelTemplate = ReplicatedStorage:WaitForChild("PentagramModel")
-- === НАСТРОЙКА ЦЕНЫ ===
local MANA_COST = 50
local DURATION = 15
local DAMAGE_PERCENT = 0.05
local SPAWN_SPEED = 0.1
local SPAWN_SOUND_ID = "rbxassetid://4853357922"
local ENTER_SOUND_ID = "rbxassetid://4028366601"
print("🔥 Скрипт Пентаграммы (с Маной) загружен")
local savedAppearance = {}
-- Функция окаменения (сокращена для краткости, она та же самая)
local function TurnToStone(char, state)
local hum = char:FindFirstChild("Humanoid")
if state == true then
if not savedAppearance[char] then
local d = {P={}, C={}}; for _,p in pairs(char:GetDescendants()) do if p:IsA("BasePart") and p.Name~="HumanoidRootPart" then d.P[p]={C=p.Color,M=p.Material,T=p.Transparency,Tx=(p:IsA("MeshPart") and p.TextureID) or nil}; p.Material=Enum.Material.Slate; p.Color=Color3.new(0.35,0.35,0.35); p.Anchored=true; if p:IsA("MeshPart") then p.TextureID="" end; local m=p:FindFirstChildOfClass("SpecialMesh"); if m then d.P[m]={Tx=m.TextureId}; m.TextureId="" end end end
for _,o in pairs(char:GetChildren()) do if o:IsA("Shirt") or o:IsA("Pants") or o:IsA("ShirtGraphic") or o:IsA("BodyColors") then table.insert(d.C,o); o.Parent=nil end end
savedAppearance[char]=d
end
if hum then hum.WalkSpeed=0; hum.JumpPower=0 end
else
local d=savedAppearance[char]; if d then for o,p in pairs(d.P) do if o and o.Parent then if o:IsA("BasePart") then o.Color=p.C; o.Material=p.M; o.Transparency=p.T; o.Anchored=false; if p.Tx and o:IsA("MeshPart") then o.TextureID=p.Tx end elseif o:IsA("SpecialMesh") then o.TextureId=p.Tx end end end; for _,c in pairs(d.C) do if c then c.Parent=char end end; savedAppearance[char]=nil end
if hum then hum.WalkSpeed=16; hum.JumpPower=50 end
end
end
PentagramEvent.OnServerEvent:Connect(function(caster, targetPosition)
local casterChar = caster.Character
if not casterChar then return end
-- [СПИСАНИЕ МАНЫ]
local currentMana = casterChar:GetAttribute("Mana") or 0
if currentMana < MANA_COST then return end
casterChar:SetAttribute("Mana", currentMana - MANA_COST)
-- ЛОГИКА ПЕНТАГРАММЫ
local rayOrigin = targetPosition + Vector3.new(0, 5, 0)
local rayDirection = Vector3.new(0, -50, 0)
local rp = RaycastParams.new(); rp.FilterDescendantsInstances = {casterChar}
local res = workspace:Raycast(rayOrigin, rayDirection, rp)
local spawnPos = res and res.Position or targetPosition
local model = PentagramModelTemplate:Clone()
local allParts = {}
for _, part in pairs(model:GetDescendants()) do if part:IsA("BasePart") then part.Transparency=1; table.insert(allParts,part) end end
model.Parent = workspace
if model.PrimaryPart then model:SetPrimaryPartCFrame(CFrame.new(spawnPos)) else local z=model:FindFirstChild("Zone"); if z then z.CFrame=CFrame.new(spawnPos) end end
local zonePart = model:FindFirstChild("Zone")
if not zonePart then model:Destroy() return end
local sound = Instance.new("Sound", model.PrimaryPart or zonePart); sound.SoundId=SPAWN_SOUND_ID; sound.Volume=2; sound:Play()
task.spawn(function() for _,p in pairs(allParts) do if p.Name~="Zone" then p.Transparency=0 end task.wait(SPAWN_SPEED) end end)
local trappedEnemies = {}; local lastDamageTime = {}
task.spawn(function()
local startTime = tick()
local op = OverlapParams.new(); op.FilterDescendantsInstances = {model}; op.FilterType = Enum.RaycastFilterType.Exclude
while tick() - startTime < DURATION do
if not model or not model.Parent then break end
local parts = workspace:GetPartsInPart(zonePart, op)
local chars = {}
for _,p in pairs(parts) do local c=p.Parent; local h=c:FindFirstChild("Humanoid"); if h and h.Health>0 then chars[c]=true end end
if chars[casterChar] then
local ff=casterChar:FindFirstChild("PentagramShield"); if not ff then ff=Instance.new("ForceField"); ff.Name="PentagramShield"; ff.Visible=false; ff.Parent=casterChar end
else
local ff=casterChar:FindFirstChild("PentagramShield"); if ff then ff:Destroy() end
end
for c,_ in pairs(chars) do
if c~=casterChar then
if not trappedEnemies[c] then
TurnToStone(c, true); trappedEnemies[c]=true
local s=Instance.new("Sound", c.HumanoidRootPart); s.SoundId=ENTER_SOUND_ID; s:Play(); game.Debris:AddItem(s,2)
end
local now=tick(); if not lastDamageTime[c] or now-lastDamageTime[c]>=1 then c.Humanoid:TakeDamage(c.Humanoid.MaxHealth*DAMAGE_PERCENT); lastDamageTime[c]=now end
end
end
for c,_ in pairs(trappedEnemies) do if not chars[c] then TurnToStone(c, false); trappedEnemies[c]=nil end end
task.wait(0.1)
end
model:Destroy()
if casterChar then local ff=casterChar:FindFirstChild("PentagramShield"); if ff then ff:Destroy() end end
for c,_ in pairs(trappedEnemies) do TurnToStone(c, false) end
end)
end)