Scripting Helpers is winding down operations and is now read-only. More info→
Ad
Log in to vote
0

How do I prevent this NPC regen from freezing the game?

Asked by
Xl5Xl5 65
8 years ago

How can I prevent the game from freezing just before the NPC respawns?

Instead of it just cloning itself all the time and backing it up, would it be wise for it clone from lighting? Anyway here is the script that is inside the NPC

The top part of the code (function Respawn) is whats making NPC freezing the game before respawn. Also Output says nothing about this

Thanks!

local Model = script.Parent
Model:MakeJoints()
wait()
Model:MakeJoints()
local Backup = Model:clone()
Backup:MakeJoints()
wait()
Backup:MakeJoints()

function Respawn()
    Model:breakJoints()
    script.Parent = Model.Parent
    wait(5)
    if (Model ~= nil) then 
        Model:Destroy()
    end 
    Backup:MakeJoints()
    wait()
    Backup:MakeJoints()
    Model = Backup:clone()
    Model:MakeJoints()
    wait()
    Model:MakeJoints()
    local spawn = game:GetService("Workspace"):GetChildren()
    wait()
    if (Model.Configuration["Do not spawn on SpawnLocations?"].Value == false) then 
        mvspawn = false
        for i = 1, #spawn do 
            if (spawn[i].ClassName == "SpawnLocation") then
                team = game:GetService("Teams"):GetChildren()[Model.Configuration["Attack specific team? (Read the help.)"].Value]
                if (team ~= nil) then 
                    if (team.ClassName == "Team") then
                        if (spawn[i].TeamColor == team.TeamColor) then
                            delay(0.,function()  
                                Model:MoveTo(spawn[i].Position)
                            end)
                            fft__ = spawn[i].Duration
                            mvspawn = true
                        end
                    else
                        print("Invalid team specified.")
                    end
                else
                    if (Model.Configuration["Attack specific team? (Read the help.)"].Value ~= 0) then 
                        print("Non-existant team specified.")
                        delay(0,function()  
                            Model:MoveTo(spawn[i].Position)
                        end)
                        fft__ = spawn[i].Duration
                    else
                        if (spawn[i].Neutral == true) then 
                            delay(0,function()  
                                Model:MoveTo(spawn[i].Position)
                            end)
                            fft__ = spawn[i].Duration
                            mvspawn = true
                        end 
                    end
                end
            end 
        end 
        if (mvspawn == false) then 
            delay(0,function()  
                Model:MoveTo(Vector3.new(0,10,0))
            end)
            fft__ = spawn[i].Duration
        end
    end 
    Model.Parent = script.Parent
    Model:makeJoints()
    wait(0)
    script:Destroy()
end

Model.Humanoid.Died:connect(Respawn)

function waitForChild(parent, childName)
    local child = parent:findFirstChild(childName)

    if child then
        return child
    end

    while true do
        print(childName)

        child = parent.ChildAdded:wait()

        if child.Name==childName then
            return child
        end
    end
end

-- declarations

local Figure = script.Parent
local Head = waitForChild(Figure, "Head")
local Humanoid = waitForChild(Figure, "Humanoid")

Figure.PrimaryPart = Head

-- ANIMATION

function Joint(Name, Part0, Part1, C0, C1, MaxVelocity)
    local Motor = Instance.new("Motor")

    Motor.C0 = C0
    Motor.C1 = C1
    Motor.MaxVelocity = MaxVelocity
    Motor.Name = Name
    Motor.Parent = Part0
    Motor.Part0 = Part0
    Motor.Part1 = Part1
end

-- declarations

local Torso = waitForChild(Figure, "Torso")
local LeftArm = waitForChild(Figure, "Left Arm")
local LeftLeg = waitForChild(Figure, "Left Leg")
local RightArm = waitForChild(Figure, "Right Arm")
local RightLeg = waitForChild(Figure, "Right Leg")

