Super-Nostalgia-Zone/Server/Scripts/Regeneration.server.lua

98 lines
2.2 KiB
Lua

local CollectionService = game:GetService("CollectionService")
local ServerStorage = game:GetService("ServerStorage")
local regen = ServerStorage:FindFirstChild("Regeneration")
if regen then
local REGEN_TIME = 800
local REGEN_DELAY = 4
if regen:FindFirstChild("RegenTime") then
REGEN_TIME = regen.RegenTime.Value
end
if regen:FindFirstChild("RegenDelay") then
REGEN_DELAY = regen.RegenDelay.Value
end
local ready = Instance.new("BoolValue")
ready.Name = "Ready"
ready.Parent = regen
local bevelCache = ServerStorage:WaitForChild("BevelCache")
local bevelsReady = bevelCache:WaitForChild("BevelsReady")
local function isLodPart(part)
return part and CollectionService:HasTag(part, "PartLOD")
end
local function setupModelRegen(model, title)
local title = title or model.Name
local parent = model.Parent
local backup = model:Clone()
local message, text
if typeof(title) == "string" then
message = Instance.new("Message")
text = "Regenerating " .. title .. "..."
end
spawn(function ()
while not bevelsReady.Value do
bevelsReady.Changed:Wait()
end
local requestSolve = bevelCache:FindFirstChild("RequestSolve")
if requestSolve then
requestSolve:Invoke(backup)
end
while wait(REGEN_TIME * (1 - (math.random() * .8))) do
local cooldown = 0
if message then
message.Text = text
message.Parent = workspace
end
model:Destroy()
wait(REGEN_DELAY)
model = backup:Clone()
model.Parent = parent
for _,inst in pairs(model:GetDescendants()) do
if inst:IsA("BasePart") then
workspace:JoinToOutsiders({inst}, Enum.JointCreationMode.All)
end
end
for _,joint in pairs(model:GetDescendants()) do
if joint:IsA("JointInstance") and joint.Name:sub(-12) == "Strong Joint" then
if isLodPart(joint.Part0) or isLodPart(joint.Part1) then
joint:Destroy()
end
end
end
if message then
message.Parent = nil
end
end
end)
end
for _,v in pairs(regen:GetChildren()) do
if v:IsA("ObjectValue") then
if v.Name == "" then
setupModelRegen(v.Value, true)
else
setupModelRegen(v.Value, v.Name)
end
end
end
ready.Value = true
end