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

Can someone explain this Telekinesis?

Asked by
Xl5Xl5 65
8 years ago

Hey, I was wondering if someone could explain, function grab between line 85 and 128. especially if (obj:IsA"Part") or (obj:IsA"Seat") or (obj:IsA"SpawnLocation") then if (brickDistance(obj, pos) < grValue.Value) and (not obj.Anchored) and (h == nil) then and elseif (obj:IsA"Workspace" or obj:IsA"Model" or obj:IsA"Tool" or obj:IsA"Hat") and (obj ~= Player.Character) then Full script is below, so yeah lines between 85 and 128

Please help, I would like to know how this script work.

TelekinesisRadius = 12
GrabRadius = 14
ReloadTime = .5
MaxForce = 1100400

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

Hopperbin = script.Parent
Player = game.Players.LocalPlayer
BrickScript = waitForChild(Hopperbin, "BrickScript")

local debounce = false

local TKCF = nil

local grValue = Instance.new("NumberValue")
grValue.Value = GrabRadius
grValue.Name = "Grab Radius"
grValue.Archivable = false
grValue.Parent = Hopperbin

local tkrValue = Instance.new("NumberValue")
tkrValue.Value = TelekinesisRadius
tkrValue.Name = "Telekinesis Radius"
tkrValue.Archivable = false
tkrValue.Parent = Hopperbin

local rldValue = Instance.new("NumberValue")
rldValue.Value = ReloadTime
rldValue.Name = "Reload Time"
rldValue.Archivable = false
rldValue.Parent = Hopperbin

local maxFValue = Instance.new("NumberValue")
maxFValue.Value = MaxForce
maxFValue.Name = "Max Force"
maxFValue.Archivable = false
maxFValue.Parent = Hopperbin

--TKRadius = 32

TKPos = Vector3.new(0, 0, 0)

local totalMass = 0

function brickDistance(obj, pos)
    if (obj.Shape == 0) then
        return ((pos - obj.Position).magnitude - obj.Size.magnitude / 2)
    else
        local relPos = obj.CFrame:pointToObjectSpace(pos)
        local nearPos = relPos
        if (nearPos.x * 2 > obj.Size.x) then
            nearPos = Vector3.new(obj.Size.x / 2, nearPos.y, nearPos.z)
        elseif (nearPos.x * 2 < -obj.Size.x) then
            nearPos = Vector3.new(-obj.Size.x / 2, nearPos.y, nearPos.z)
        end
        if (nearPos.y * 2 > obj.Size.y) then
            nearPos = Vector3.new(nearPos.x, obj.Size.y / 2, nearPos.z)
        elseif (nearPos.y * 2 < -obj.Size.y) then
            nearPos = Vector3.new(nearPos.x, -obj.Size.y / 2, nearPos.z)
        end
        if (nearPos.z * 2 > obj.Size.z) then
            nearPos = Vector3.new(nearPos.x, nearPos.y, obj.Size.x / 2)
        elseif (nearPos.z * 2 < -obj.Size.z) then
            nearPos = Vector3.new(nearPos.x, nearPos.y, -obj.Size.x / 2)
        end
        return (nearPos - relPos).magnitude
    end
end

function drop()
    if TKCF ~= nil then
        TKCF:remove()
        TKCF = nil
    end
end

function grab(pos, obj, harmless, MaxForce)
    if (obj:IsA"Terrain") then return end
    if (obj:FindFirstChild("Telekinesis Influence") ~= nil) then    
        return 
    end
    if (obj:IsA"Part") or (obj:IsA"Seat") or (obj:IsA"SpawnLocation") then
        if (brickDistance(obj, pos) < grValue.Value) and (not obj.Anchored) and (h == nil) then
            local harm = obj:FindFirstChild("No TK Damage")
            local oldScript = obj:FindFirstChild("BrickScript")
            if oldScript ~= nil then
                oldScript:remove()
            end

            local BrickScriptCopy = BrickScript:Clone()
            BrickScriptCopy.Disabled = false
            BrickScriptCopy.Archivable = false

            if harmless or (harm ~= nil) then
                local noDamage = Instance.new("BoolValue")
                noDamage.Name = "No Damage"
                noDamage.Parent = BrickScriptCopy
            end

            local tag2 = Instance.new("ObjectValue")
            tag2.Name = "TK CFrame"
            tag2.Value = TKCF
            tag2.Parent = BrickScriptCopy

            BrickScriptCopy.Parent = obj
            local mass = obj:GetMass()
            totalMass = totalMass + mass
            delay(0.1, function()   if (totalMass * 1400 > MaxForce) and (mass * MaxForce / totalMass < 91700) then local bp = obj:FindFirstChild("Telekinesis Influence")  if (bp ~= nil) then bp.maxForce = mass * Vector3.new(1, 1, 1) * MaxForce / totalMass    end end end)
        end
    elseif (obj:IsA"Workspace" or obj:IsA"Model" or obj:IsA"Tool" or obj:IsA"Hat") and (obj ~= Player.Character) then
        local h = obj:FindFirstChild("Humanoid")
        local harm = obj:FindFirstChild("No TK Damage")
        if (h == nil) or (h.Health <= 0) then
            local list = obj:GetChildren()
            for x = 1, #list do
                grab(pos, list[x], (harm ~= nil) or harmless, MaxForce)
            end
        end
    end