local Joints = {
{"Right Shoulder", Torso, RightArm, CFrame.new(1, 0.5, 0, 0, 0, 1, 0, 1, 0, -1, -0, -0), CFrame.new(-0.5, 0.5, 0, 0, 0, 1, 0, 1, 0, -1, -0, -0), 0.5},
{"Left Shoulder", Torso, LeftArm, CFrame.new(-1, 0.5, 0, -0, -0, -1, 0, 1, 0, 1, 0, 0), CFrame.new(0.5, 0.5, 0, -0, -0, -1, 0, 1, 0, 1, 0, 0), 0.5},
{"Right Hip", Torso, RightLeg, CFrame.new(1, -1, 0, 0, 0, 1, 0, 1, 0, -1, -0, -0), CFrame.new(0.5, 1, 0, 0, 0, 1, 0, 1, 0, -1, -0, -0), 0.10000000149012},
{"Left Hip", Torso, LeftLeg, CFrame.new(-1, -1, 0, -0, -0, -1, 0, 1, 0, 1, 0, 0), CFrame.new(-0.5, 1, 0, -0, -0, -1, 0, 1, 0, 1, 0, 0), 0.10000000149012},
{"Neck", Torso, Head, CFrame.new(0, 1, 0, -1, -0, -0, 0, 0, 1, 0, 1, 0), CFrame.new(0, -0.5, 0, -1, -0, -0, 0, 0, 1, 0, 1, 0), 0.10000000149012}}

Torso:breakJoints()

for _, v in pairs(Joints) do
    Joint(unpack(v))
end

local RightShoulder = waitForChild(Torso, "Right Shoulder")
local LeftShoulder = waitForChild(Torso, "Left Shoulder")
local RightHip = waitForChild(Torso, "Right Hip")
local LeftHip = waitForChild(Torso, "Left Hip")
local Neck = waitForChild(Torso, "Neck")
local Humanoid = waitForChild(Figure, "Humanoid")
local pose = "Standing"

local toolAnim = "None"
local toolAnimTime = 0

-- functions

function onRunning(speed)
    if speed>0 then
        pose = "Running"
    else
        pose = "Standing"
    end
end

function onDied()
    pose = "Dead"
end

function onJumping()
    pose = "Jumping"
end

function onClimbing()
    pose = "Climbing"
end

function onGettingUp()
    pose = "GettingUp"
end

function onFreeFall()
    pose = "FreeFall"
end

function onFallingDown()
    pose = "FallingDown"
end

function onSeated()
    pose = "Seated"
end

function onPlatformStanding()
    pose = "PlatformStanding"
end

function moveJump()
    RightShoulder.MaxVelocity = 0.5
    LeftShoulder.MaxVelocity = 0.5
    RightShoulder.DesiredAngle = 3.14
    LeftShoulder.DesiredAngle = -3.14
    RightHip.DesiredAngle = 0
    LeftHip.DesiredAngle = 0
end


-- same as jump for now

function moveFreeFall()
    RightShoulder.MaxVelocity = 0.5
    LeftShoulder.MaxVelocity = 0.5
    RightShoulder.DesiredAngle = 3.14
    LeftShoulder.DesiredAngle = -3.14
    RightHip.DesiredAngle = 0
    LeftHip.DesiredAngle = 0
end

function moveSit()
    RightShoulder.MaxVelocity = 0.15
    LeftShoulder.MaxVelocity = 0.15
    RightShoulder.DesiredAngle = 3.14 /2
    LeftShoulder.DesiredAngle = -3.14 /2
    RightHip.DesiredAngle = 3.14 /2
    LeftHip.DesiredAngle = -3.14 /2
end

function getTool()  
    for _, kid in ipairs(Figure:GetChildren()) do
        if kid.className == "Tool" then return kid end
    end
    return nil
end

function getToolAnim(tool)
    for _, c in ipairs(tool:GetChildren()) do
        if c.Name == "toolanim" and c.className == "StringValue" then
            return c
        end
    end
    return nil
end

function animateTool()

    if (toolAnim == "None") then
        RightShoulder.DesiredAngle = 1.57
        return
    end

    if (toolAnim == "Slash") then
        RightShoulder.MaxVelocity = 0.5
        RightShoulder.DesiredAngle = 0
        return
    end

    if (toolAnim == "Lunge") then
        RightShoulder.MaxVelocity = 0.5
        LeftShoulder.MaxVelocity = 0.5
        RightHip.MaxVelocity = 0.5
        LeftHip.MaxVelocity = 0.5
        RightShoulder.DesiredAngle = 1.57
        LeftShoulder.DesiredAngle = 1.0
        RightHip.DesiredAngle = 1.57
        LeftHip.DesiredAngle = 1.0
        return
    end
end

