forked from aya/aya
343 lines
9.3 KiB
Lua
343 lines
9.3 KiB
Lua
--[[
|
|
Filename: TenFootInterface.lua
|
|
Written by: jeditkacheff
|
|
Version 1.0
|
|
Description: Setups up some special UI for ROBLOX TV gaming
|
|
--]]
|
|
-------------- CONSTANTS --------------
|
|
local HEALTH_GREEN_COLOR = Color3.new(27/255, 252/255, 107/255)
|
|
local DISPLAY_POS_INIT_INSET = 0
|
|
local DISPLAY_ITEM_OFFSET = 4
|
|
local FORCE_TEN_FOOT_INTERFACE = false
|
|
|
|
-------------- SERVICES --------------
|
|
local CoreGui = game:GetService("CoreGui")
|
|
local RobloxGui = CoreGui:WaitForChild("RobloxGui")
|
|
local UserInputService = game:GetService("UserInputService")
|
|
local GuiService = game:GetService("GuiService")
|
|
|
|
------------------ VARIABLES --------------------
|
|
local tenFootInterfaceEnabled = false
|
|
do
|
|
local platform = UserInputService:GetPlatform()
|
|
|
|
tenFootInterfaceEnabled = false
|
|
end
|
|
|
|
if FORCE_TEN_FOOT_INTERFACE then
|
|
tenFootInterfaceEnabled = true
|
|
end
|
|
|
|
local Util = {}
|
|
do
|
|
function Util.Create(instanceType)
|
|
return function(data)
|
|
local obj = Instance.new(instanceType)
|
|
for k, v in pairs(data) do
|
|
if type(k) == 'number' then
|
|
v.Parent = obj
|
|
else
|
|
obj[k] = v
|
|
end
|
|
end
|
|
return obj
|
|
end
|
|
end
|
|
end
|
|
|
|
local function CreateModule()
|
|
local this = {}
|
|
local nextObjectDisplayYPos = DISPLAY_POS_INIT_INSET
|
|
local displayStack = {}
|
|
|
|
-- setup base gui
|
|
local function createContainer()
|
|
if not this.Container then
|
|
this.Container = Util.Create'ImageButton'
|
|
{
|
|
Name = "TopRightContainer";
|
|
Size = UDim2.new(0, 350, 0, 100);
|
|
Position = UDim2.new(1,-360,0,10);
|
|
AutoButtonColor = false;
|
|
Image = "";
|
|
Active = false;
|
|
BackgroundTransparency = 1;
|
|
Parent = RobloxGui;
|
|
};
|
|
end
|
|
end
|
|
|
|
function removeFromDisplayStack(displayObject)
|
|
local moveUpFromHere = nil
|
|
|
|
for i = 1, #displayStack do
|
|
if displayStack[i] == displayObject then
|
|
moveUpFromHere = i + 1
|
|
break
|
|
end
|
|
end
|
|
|
|
local prevObject = displayObject
|
|
for i = moveUpFromHere, #displayStack do
|
|
local objectToMoveUp = displayStack[i]
|
|
objectToMoveUp.Position = UDim2.new(objectToMoveUp.Position.X.Scale, objectToMoveUp.Position.X.Offset,
|
|
objectToMoveUp.Position.Y.Scale, prevObject.AbsolutePosition.Y)
|
|
prevObject = objectToMoveUp
|
|
end
|
|
end
|
|
|
|
function addBackToDisplayStack(displayObject)
|
|
for i = 1, #displayStack do
|
|
if displayStack[i] == displayObject then
|
|
moveDownFromHere = i + 1
|
|
break
|
|
end
|
|
end
|
|
|
|
local prevObject = displayObject
|
|
for i = moveDownFromHere, #displayStack do
|
|
local objectToMoveDown = displayStack[i]
|
|
local nextDisplayPos = prevObject.AbsolutePosition.Y + prevObject.AbsoluteSize.Y + DISPLAY_ITEM_OFFSET
|
|
objectToMoveDown.Position = UDim2.new(objectToMoveDown.Position.X.Scale, objectToMoveDown.Position.X.Offset,
|
|
objectToMoveDown.Position.Y.Scale, nextDisplayPos)
|
|
prevObject = objectToMoveDown
|
|
end
|
|
end
|
|
|
|
function addToDisplayStack(displayObject)
|
|
local lastDisplayed = nil
|
|
if #displayStack > 0 then
|
|
lastDisplayed = displayStack[#displayStack]
|
|
end
|
|
displayStack[#displayStack + 1] = displayObject
|
|
|
|
local nextDisplayPos = DISPLAY_POS_INIT_INSET
|
|
if lastDisplayed then
|
|
nextDisplayPos = lastDisplayed.AbsolutePosition.Y + lastDisplayed.AbsoluteSize.Y + DISPLAY_ITEM_OFFSET
|
|
end
|
|
|
|
displayObject.Position = UDim2.new(displayObject.Position.X.Scale, displayObject.Position.X.Offset,
|
|
displayObject.Position.Y.Scale, nextDisplayPos)
|
|
|
|
createContainer()
|
|
displayObject.Parent = this.Container
|
|
|
|
displayObject.Changed:connect(function(prop)
|
|
if prop == "Visible" then
|
|
if not displayObject.Visible then
|
|
removeFromDisplayStack(displayObject)
|
|
else
|
|
addBackToDisplayStack(displayObject)
|
|
end
|
|
end
|
|
end)
|
|
end
|
|
|
|
function this:CreateHealthBar()
|
|
this.HealthContainer = Util.Create'Frame'{
|
|
Name = "HealthContainer";
|
|
Size = UDim2.new(1, -86, 0, 50);
|
|
Position = UDim2.new(0, 92, 0, 0);
|
|
BorderSizePixel = 0;
|
|
BackgroundColor3 = Color3.new(0,0,0);
|
|
BackgroundTransparency = 0.5;
|
|
};
|
|
|
|
local healthFillHolder = Util.Create'Frame'{
|
|
Name = "HealthFillHolder";
|
|
Size = UDim2.new(1, -10, 1, -10);
|
|
Position = UDim2.new(0, 5, 0, 5);
|
|
BorderSizePixel = 0;
|
|
BackgroundColor3 = Color3.new(1,1,1);
|
|
BackgroundTransparency = 1.0;
|
|
Parent = this.HealthContainer;
|
|
};
|
|
|
|
local healthFill = Util.Create'Frame'{
|
|
Name = "HealthFill";
|
|
Size = UDim2.new(1, 0, 1, 0);
|
|
Position = UDim2.new(0, 0, 0, 0);
|
|
BorderSizePixel = 0;
|
|
BackgroundTransparency = 0.0;
|
|
BackgroundColor3 = HEALTH_GREEN_COLOR;
|
|
Parent = healthFillHolder;
|
|
};
|
|
|
|
local healthText = Util.Create'TextLabel'{
|
|
Name = "HealthText";
|
|
Size = UDim2.new(0, 98, 0, 50);
|
|
Position = UDim2.new(0, -100, 0, 0);
|
|
BackgroundTransparency = 0.5;
|
|
BackgroundColor3 = Color3.new(0,0,0);
|
|
Font = Enum.Font.SourceSans;
|
|
FontSize = Enum.FontSize.Size36;
|
|
Text = "Health";
|
|
TextColor3 = Color3.new(1,1,1);
|
|
BorderSizePixel = 0;
|
|
Parent = this.HealthContainer;
|
|
};
|
|
|
|
local username = Util.Create'TextLabel'{
|
|
Visible = false
|
|
}
|
|
|
|
addToDisplayStack(this.HealthContainer)
|
|
createContainer()
|
|
|
|
return this.Container, username, this.HealthContainer, healthFill
|
|
end
|
|
|
|
function this:SetupTopStat()
|
|
local topStatEnabled = true
|
|
local displayedStat = nil
|
|
local displayedStatChangedCon = nil
|
|
local displayedStatParentedCon = nil
|
|
local leaderstatsChildAddedCon = nil
|
|
local tenFootInterfaceStat = nil
|
|
|
|
local function makeTenFootInterfaceStat()
|
|
if tenFootInterfaceStat then return end
|
|
|
|
tenFootInterfaceStat = Util.Create'Frame'{
|
|
Name = "OneStatFrame";
|
|
Size = UDim2.new(1, 0, 0, 36);
|
|
Position = UDim2.new(0, 0, 0, 0);
|
|
BorderSizePixel = 0;
|
|
BackgroundTransparency = 1;
|
|
};
|
|
local statName = Util.Create'TextLabel'{
|
|
Name = "StatName";
|
|
Size = UDim2.new(0.5,0,0,36);
|
|
BackgroundTransparency = 1;
|
|
Font = Enum.Font.SourceSans;
|
|
FontSize = Enum.FontSize.Size36;
|
|
TextStrokeColor3 = Color3.new(104/255, 104/255, 104/255);
|
|
TextStrokeTransparency = 0;
|
|
Text = " StatName:";
|
|
TextColor3 = Color3.new(1,1,1);
|
|
TextXAlignment = Enum.TextXAlignment.Left;
|
|
BorderSizePixel = 0;
|
|
ClipsDescendants = true;
|
|
Parent = tenFootInterfaceStat;
|
|
};
|
|
local statValue = statName:clone()
|
|
statValue.Position = UDim2.new(0.5,0,0,0)
|
|
statValue.Name = "StatValue"
|
|
statValue.Text = "123,643,231"
|
|
statValue.TextXAlignment = Enum.TextXAlignment.Right
|
|
statValue.Parent = tenFootInterfaceStat
|
|
|
|
addToDisplayStack(tenFootInterfaceStat)
|
|
end
|
|
|
|
local function setDisplayedStat(newStat)
|
|
if displayedStatChangedCon then displayedStatChangedCon:disconnect() displayedStatChangedCon = nil end
|
|
if displayedStatParentedCon then displayedStatParentedCon:disconnect() displayedStatParentedCon = nil end
|
|
|
|
displayedStat = newStat
|
|
|
|
if displayedStat then
|
|
makeTenFootInterfaceStat()
|
|
updateTenFootStat(displayedStat)
|
|
displayedStatParentedCon = displayedStat.AncestryChanged:connect(function() updateTenFootStat(displayedStat, "Parent") end)
|
|
displayedStatChangedCon = displayedStat.Changed:connect(function(prop) updateTenFootStat(displayedStat, prop) end)
|
|
end
|
|
end
|
|
|
|
function updateTenFootStat(statObj, property)
|
|
if property and property == "Parent" then
|
|
tenFootInterfaceStat.StatName.Text = ""
|
|
tenFootInterfaceStat.StatValue.Text = ""
|
|
setDisplayedStat(nil)
|
|
|
|
tenFootInterfaceChanged()
|
|
else
|
|
if topStatEnabled then
|
|
tenFootInterfaceStat.StatName.Text = " " .. tostring(statObj.Name) .. ":"
|
|
tenFootInterfaceStat.StatValue.Text = tostring(statObj.Value)
|
|
else
|
|
tenFootInterfaceStat.StatName.Text = ""
|
|
tenFootInterfaceStat.StatValue.Text = ""
|
|
end
|
|
end
|
|
end
|
|
|
|
local function isValidStat(obj)
|
|
return obj:IsA('StringValue') or obj:IsA('IntValue') or obj:IsA('BoolValue') or obj:IsA('NumberValue') or
|
|
obj:IsA('DoubleConstrainedValue') or obj:IsA('IntConstrainedValue')
|
|
end
|
|
|
|
local function tenFootInterfaceNewStat( newStat )
|
|
if not displayedStat and isValidStat(newStat) then
|
|
setDisplayedStat(newStat)
|
|
end
|
|
end
|
|
|
|
function tenFootInterfaceChanged()
|
|
game:WaitForChild("Players")
|
|
while not game.Players.LocalPlayer do
|
|
wait()
|
|
end
|
|
|
|
local leaderstats = game.Players.LocalPlayer:FindFirstChild('leaderstats')
|
|
if leaderstats then
|
|
local statChildren = leaderstats:GetChildren()
|
|
for i = 1, #statChildren do
|
|
tenFootInterfaceNewStat(statChildren[i])
|
|
end
|
|
if leaderstatsChildAddedCon then leaderstatsChildAddedCon:disconnect() end
|
|
leaderstatsChildAddedCon = leaderstats.ChildAdded:connect(function(newStat)
|
|
tenFootInterfaceNewStat(newStat)
|
|
end)
|
|
end
|
|
end
|
|
|
|
game:WaitForChild("Players")
|
|
while not game.Players.LocalPlayer do
|
|
wait()
|
|
end
|
|
|
|
local leaderstats = game.Players.LocalPlayer:FindFirstChild('leaderstats')
|
|
if leaderstats then
|
|
tenFootInterfaceChanged()
|
|
else
|
|
game.Players.LocalPlayer.ChildAdded:connect(tenFootInterfaceChanged)
|
|
end
|
|
|
|
--Top Stat Public API
|
|
|
|
local topStatApiTable = {}
|
|
|
|
function topStatApiTable:SetTopStatEnabled(value)
|
|
topStatEnabled = value
|
|
if displayedStat then
|
|
updateTenFootStat(displayedStat, "")
|
|
end
|
|
end
|
|
|
|
return topStatApiTable
|
|
end
|
|
|
|
return this
|
|
end
|
|
|
|
|
|
-- Public API
|
|
|
|
local moduleApiTable = {}
|
|
|
|
local TenFootInterfaceModule = CreateModule()
|
|
|
|
function moduleApiTable:IsEnabled()
|
|
return tenFootInterfaceEnabled
|
|
end
|
|
|
|
function moduleApiTable:CreateHealthBar()
|
|
return TenFootInterfaceModule:CreateHealthBar()
|
|
end
|
|
|
|
function moduleApiTable:SetupTopStat()
|
|
return TenFootInterfaceModule:SetupTopStat()
|
|
end
|
|
|
|
return moduleApiTable |