Files
PlaneBuilding/scripts/gui/ToolScript.lua
T

182 lines
5.4 KiB
Lua

local StarterGui = game:GetService("StarterGui")
StarterGui:SetCoreGuiEnabled(Enum.CoreGuiType.Backpack, false)
local frame = script.Parent
frame.Visible = true
local input = game:GetService("UserInputService")
local player = game.Players.LocalPlayer
local backpack = player.Backpack
local stroke = script:WaitForChild("UIStroke")
local currentTool = nil
local tools = {}
local frames = {}
local function isToolRegistered(tool) return tools[tool] end
local function getToolFrame(tool) return frames[tool] end
local function stockTool(tool)
tool.Parent = backpack
stroke.Parent = script
stroke.Transparency = 1
frames[tool].Deselected:Fire()
end
local index = 0
local function setTool(tool)
if currentTool then stockTool(currentTool) end -- If there is already a tool equipped, dequip it
if currentTool == tool then currentTool = nil return end -- If this tool is already equipped, remove it and stop
if tonumber(tool.Name) then index = tonumber(tool.Name) end
frames[tool].Selected:Fire()
tool.Parent = player.Character -- Equip the new tool
stroke.Parent = frames[tool]
stroke.Transparency = 0.2
currentTool = tool
end
local nameToInteger = {
["One"] = 1,
["Two"] = 2,
["Three"] = 3,
["Four"] = 4,
["Five"] = 5,
["Six"] = 6,
["Seven"] = 7,
["Eight"] = 8,
["Nine"] = 9
}
input.InputBegan:Connect(function(input,irrelevant)
if not irrelevant then
local tools = 0
for _,item in pairs(frame.ScrollingFrame:GetChildren()) do
if item:FindFirstChild("ToolReference") then tools = tools + 1 end
end
local inputted = false
if input.UserInputType == Enum.UserInputType.Keyboard then
local number = nameToInteger[input.KeyCode.Name]
if number then inputted = true index = number end
elseif input.KeyCode == Enum.KeyCode.ButtonR1 then
inputted = true
index = index + 1
elseif input.KeyCode == Enum.KeyCode.ButtonL1 then
inputted = true
index = index - 1
end
index = math.clamp(index,0,tools+1)
if not inputted then return end
local toolFrame = frame.ScrollingFrame:FindFirstChild(tostring(index))
if toolFrame then
setTool(toolFrame.ToolReference.Value)
else
if currentTool then stockTool(currentTool) currentTool = nil end
end
end
end)
local function createToolFrame(tool)
local toolFrame = frame.ScrollingFrame.Template.Tool:Clone()
toolFrame.ToolReference.Value = tool
local layout = tool:WaitForChild("LayoutOrderValue",1)
if layout then layout = layout.Value
else layout = #frames end
toolFrame.LayoutOrder = layout
frames[tool] = toolFrame
tools[tool] = tool
local clone = tool:Clone()
for _,child in pairs(clone:GetChildren()) do
if child:IsA("Script") then
child:Destroy()
end
end
toolFrame.Parent = frame.ScrollingFrame
toolFrame.Visible = true
toolFrame.Name = tostring(toolFrame.LayoutOrder)
local viewport = toolFrame.ViewportFrame
viewport.Name = clone.Name
clone.Parent = viewport
local camera = Instance.new("Camera")
viewport.CurrentCamera = camera
camera.Parent = viewport
local label = toolFrame.TextLabel
label.Text = tool.Name
local cframe,size = clone:GetBoundingBox()
local cameraRotation = 45
local distance = size.Magnitude
local function rotateCamera() -- To constantly spin the tool view
camera.CFrame = CFrame.new(cframe.Position) * CFrame.fromEulerAnglesYXZ(-0.3,math.rad(cameraRotation),0)
camera.CFrame = camera.CFrame + camera.CFrame.LookVector * -(distance/1.2)
end
rotateCamera() -- To initialise the camera CFrame once
local mouseInside = 0 -- Rotate camera while the mouse is inside the tool
local mouseEnter = function(no_back)
mouseInside = mouseInside + 1
if not no_back then toolFrame.BackgroundColor3 = Color3.new(0.75,0.75,0.75) end
if mouseInside == 1 then while wait() and mouseInside > 0 do
cameraRotation = cameraRotation + 1.5 * mouseInside
rotateCamera()
end end
end
local mouseLeave = function(no_back)
mouseInside = mouseInside - 1
if not no_back then toolFrame.BackgroundColor3 = Color3.new(1,1,1) end
end
viewport.MouseEnter:Connect(mouseEnter)
viewport.MouseLeave:Connect(mouseLeave)
toolFrame.Selected.Event:Connect(mouseEnter)
toolFrame.Deselected.Event:Connect(mouseLeave)
return toolFrame
end
local function unregisterTool(tool)
--print(tool:GetFullName())
if currentTool == tool then stroke.Parent = script currentTool = nil end
if frames[tool] then frames[tool]:Destroy() end
frames[tool] = nil
tools[tool] = nil
end
local function registerTool(tool)
if isToolRegistered(tool) then return end -- Don't register an existing tool
tool.AncestryChanged:Connect(function(tool,parent) -- Event for when parent changes
if not (parent == player.Character or parent == backpack) then -- If the tool is not a parent of the character or backpack, it is dropped
unregisterTool(tool)
end
end)
createToolFrame(tool)
-- todo: save me
frames[tool].InputEnded:Connect(function(inputObject) -- When the mouse button or touch is clicked (XBOX + VR CONTROL NEEDED)
if inputObject.UserInputType == Enum.UserInputType.MouseButton1 or inputObject.UserInputType == Enum.UserInputType.Touch then
setTool(tool)
end
end)
--[[frames[tool].TouchTap:Connect(function()
setTool(tool)
end)]]
end
game.Players.LocalPlayer.ChildAdded:Connect(function(child)
if currentTool then unregisterTool(currentTool) end
if child:IsA("Backpack") then backpack = child end
backpack.ChildAdded:Connect(registerTool)
backpack.ChildRemoved:Connect(registerTool)
end)
for _,tool in pairs(backpack:GetChildren()) do
registerTool(tool)
end