function move(time)
    local amplitude
    local frequency

    if (pose == "Jumping") then
        moveJump()
        return
    end

    if (pose == "FreeFall") then
        moveFreeFall()
        return
    end

    if (pose == "Seated") then
        moveSit()
        return
    end

    local climbFudge = 0

    if (pose == "Running") then
        RightShoulder.MaxVelocity = 0.15
        LeftShoulder.MaxVelocity = 0.15
        amplitude = 1
        frequency = 9
    elseif (pose == "Climbing") then
        RightShoulder.MaxVelocity = 0.5 
        LeftShoulder.MaxVelocity = 0.5
        amplitude = 1
        frequency = 9
        climbFudge = 3.14
    else
        amplitude = 0.1
        frequency = 1
    end

    desiredAngle = amplitude * math.sin(time*frequency)

    RightShoulder.DesiredAngle = desiredAngle + climbFudge
    LeftShoulder.DesiredAngle = desiredAngle - climbFudge
    RightHip.DesiredAngle = -desiredAngle
    LeftHip.DesiredAngle = -desiredAngle


    local tool = getTool()

    if tool then

        animStringValueObject = getToolAnim(tool)

        if animStringValueObject then
            toolAnim = animStringValueObject.Value
            -- message recieved, delete StringValue
            animStringValueObject.Parent = nil
            toolAnimTime = time + .3
        end

        if time > toolAnimTime then
            toolAnimTime = 0
            toolAnim = "None"
        end

        animateTool()


    else
        toolAnim = "None"
        toolAnimTime = 0
    end
end


-- connect events

Humanoid.Died:connect(onDied)
Humanoid.Running:connect(onRunning)
Humanoid.Jumping:connect(onJumping)
Humanoid.Climbing:connect(onClimbing)
Humanoid.GettingUp:connect(onGettingUp)
Humanoid.FreeFalling:connect(onFreeFall)
Humanoid.FallingDown:connect(onFallingDown)
Humanoid.Seated:connect(onSeated)
Humanoid.PlatformStanding:connect(onPlatformStanding)

-- util

function waitForChild(parent, childName)
    local child = parent:findFirstChild(childName)
    if child then return child end
    while true do
        child = parent.ChildAdded:wait()
        if child.Name==childName then return child end
    end
end

function newSound(id)
    local sound = Instance.new("Sound")
    sound.SoundId = id
    sound.archivable = false
    sound.Parent = script.Parent.Head
    return sound
end

-- declarations

local sDied = newSound("rbxasset://sounds/uuhhh.wav")
local sFallingDown = newSound("rbxasset://sounds/splat.wav")
local sFreeFalling = newSound("rbxasset://sounds/swoosh.wav")
local sGettingUp = newSound("rbxasset://sounds/hit.wav")
local sJumping = newSound("rbxasset://sounds/button.wav")
local sRunning = newSound("rbxasset://sounds/bfsl-minifigfoots1.mp3")
sRunning.Looped = true

-- functions

function onSoundDied()
    sDied:Play()
end

function onState(state, sound)
    if state then
        sound:Play()
    else
        sound:Pause()
    end
end

function onSoundRunning(speed)
    if speed>0 then
        sRunning:Play()
    else
        sRunning:Pause()
    end
end

-- connect up

Humanoid.Died:connect(onSoundDied)
Humanoid.Running:connect(onSoundRunning)
Humanoid.Jumping:connect(function(state) onState(state, sJumping) end)
Humanoid.GettingUp:connect(function(state) onState(state, sGettingUp) end)
Humanoid.FreeFalling:connect(function(state) onState(state, sFreeFalling) end)
Humanoid.FallingDown:connect(function(state) onState(state, sFallingDown) end)

local runService = game:service("RunService");

delay(0, function() 
    while Figure.Parent~=nil do
        local _, time = wait(0.1)
        move(time)
    end
end)

-- regeneration
while true do
    local s = wait(1)
    local health = Humanoid.Health

    if health > 0 and health < Humanoid.MaxHealth then
        health = health + 0.01 * s * Humanoid.MaxHealth

        if health * 1.05 < Humanoid.MaxHealth then
            Humanoid.Health = health
        else
            Humanoid.Health = Humanoid.MaxHealth
        end
    end
end
0
You need a wait in the for loop that you start on line 28 and also I have no idea what you're doing with that "delay(0.," part FearMeIAmLag 1161 — 8y

Answer this question