Super-Nostalgia-Zone/UI/SafeChat/SafeChat.client.lua

199 lines
5.4 KiB
Lua

local UserInputService = game:GetService("UserInputService")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local GuiService = game:GetService("GuiService")
local camera = workspace.CurrentCamera
local resUpdate = camera:GetPropertyChangedSignal("ViewportSize")
local safeChat = script.Parent
local chatButton = safeChat:WaitForChild("ChatButton")
local click = chatButton:WaitForChild("Click")
local gamepadHint = chatButton:WaitForChild("Hint")
local IMG_CHAT = "rbxassetid://991182833"
local IMG_CHAT_DN = "rbxassetid://991182832"
local IMG_CHAT_OVR = "rbxassetid://991182834"
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- Fetch Tree Data
local mSafeChatTree = ReplicatedStorage:WaitForChild("SafeChat")
local safeChatTree = require(mSafeChatTree)
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- Safe Chat Tree
local chatRemote = ReplicatedStorage:WaitForChild("ChatRemote")
local templates = safeChat:WaitForChild("Templates")
local tempBranch = templates:WaitForChild("TempBranch")
local tempButton = templates:WaitForChild("TempButton")
local isActivated = false
local rootTree
local function recursivelyDeactivateTree(obj)
if obj:IsA("Frame") then
obj.Visible = false
elseif obj:IsA("TextButton") then
obj.BackgroundColor3 = Color3.new(1,1,1)
end
for _,v in pairs(obj:GetChildren()) do
recursivelyDeactivateTree(v)
end
end
local function deactivateRootTree()
isActivated = false
chatButton.Image = IMG_CHAT
recursivelyDeactivateTree(rootTree)
if GuiService.SelectedObject then
GuiService.SelectedObject = nil
GuiService:RemoveSelectionGroup("SafeChatNav")
end
end
local function activateRootTree()
isActivated = true
rootTree.Visible = true
chatButton.Image = IMG_CHAT_DN
if UserInputService:GetLastInputType() == Enum.UserInputType.Gamepad1 then
GuiService:AddSelectionParent("SafeChatNav", chatButton)
GuiService.SelectedObject = chatButton
end
end
local function assembleTree(tree)
local treeFrame = tempBranch:Clone()
treeFrame.Name = "Branches"
local currentBranch
for i, branch in ipairs(tree.Branches) do
local branches = branch.Branches
local label = branch.Label
local button = tempButton:Clone()
button.Name = label
button.Text = label
button.LayoutOrder = i
button.Visible = true
local branchFrame = assembleTree(branch)
branchFrame.Parent = button
button.Parent = treeFrame
local function onEnter()
if currentBranch then
recursivelyDeactivateTree(currentBranch)
end
currentBranch = button
button.BackgroundColor3 = Color3.new(0.7, 0.7, 0.7)
branchFrame.Visible = true
end
local function onActivate()
local submit = true
if UserInputService.TouchEnabled then
if not branchFrame.Visible and #branchFrame:GetChildren() > 1 then
branchFrame.Visible = true
submit = false
end
end
if submit then
click:Play()
deactivateRootTree()
chatRemote:FireServer(label)
end
end
button.MouseEnter:Connect(onEnter)
button.SelectionGained:Connect(onEnter)
button.MouseButton1Down:Connect(onActivate)
end
return treeFrame
end
rootTree = assembleTree(safeChatTree)
rootTree.Parent = chatButton
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- Button State
local isActivated = false
local isHovering = false
do
local function onMouseEnter()
if not isActivated then
chatButton.Image = IMG_CHAT_OVR
end
isHovering = true
end
local function onMouseLeave()
if not isActivated then
chatButton.Image = IMG_CHAT
end
isHovering = false
end
local function onMouseDown()
chatButton.Image = IMG_CHAT_DN
end
local function onMouseUp()
if isHovering then
activateRootTree()
end
end
local function onInputBegan(input,gameProcessed)
if input.UserInputType == Enum.UserInputType.MouseButton1 and not gameProcessed and isActivated then
deactivateRootTree()
end
end
chatButton.MouseEnter:Connect(onMouseEnter)
chatButton.MouseLeave:Connect(onMouseLeave)
chatButton.MouseButton1Up:Connect(onMouseUp)
chatButton.MouseButton1Down:Connect(onMouseDown)
UserInputService.InputBegan:Connect(onInputBegan)
end
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- Gamepad Stuff
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
if GuiService:IsTenFootInterface() then
gamepadHint.Visible = true
else
local function onLastInputTypeChanged(inputType)
gamepadHint.Visible = (inputType.Name == "Gamepad1")
end
onLastInputTypeChanged(UserInputService:GetLastInputType())
UserInputService.LastInputTypeChanged:Connect(onLastInputTypeChanged)
end
local function onInputBegan(input)
if input.KeyCode == Enum.KeyCode.ButtonX then
activateRootTree()
end
end
UserInputService.InputBegan:Connect(onInputBegan)