199 lines
5.4 KiB
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)
|