end


function onButton1Down(mouse)
    if debounce then
        return 
    end
    local newBrickScript = Hopperbin:FindFirstChild("BrickScript")
    if Hopperbin:FindFirstChild("BrickScript") ~= nil then
        BrickScript = newBrickScript
    end
    drop()
    local char = Player.Character
    if char ~= nil then
        local human = char.Humanoid
        if (human == nil) or (human.Health <= 0) then
            return 
        end
    else
        return 
    end
    TKCF = Instance.new("CFrameValue")
    TKCF.Name = "TK CFrame"
    TKCF.Parent = Hopperbin

    local relPos = mouse.Hit.p - Player.Character.PrimaryPart.Position
    if (relPos.magnitude > tkrValue.Value) then
        relPos = relPos.unit * tkrValue.Value
    end
    totalMass = 0
    grab(Player.Character.PrimaryPart.Position + relPos, workspace, false, maxFValue.Value)
    mouse.Icon = "rbxasset://textures\\GunWaitCursor.png"
end

function onButton1Up(mouse)
    if (TKCF ~= nil) then
        drop()
        debounce = true
        wait(rldValue.Value)
        mouse.Icon = "rbxasset://textures\\GunCursor.png"
        debounce = false
    end
end

function updatePos(mouse)
    if (TKCF ~= nil) then
        local char = Player.Character
        if (char ~= nil) then
            local human = char.Humanoid
            if (human == nil) or (human.Health <= 0) then
                drop()
                return 
            end
        else
            drop()
            return 
        end
        local mouseCF = mouse.Hit
        TKPos = mouseCF.lookVector * tkrValue.Value
        if (TKPos.y < -4.5) then
            TKPos = TKPos * Vector3.new(1, 0, 1) + Vector3.new(0, -4.5, 0)
        end
        TKPos = TKPos + Player.Character.PrimaryPart.Position
        TKCF.Value = CFrame.new(TKPos, TKPos + mouseCF.lookVector)
    end
end

function onSelected(mouse)
    mouse.Icon = "rbxasset://textures\\GunCursor.png"
    mouseConnection = mouse.Button1Down:connect(function() onButton1Down(mouse) end)
    mouse.Button1Up:connect(function() onButton1Up(mouse) end)
    mouse.Idle:connect(function() updatePos(mouse) end)
    mouse.Move:connect(function() updatePos(mouse) end)
    mouse.KeyDown:connect(function(inst)
        local key = inst:lower()
        if key == "q" then
            tkrValue.Value = tkrValue.Value - 5
        elseif key == "e" then
            tkrValue.Value = tkrValue.Value + 5
        end
    end)
end

function onDeselected()
    if (mouseConnection ~= nil) then
        mouseConnection:disconnect()
    end
    drop()
end

selectionConnection = Hopperbin.Selected:connect(onSelected)
Hopperbin.Deselected:connect(onDeselected)

Thanks for reading!

1 answer

Log in to vote
0
Answered by
1waffle1 2908 Trusted Badge of Merit Moderation Voter Community Moderator
8 years ago

That function is indexing recursively, searching for parts. It isn't doing this very nicely, though.

x:IsA("BasePart") is true if x is a Part, WedgePart, TrussPart, CornerWedgePart, Seat, VehicleSeat, SpawnLocation, etc. Anything under this superclass.

The function checks if it's a part, and if it isn't a part, it searches through each object inside to see if they are parts, and so on until every part is found. This is recursion. Here's a cleaner example:

function GetAllParts(x,list)
    for _,v in pairs(x:GetChildren())do
        if v:IsA("BasePart")then
            list[#list+1]=v
        else
            GetAllParts(v,list)
        end
    end
    return list
end

local list=GetAllParts(workspace,{})
Ad

Answer this question