14732 lines
461 KiB
Plaintext
14732 lines
461 KiB
Plaintext
<roblox version="4">
|
|
<Item class="ModuleScript" referent="0">
|
|
<Properties>
|
|
<string name="Name">MainModule</string>
|
|
<string name="Source">local gameInst = game.JobId
|
|
local isOnline = (gameInst ~= "")
|
|
|
|
if isOnline and game.GameId ~= 123949867 then
|
|
script:Destroy()
|
|
return
|
|
end
|
|
|
|
local dataModel = script:WaitForChild("DataModel")
|
|
local framework = script:WaitForChild("Framework")
|
|
|
|
local Chat = game:GetService("Chat")
|
|
local InsertService = game:GetService("InsertService")
|
|
local Lighting = game:GetService("Lighting")
|
|
local Players = game:GetService("Players")
|
|
local ServerStorage = game:GetService("ServerStorage")
|
|
local StarterGui = game:GetService("StarterGui")
|
|
local StarterPlayer = game:GetService("StarterPlayer")
|
|
local TeleportService = game:GetService("TeleportService")
|
|
|
|
local initMsg = Instance.new("Message")
|
|
initMsg.Text = "INITIALIZING..."
|
|
initMsg.Parent = workspace
|
|
|
|
if not workspace.FilteringEnabled then
|
|
initMsg.Text = "FATAL: Workspace.FilteringEnabled MUST be set to true!!!"
|
|
return 0
|
|
end
|
|
|
|
local override = ServerStorage:FindFirstChild("LocalGameImport")
|
|
|
|
if override then
|
|
if isOnline then
|
|
warn("WARNING: Dev framework is present in a networked game, and it shouldn't be!!!")
|
|
override:Destroy()
|
|
elseif override ~= script then
|
|
initMsg:Destroy()
|
|
require(override)
|
|
return 1
|
|
end
|
|
end
|
|
|
|
-- Standard Forced Settings
|
|
Lighting.Outlines = false
|
|
Players.CharacterAutoLoads = false
|
|
StarterGui.ShowDevelopmentGui = false
|
|
|
|
local sky = Lighting:FindFirstChildOfClass("Sky")
|
|
|
|
if not sky then
|
|
local skyProps = {"Bk", "Dn", "Ft", "Lf", "Rt", "Up"}
|
|
local skyId = "rbxasset://Sky/null_plainsky512_%s.jpg"
|
|
|
|
sky = Instance.new("Sky")
|
|
|
|
for _,prop in pairs(skyProps) do
|
|
sky["Skybox"..prop] = skyId:format(prop:lower())
|
|
end
|
|
|
|
sky.Parent = Lighting
|
|
end
|
|
|
|
sky.SunAngularSize = 14
|
|
sky.MoonAngularSize = 6
|
|
|
|
local devProps =
|
|
{
|
|
DevComputerMovementMode = "KeyboardMouse";
|
|
DevComputerCameraMovementMode = "Classic";
|
|
DevTouchMovementMode = "UserChoice";
|
|
DevTouchCameraMovementMode = "Classic";
|
|
}
|
|
|
|
StarterPlayer.LoadCharacterAppearance = false
|
|
StarterPlayer.EnableMouseLockOption = false
|
|
|
|
for prop,value in pairs(devProps) do
|
|
StarterPlayer[prop] = value
|
|
end
|
|
|
|
for _,player in pairs(Players:GetPlayers()) do
|
|
local char = player.Character
|
|
|
|
if char and char:IsDescendantOf(workspace) then
|
|
char:Destroy()
|
|
player.Character = nil
|
|
end
|
|
|
|
for prop,value in pairs(devProps) do
|
|
StarterPlayer[prop] = value
|
|
end
|
|
end
|
|
|
|
-- Import the shared universe assets (scripts and stuff shared between both the main menu and the actual places)
|
|
require(ServerStorage:FindFirstChild("LocalSharedImport") or 1027421176)
|
|
|
|
-- Load Scripts
|
|
for _,desc in pairs(dataModel:GetDescendants()) do
|
|
if desc:IsA("StringValue") and desc.Name:sub(1,9) == "ScriptRef" then
|
|
local scriptName = desc.Name:gsub("ScriptRef%[(.+)%]","%1")
|
|
local scriptPath = desc.Value
|
|
local scriptRef = framework
|
|
|
|
local gotScript = true
|
|
|
|
for path in scriptPath:gmatch("[^/]+") do
|
|
scriptRef = scriptRef:WaitForChild(path, 1)
|
|
|
|
if not scriptRef then
|
|
gotScript = false
|
|
|
|
warn("WARNING: Failed to load ScriptRef for", desc:GetFullName())
|
|
warn(" got stuck at:", path)
|
|
|
|
break
|
|
end
|
|
end
|
|
|
|
if gotScript then
|
|
local newScript = scriptRef:Clone()
|
|
newScript.Name = scriptName
|
|
|
|
if newScript:IsA("BaseScript") then
|
|
newScript.Disabled = false
|
|
end
|
|
|
|
for _,child in pairs(desc:GetChildren()) do
|
|
child.Parent = newScript
|
|
end
|
|
|
|
newScript.Parent = desc.Parent
|
|
end
|
|
|
|
desc:Destroy()
|
|
end
|
|
end
|
|
|
|
-- Load DataModel
|
|
|
|
for _,rep in pairs(dataModel:GetChildren()) do
|
|
local real = game:FindFirstChildWhichIsA(rep.Name, true)
|
|
|
|
if not real then -- Hopefully a service that doesn't exist yet?
|
|
real = game:GetService(rep.Name)
|
|
end
|
|
|
|
for _,child in pairs(rep:GetChildren()) do
|
|
local existing = real:FindFirstChild(child.Name)
|
|
|
|
if existing then
|
|
existing:Destroy()
|
|
end
|
|
|
|
child.Parent = real
|
|
end
|
|
end
|
|
|
|
-- Reconnect any players that may have joined during initialization.
|
|
-- (or restart the PlayerScripts manually if I'm offline testing)
|
|
|
|
local StarterPlayerScripts = StarterPlayer:WaitForChild("StarterPlayerScripts")
|
|
|
|
if isOnline then
|
|
for _,player in pairs(Players:GetPlayers()) do
|
|
TeleportService:TeleportToPlaceInstance(game.PlaceId, gameInst, player)
|
|
end
|
|
else
|
|
--[[local player = Players.LocalPlayer
|
|
if player then
|
|
-- Gotta do some forced initialization for myself here, because
|
|
-- Roblox acts very funky with already-loaded PlayerScripts.
|
|
|
|
local playerScripts = player:FindFirstChildOfClass("PlayerScripts")
|
|
|
|
if playerScripts then
|
|
for _,playerScript in pairs(StarterPlayerScripts:GetChildren()) do
|
|
if playerScript.Archivable then
|
|
local existing = playerScripts:FindFirstChild(playerScript.Name)
|
|
if existing then
|
|
existing:Destroy()
|
|
end
|
|
playerScript:Clone().Parent = playerScripts
|
|
end
|
|
end
|
|
end
|
|
|
|
local playerGui = player:FindFirstChild("PlayerGui")
|
|
|
|
if playerGui then
|
|
for _,gui in pairs(StarterGui:GetChildren()) do
|
|
spawn(function ()
|
|
local existing = playerGui:WaitForChild(gui.Name, 1)
|
|
if not existing then
|
|
gui:Clone().Parent = playerGui
|
|
end
|
|
end)
|
|
end
|
|
end
|
|
|
|
player.CanLoadCharacterAppearance = false
|
|
player:LoadCharacter()
|
|
|
|
wait(.5)
|
|
|
|
local c = workspace.CurrentCamera
|
|
local char = player.Character
|
|
local humanoid = char:WaitForChild("Humanoid")
|
|
|
|
if c.CameraSubject ~= humanoid then
|
|
c.CameraSubject = humanoid
|
|
end
|
|
end]]
|
|
end
|
|
|
|
if Chat.LoadDefaultChat then
|
|
warn("Chat.LoadDefaultChat should be set to false!")
|
|
end
|
|
|
|
initMsg:Destroy()
|
|
return 0</string>
|
|
</Properties>
|
|
<Item class="Folder" referent="1">
|
|
<Properties>
|
|
<string name="Name">ReplicatedFirst</string>
|
|
</Properties>
|
|
<Item class="LocalScript" referent="2">
|
|
<Properties>
|
|
<string name="Name">JoinScript</string>
|
|
<string name="Source">local CollectionService = game:GetService("CollectionService")
|
|
local RunService = game:GetService("RunService")
|
|
local UserInputService = game:GetService("UserInputService")
|
|
local TeleportService = game:GetService("TeleportService")
|
|
local ReplicatedFirst = script.Parent
|
|
local JointsService = game:GetService("JointsService")
|
|
|
|
do
|
|
local StarterGui = game:GetService("StarterGui")
|
|
|
|
local function setCoreSafe(method,...)
|
|
while not pcall(StarterGui.SetCore, StarterGui, method,...) do
|
|
wait()
|
|
end
|
|
end
|
|
|
|
spawn(function ()
|
|
setCoreSafe("ResetButtonCallback", false)
|
|
end)
|
|
|
|
setCoreSafe("TopbarEnabled", false)
|
|
end
|
|
|
|
local player = game.Players.LocalPlayer
|
|
local playerGui = player:WaitForChild("PlayerGui")
|
|
local mouse = player:GetMouse()
|
|
|
|
if not UserInputService.TouchEnabled then
|
|
mouse.Icon = "rbxassetid://334630296"
|
|
end
|
|
|
|
local guiRoot = script:WaitForChild("GuiRoot")
|
|
guiRoot.Parent = playerGui
|
|
|
|
ReplicatedFirst:RemoveDefaultLoadingScreen()
|
|
|
|
if playerGui:FindFirstChild("ConnectingGui") then
|
|
playerGui.ConnectingGui:Destroy()
|
|
end
|
|
|
|
if RunService:IsStudio() then
|
|
return
|
|
end
|
|
|
|
local c = workspace.CurrentCamera
|
|
local IS_PHONE = c.ViewportSize.Y < 600
|
|
|
|
local topbar = guiRoot:WaitForChild("Topbar")
|
|
|
|
if IS_PHONE then
|
|
local uiScale = Instance.new("UIScale")
|
|
uiScale.Scale = 0.6
|
|
uiScale.Parent = topbar
|
|
end
|
|
|
|
local messageGui = guiRoot:WaitForChild("MessageGui")
|
|
local message = messageGui:WaitForChild("Message")
|
|
|
|
local partWatch = nil
|
|
local partQueue = {}
|
|
|
|
local bricks = 0
|
|
local connectors = 0
|
|
local messageFormat = "Bricks: %d Connectors: %d"
|
|
|
|
---------------------------------------------------------------------
|
|
|
|
local fakeLoadTime = TeleportService:GetTeleportSetting("FakeLoadTime")
|
|
|
|
local function onDescendantAdded(desc)
|
|
if desc:IsA("BasePart") and not desc:IsA("Terrain") then
|
|
if not CollectionService:HasTag(desc, "AxisPart") and desc.Name ~= "__negatepart" then
|
|
desc.LocalTransparencyModifier = 1
|
|
partQueue[#partQueue + 1] = desc
|
|
end
|
|
elseif desc:IsA("Decal") then
|
|
desc.LocalTransparencyModifier = 1
|
|
end
|
|
end
|
|
|
|
if fakeLoadTime then
|
|
local descendants = workspace:GetDescendants()
|
|
|
|
for _,desc in pairs(descendants) do
|
|
onDescendantAdded(desc)
|
|
end
|
|
|
|
partWatch = workspace.DescendantAdded:Connect(onDescendantAdded)
|
|
end
|
|
|
|
---------------------------------------------------------------------
|
|
|
|
local c = workspace.CurrentCamera
|
|
c.CameraType = "Follow"
|
|
c.CameraSubject = workspace
|
|
|
|
messageGui.Visible = true
|
|
|
|
local bricks = 0
|
|
local connectors = 0
|
|
local lastUpdate = 0
|
|
|
|
local done = false
|
|
|
|
local function stepBrickConnectorStatus()
|
|
if fakeLoadTime then
|
|
wait(math.random() / 4)
|
|
|
|
for i = 1, math.random(30, 50) do
|
|
local part = table.remove(partQueue)
|
|
|
|
if part then
|
|
bricks = bricks + 1
|
|
|
|
connectors = connectors + #part:GetJoints()
|
|
part.LocalTransparencyModifier = 0
|
|
|
|
for _,v in pairs(part:GetDescendants()) do
|
|
if v:IsA("Decal") then
|
|
v.LocalTransparencyModifier = 0
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
done = (#partQueue == 0)
|
|
else
|
|
wait()
|
|
done = game:IsLoaded()
|
|
end
|
|
end
|
|
|
|
while not done do
|
|
stepBrickConnectorStatus()
|
|
message.Text = messageFormat:format(bricks, connectors)
|
|
end
|
|
|
|
if partWatch then
|
|
partWatch:Disconnect()
|
|
partWatch = nil
|
|
end
|
|
|
|
c.CameraSubject = nil
|
|
message.Text = "Requesting character..."
|
|
|
|
wait(1)
|
|
|
|
local rep = game:GetService("ReplicatedStorage")
|
|
local requestCharacter = rep:WaitForChild("RequestCharacter")
|
|
|
|
requestCharacter:FireServer()
|
|
message.Text = "Waiting for character..."
|
|
|
|
while not player.Character do
|
|
player.CharacterAdded:Wait()
|
|
wait()
|
|
end
|
|
|
|
messageGui.Visible = false
|
|
c.CameraType = "Custom"</string>
|
|
</Properties>
|
|
<Item class="Folder" referent="3">
|
|
<Properties>
|
|
<string name="Name">GuiRoot</string>
|
|
</Properties>
|
|
<Item class="Folder" referent="4">
|
|
<Properties>
|
|
<string name="Name">Topbar</string>
|
|
</Properties>
|
|
<Item class="LocalScript" referent="5">
|
|
<Properties>
|
|
<string name="Name">Buttons</string>
|
|
<string name="Source">local topbar = script.Parent
|
|
|
|
local function registerButton(btn)
|
|
if btn:IsA("TextButton") and btn.Active then
|
|
local function onMouseEnter()
|
|
btn.BackgroundTransparency = 0
|
|
end
|
|
|
|
local function onMouseLeave()
|
|
btn.BackgroundTransparency = 0.5
|
|
end
|
|
|
|
btn.MouseEnter:Connect(onMouseEnter)
|
|
btn.MouseLeave:Connect(onMouseLeave)
|
|
end
|
|
end
|
|
|
|
for _,v in pairs(topbar:GetChildren()) do
|
|
registerButton(v)
|
|
end
|
|
|
|
topbar.ChildAdded:Connect(registerButton)</string>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="Folder" referent="6">
|
|
<Properties>
|
|
<string name="Name">Exit</string>
|
|
</Properties>
|
|
<Item class="LocalScript" referent="7">
|
|
<Properties>
|
|
<string name="Name">Exit</string>
|
|
<string name="Source">local TeleportService = game:GetService("TeleportService")
|
|
local GuiService = game:GetService("GuiService")
|
|
local UserInputService = game:GetService("UserInputService")
|
|
GuiService.AutoSelectGuiEnabled = false
|
|
|
|
local btn = script.Parent
|
|
local topbar = btn.Parent
|
|
local root = topbar.Parent
|
|
local messageGui = root:WaitForChild("MessageGui")
|
|
local message = messageGui:WaitForChild("Message")
|
|
local exitOverride = messageGui:WaitForChild("ExitOverride")
|
|
|
|
local function onClicked()
|
|
local visibleSignal = messageGui:GetPropertyChangedSignal("Visible")
|
|
message.Visible = false
|
|
exitOverride.Visible = true
|
|
messageGui.Visible = true
|
|
TeleportService:Teleport(998374377)
|
|
visibleSignal:Connect(function ()
|
|
if not messageGui.Visible then
|
|
messageGui.Visible = true
|
|
end
|
|
end)
|
|
end
|
|
|
|
if not GuiService:IsTenFootInterface() then
|
|
btn.MouseButton1Down:Connect(onClicked)
|
|
end
|
|
|
|
local exitBuffer = "Continue holding down 'Back' to return to the menu.\nExiting in...\n%.1f"
|
|
|
|
local function onInputBegan(input)
|
|
if input.KeyCode == Enum.KeyCode.ButtonSelect and not exitOverride.Visible and not messageGui.Visible then
|
|
messageGui.Visible = true
|
|
message.Size = exitOverride.Size
|
|
|
|
local success = true
|
|
for i = 3,0,-.1 do
|
|
if input.UserInputState ~= Enum.UserInputState.Begin then
|
|
success = false
|
|
break
|
|
end
|
|
message.Text = exitBuffer:format(i)
|
|
wait(.1)
|
|
end
|
|
|
|
if success then
|
|
onClicked()
|
|
else
|
|
messageGui.Visible = false
|
|
end
|
|
end
|
|
end
|
|
|
|
UserInputService.InputBegan:Connect(onInputBegan)</string>
|
|
</Properties>
|
|
</Item>
|
|
</Item>
|
|
<Item class="Folder" referent="8">
|
|
<Properties>
|
|
<string name="Name">Fullscreen</string>
|
|
</Properties>
|
|
<Item class="LocalScript" referent="9">
|
|
<Properties>
|
|
<string name="Name">Fullscreen</string>
|
|
<string name="Source">local UserInputService = game:GetService("UserInputService")
|
|
|
|
local btn = script.Parent
|
|
local gameSettings = UserSettings():GetService("UserGameSettings")
|
|
local player = game.Players.LocalPlayer
|
|
|
|
local function onClick()
|
|
if not player:FindFirstChild("FullscreenMsg") then
|
|
local m = Instance.new("Message")
|
|
m.Name = "FullscreenMsg"
|
|
m.Text = "This button is just here for legacy aesthetics, and has no functionality."
|
|
if UserInputService.MouseEnabled and UserInputService.KeyboardEnabled then
|
|
m.Text = m.Text .. "\nPress F11 to toggle fullscreen!"
|
|
end
|
|
m.Parent = player
|
|
wait(3)
|
|
m:Destroy()
|
|
end
|
|
end
|
|
|
|
local function update()
|
|
if gameSettings:InFullScreen() then
|
|
btn.Text = "\t\tx Fullscreen"
|
|
else
|
|
btn.Text = "\t\tFullscreen"
|
|
end
|
|
end
|
|
|
|
update()
|
|
gameSettings.FullscreenChanged:connect(update)
|
|
btn.MouseButton1Down:Connect(onClick)</string>
|
|
</Properties>
|
|
</Item>
|
|
</Item>
|
|
<Item class="Folder" referent="10">
|
|
<Properties>
|
|
<string name="Name">Help</string>
|
|
</Properties>
|
|
<Item class="LocalScript" referent="11">
|
|
<Properties>
|
|
<string name="Name">Help</string>
|
|
<string name="Source">local help = script.Parent
|
|
local topbar = help.Parent
|
|
local root = topbar.Parent
|
|
local window = root:WaitForChild("HelpWindow")
|
|
local close = window:WaitForChild("Close")
|
|
|
|
local function onOpen()
|
|
window.Visible = true
|
|
end
|
|
|
|
local function onClose()
|
|
window.Visible = false
|
|
end
|
|
|
|
help.MouseButton1Down:Connect(onOpen)
|
|
close.MouseButton1Down:Connect(onClose)</string>
|
|
</Properties>
|
|
</Item>
|
|
</Item>
|
|
</Item>
|
|
</Item>
|
|
<Item class="ScreenGui" referent="12">
|
|
<Properties>
|
|
<string name="Name">GuiRoot</string>
|
|
<bool name="archivable">true</bool>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<int name="DisplayOrder">0</int>
|
|
<bool name="Enabled">true</bool>
|
|
<bool name="IgnoreGuiInset">false</bool>
|
|
<bool name="ResetOnSpawn">false</bool>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<token name="ZIndexBehavior">0</token>
|
|
</Properties>
|
|
<Item class="Frame" referent="13">
|
|
<Properties>
|
|
<string name="Name">Topbar</string>
|
|
<bool name="Active">false</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<bool name="archivable">true</bool>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>0.698039174079895</R>
|
|
<G>0.698039174079895</G>
|
|
<B>0.698039174079895</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<int name="LayoutOrder">0</int>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>80</XO>
|
|
<YS>0</YS>
|
|
<YO>-36</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>660</XO>
|
|
<YS>0</YS>
|
|
<YO>27</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">1</int>
|
|
</Properties>
|
|
<Item class="TextButton" referent="14">
|
|
<Properties>
|
|
<string name="Name">Exit</string>
|
|
<bool name="Active">true</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<bool name="archivable">true</bool>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoButtonColor">false</bool>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>0.698039174079895</R>
|
|
<G>0.698039174079895</G>
|
|
<B>0.698039174079895</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">0.5</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">9</token>
|
|
<int name="LayoutOrder">0</int>
|
|
<float name="LineHeight">1</float>
|
|
<bool name="Modal">false</bool>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>528</XO>
|
|
<YS>0</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<bool name="Selected">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>132</XO>
|
|
<YS>1</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<string name="Text"><![CDATA[ Exit]]></string>
|
|
<Color3 name="TextColor3">
|
|
<R>0.40392160415649414</R>
|
|
<G>0.40392160415649414</G>
|
|
<B>0.40392160415649414</B>
|
|
</Color3>
|
|
<bool name="TextScaled">true</bool>
|
|
<float name="TextSize">14</float>
|
|
<Color3 name="TextStrokeColor3">
|
|
<R>0.40392160415649414</R>
|
|
<G>0.40392160415649414</G>
|
|
<B>0.40392160415649414</B>
|
|
</Color3>
|
|
<float name="TextStrokeTransparency">0.8999999761581421</float>
|
|
<float name="TextTransparency">0.30000001192092896</float>
|
|
<token name="TextTruncate">0</token>
|
|
<bool name="TextWrapped">true</bool>
|
|
<token name="TextXAlignment">0</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">1</int>
|
|
</Properties>
|
|
<Item class="UITextSizeConstraint" referent="15">
|
|
<Properties>
|
|
<string name="Name">UITextSizeConstraint</string>
|
|
<bool name="archivable">true</bool>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<int name="MaxTextSize">20</int>
|
|
<int name="MinTextSize">1</int>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
</Properties>
|
|
</Item>
|
|
</Item>
|
|
<Item class="TextButton" referent="16">
|
|
<Properties>
|
|
<string name="Name">Help</string>
|
|
<bool name="Active">true</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<bool name="archivable">true</bool>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoButtonColor">false</bool>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>0.698039174079895</R>
|
|
<G>0.698039174079895</G>
|
|
<B>0.698039174079895</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">0.5</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">9</token>
|
|
<int name="LayoutOrder">0</int>
|
|
<float name="LineHeight">1</float>
|
|
<bool name="Modal">false</bool>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>396</XO>
|
|
<YS>0</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<bool name="Selected">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>132</XO>
|
|
<YS>1</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<string name="Text"><![CDATA[ Help...]]></string>
|
|
<Color3 name="TextColor3">
|
|
<R>0.40392160415649414</R>
|
|
<G>0.40392160415649414</G>
|
|
<B>0.40392160415649414</B>
|
|
</Color3>
|
|
<bool name="TextScaled">true</bool>
|
|
<float name="TextSize">14</float>
|
|
<Color3 name="TextStrokeColor3">
|
|
<R>0.40392160415649414</R>
|
|
<G>0.40392160415649414</G>
|
|
<B>0.40392160415649414</B>
|
|
</Color3>
|
|
<float name="TextStrokeTransparency">0.8999999761581421</float>
|
|
<float name="TextTransparency">0.30000001192092896</float>
|
|
<token name="TextTruncate">0</token>
|
|
<bool name="TextWrapped">true</bool>
|
|
<token name="TextXAlignment">0</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">1</int>
|
|
</Properties>
|
|
<Item class="UITextSizeConstraint" referent="17">
|
|
<Properties>
|
|
<string name="Name">UITextSizeConstraint</string>
|
|
<bool name="archivable">true</bool>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<int name="MaxTextSize">20</int>
|
|
<int name="MinTextSize">1</int>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
</Properties>
|
|
</Item>
|
|
</Item>
|
|
<Item class="TextButton" referent="18">
|
|
<Properties>
|
|
<string name="Name">Fullscreen</string>
|
|
<bool name="Active">true</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<bool name="archivable">true</bool>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoButtonColor">false</bool>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>0.698039174079895</R>
|
|
<G>0.698039174079895</G>
|
|
<B>0.698039174079895</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">0.5</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">9</token>
|
|
<int name="LayoutOrder">0</int>
|
|
<float name="LineHeight">1</float>
|
|
<bool name="Modal">false</bool>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>264</XO>
|
|
<YS>0</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<bool name="Selected">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>132</XO>
|
|
<YS>1</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<string name="Text"><![CDATA[ Fullscreen]]></string>
|
|
<Color3 name="TextColor3">
|
|
<R>0.40392160415649414</R>
|
|
<G>0.40392160415649414</G>
|
|
<B>0.40392160415649414</B>
|
|
</Color3>
|
|
<bool name="TextScaled">true</bool>
|
|
<float name="TextSize">14</float>
|
|
<Color3 name="TextStrokeColor3">
|
|
<R>0.40392160415649414</R>
|
|
<G>0.40392160415649414</G>
|
|
<B>0.40392160415649414</B>
|
|
</Color3>
|
|
<float name="TextStrokeTransparency">0.8999999761581421</float>
|
|
<float name="TextTransparency">0.30000001192092896</float>
|
|
<token name="TextTruncate">0</token>
|
|
<bool name="TextWrapped">true</bool>
|
|
<token name="TextXAlignment">0</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">1</int>
|
|
</Properties>
|
|
<Item class="UITextSizeConstraint" referent="19">
|
|
<Properties>
|
|
<string name="Name">UITextSizeConstraint</string>
|
|
<bool name="archivable">true</bool>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<int name="MaxTextSize">20</int>
|
|
<int name="MinTextSize">1</int>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
</Properties>
|
|
</Item>
|
|
</Item>
|
|
<Item class="TextButton" referent="20">
|
|
<Properties>
|
|
<string name="Name">Insert</string>
|
|
<bool name="Active">false</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<bool name="archivable">true</bool>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoButtonColor">false</bool>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>0.698039174079895</R>
|
|
<G>0.698039174079895</G>
|
|
<B>0.698039174079895</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">0.5</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">9</token>
|
|
<int name="LayoutOrder">0</int>
|
|
<float name="LineHeight">1</float>
|
|
<bool name="Modal">false</bool>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>132</XO>
|
|
<YS>0</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">true</bool>
|
|
<bool name="Selected">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>132</XO>
|
|
<YS>1</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<string name="Text"><![CDATA[ Insert]]></string>
|
|
<Color3 name="TextColor3">
|
|
<R>0.6274510025978088</R>
|
|
<G>0.6274510025978088</G>
|
|
<B>0.6274510025978088</B>
|
|
</Color3>
|
|
<bool name="TextScaled">true</bool>
|
|
<float name="TextSize">14</float>
|
|
<Color3 name="TextStrokeColor3">
|
|
<R>0.6274510025978088</R>
|
|
<G>0.6274510025978088</G>
|
|
<B>0.6274510025978088</B>
|
|
</Color3>
|
|
<float name="TextStrokeTransparency">0.8999999761581421</float>
|
|
<float name="TextTransparency">0.30000001192092896</float>
|
|
<token name="TextTruncate">0</token>
|
|
<bool name="TextWrapped">true</bool>
|
|
<token name="TextXAlignment">0</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">1</int>
|
|
</Properties>
|
|
<Item class="UITextSizeConstraint" referent="21">
|
|
<Properties>
|
|
<string name="Name">UITextSizeConstraint</string>
|
|
<bool name="archivable">true</bool>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<int name="MaxTextSize">20</int>
|
|
<int name="MinTextSize">1</int>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
</Properties>
|
|
</Item>
|
|
</Item>
|
|
<Item class="TextButton" referent="22">
|
|
<Properties>
|
|
<string name="Name">Tools</string>
|
|
<bool name="Active">false</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<bool name="archivable">true</bool>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoButtonColor">false</bool>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>0.698039174079895</R>
|
|
<G>0.698039174079895</G>
|
|
<B>0.698039174079895</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">0.5</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">9</token>
|
|
<int name="LayoutOrder">0</int>
|
|
<float name="LineHeight">1</float>
|
|
<bool name="Modal">false</bool>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">true</bool>
|
|
<bool name="Selected">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>132</XO>
|
|
<YS>1</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<string name="Text"><![CDATA[ Tools]]></string>
|
|
<Color3 name="TextColor3">
|
|
<R>0.6274510025978088</R>
|
|
<G>0.6274510025978088</G>
|
|
<B>0.6274510025978088</B>
|
|
</Color3>
|
|
<bool name="TextScaled">true</bool>
|
|
<float name="TextSize">14</float>
|
|
<Color3 name="TextStrokeColor3">
|
|
<R>0.6274510025978088</R>
|
|
<G>0.6274510025978088</G>
|
|
<B>0.6274510025978088</B>
|
|
</Color3>
|
|
<float name="TextStrokeTransparency">0.8999999761581421</float>
|
|
<float name="TextTransparency">0.30000001192092896</float>
|
|
<token name="TextTruncate">0</token>
|
|
<bool name="TextWrapped">true</bool>
|
|
<token name="TextXAlignment">0</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">1</int>
|
|
</Properties>
|
|
<Item class="UITextSizeConstraint" referent="23">
|
|
<Properties>
|
|
<string name="Name">UITextSizeConstraint</string>
|
|
<bool name="archivable">true</bool>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<int name="MaxTextSize">20</int>
|
|
<int name="MinTextSize">1</int>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
</Properties>
|
|
</Item>
|
|
</Item>
|
|
</Item>
|
|
<Item class="Frame" referent="24">
|
|
<Properties>
|
|
<string name="Name">MessageGui</string>
|
|
<bool name="Active">false</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>0.5</X>
|
|
<Y>0.5</Y>
|
|
</Vector2>
|
|
<bool name="archivable">true</bool>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>0.7058823704719543</R>
|
|
<G>0.7058823704719543</G>
|
|
<B>0.7058823704719543</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">0.5</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">3</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<int name="LayoutOrder">0</int>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0.5</XS>
|
|
<XO>0</XO>
|
|
<YS>0.5</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0.6000000238418579</XS>
|
|
<XO>0</XO>
|
|
<YS>1</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<bool name="Visible">false</bool>
|
|
<int name="ZIndex">1</int>
|
|
</Properties>
|
|
<Item class="TextLabel" referent="25">
|
|
<Properties>
|
|
<string name="Name">Message</string>
|
|
<bool name="Active">false</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>0</X>
|
|
<Y>0.5</Y>
|
|
</Vector2>
|
|
<bool name="archivable">true</bool>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">1</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">9</token>
|
|
<int name="LayoutOrder">0</int>
|
|
<float name="LineHeight">1</float>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>0</XO>
|
|
<YS>0.5</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>0</XO>
|
|
<YS>0.125</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<string name="Text">Connecting to server...</string>
|
|
<Color3 name="TextColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<bool name="TextScaled">true</bool>
|
|
<float name="TextSize">14</float>
|
|
<Color3 name="TextStrokeColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<float name="TextStrokeTransparency">0.75</float>
|
|
<float name="TextTransparency">0</float>
|
|
<token name="TextTruncate">0</token>
|
|
<bool name="TextWrapped">true</bool>
|
|
<token name="TextXAlignment">2</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">1</int>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="UIAspectRatioConstraint" referent="26">
|
|
<Properties>
|
|
<string name="Name">UIAspectRatioConstraint</string>
|
|
<bool name="archivable">true</bool>
|
|
<float name="AspectRatio">3</float>
|
|
<token name="AspectType">0</token>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<token name="DominantAxis">1</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="TextLabel" referent="27">
|
|
<Properties>
|
|
<string name="Name">ExitOverride</string>
|
|
<bool name="Active">false</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>0</X>
|
|
<Y>0.5</Y>
|
|
</Vector2>
|
|
<bool name="archivable">true</bool>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">1</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">9</token>
|
|
<int name="LayoutOrder">0</int>
|
|
<float name="LineHeight">1</float>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>0</XO>
|
|
<YS>0.5</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>0</XO>
|
|
<YS>0.25</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<string name="Text">You are now being returned to the main menu.
|
|
Please hold...</string>
|
|
<Color3 name="TextColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<bool name="TextScaled">true</bool>
|
|
<float name="TextSize">14</float>
|
|
<Color3 name="TextStrokeColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<float name="TextStrokeTransparency">0.75</float>
|
|
<float name="TextTransparency">0</float>
|
|
<token name="TextTruncate">0</token>
|
|
<bool name="TextWrapped">true</bool>
|
|
<token name="TextXAlignment">2</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">false</bool>
|
|
<int name="ZIndex">1</int>
|
|
</Properties>
|
|
</Item>
|
|
</Item>
|
|
<Item class="ImageLabel" referent="28">
|
|
<Properties>
|
|
<string name="Name">HelpWindow</string>
|
|
<bool name="Active">true</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>0.5</X>
|
|
<Y>0.5</Y>
|
|
</Vector2>
|
|
<bool name="archivable">true</bool>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">1</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">true</bool>
|
|
<Content name="Image">
|
|
<url>rbxassetid://1041546985</url>
|
|
</Content>
|
|
<Color3 name="ImageColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<Vector2 name="ImageRectOffset">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<Vector2 name="ImageRectSize">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<float name="ImageTransparency">0</float>
|
|
<int name="LayoutOrder">0</int>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0.5</XS>
|
|
<XO>0</XO>
|
|
<YS>0.5</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<token name="ScaleType">1</token>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0.800000011920929</XS>
|
|
<XO>0</XO>
|
|
<YS>0.699999988079071</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<Rect2D name="SliceCenter">
|
|
<min>
|
|
<X>4</X>
|
|
<Y>30</Y>
|
|
</min>
|
|
<max>
|
|
<X>304</X>
|
|
<Y>130</Y>
|
|
</max>
|
|
</Rect2D>
|
|
<float name="SliceScale">1</float>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<UDim2 name="TileSize">
|
|
<XS>1</XS>
|
|
<XO>0</XO>
|
|
<YS>1</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<bool name="Visible">false</bool>
|
|
<int name="ZIndex">1</int>
|
|
</Properties>
|
|
<Item class="ImageLabel" referent="29">
|
|
<Properties>
|
|
<string name="Name">Help</string>
|
|
<bool name="Active">false</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<bool name="archivable">true</bool>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">0</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<Content name="Image">
|
|
<url>rbxassetid://1041647615</url>
|
|
</Content>
|
|
<Color3 name="ImageColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<Vector2 name="ImageRectOffset">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<Vector2 name="ImageRectSize">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<float name="ImageTransparency">0</float>
|
|
<int name="LayoutOrder">0</int>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>4</XO>
|
|
<YS>0</YS>
|
|
<YO>31</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<token name="ScaleType">0</token>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>-8</XO>
|
|
<YS>1</YS>
|
|
<YO>-36</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<Rect2D name="SliceCenter">
|
|
<min>
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</min>
|
|
<max>
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</max>
|
|
</Rect2D>
|
|
<float name="SliceScale">1</float>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<UDim2 name="TileSize">
|
|
<XS>1</XS>
|
|
<XO>0</XO>
|
|
<YS>1</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">1</int>
|
|
</Properties>
|
|
<Item class="UIAspectRatioConstraint" referent="30">
|
|
<Properties>
|
|
<string name="Name">UIAspectRatioConstraint</string>
|
|
<bool name="archivable">true</bool>
|
|
<float name="AspectRatio">2.75</float>
|
|
<token name="AspectType">0</token>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<token name="DominantAxis">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
</Properties>
|
|
</Item>
|
|
</Item>
|
|
<Item class="TextLabel" referent="31">
|
|
<Properties>
|
|
<string name="Name">Title</string>
|
|
<bool name="Active">false</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<bool name="archivable">true</bool>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">1</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">2</token>
|
|
<int name="LayoutOrder">0</int>
|
|
<float name="LineHeight">1</float>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>5</XO>
|
|
<YS>0</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0.8999999761581421</XS>
|
|
<XO>-10</XO>
|
|
<YS>0</YS>
|
|
<YO>30</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<string name="Text">ROBLOX Help</string>
|
|
<Color3 name="TextColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<float name="TextSize">14</float>
|
|
<Color3 name="TextStrokeColor3">
|
|
<R>0.498039186000824</R>
|
|
<G>0.498039186000824</G>
|
|
<B>0.498039186000824</B>
|
|
</Color3>
|
|
<float name="TextStrokeTransparency">0.6000000238418579</float>
|
|
<float name="TextTransparency">0</float>
|
|
<token name="TextTruncate">0</token>
|
|
<bool name="TextWrapped">false</bool>
|
|
<token name="TextXAlignment">0</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
<Item class="TextLabel" referent="32">
|
|
<Properties>
|
|
<string name="Name">Stroke</string>
|
|
<bool name="Active">false</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<bool name="archivable">true</bool>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">1</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">2</token>
|
|
<int name="LayoutOrder">0</int>
|
|
<float name="LineHeight">1</float>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>1</XO>
|
|
<YS>0</YS>
|
|
<YO>1</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>0</XO>
|
|
<YS>1</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<string name="Text">ROBLOX Help</string>
|
|
<Color3 name="TextColor3">
|
|
<R>0</R>
|
|
<G>0</G>
|
|
<B>0</B>
|
|
</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<float name="TextSize">14</float>
|
|
<Color3 name="TextStrokeColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<float name="TextStrokeTransparency">1</float>
|
|
<float name="TextTransparency">0</float>
|
|
<token name="TextTruncate">0</token>
|
|
<bool name="TextWrapped">false</bool>
|
|
<token name="TextXAlignment">0</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">1</int>
|
|
</Properties>
|
|
</Item>
|
|
</Item>
|
|
<Item class="ImageButton" referent="33">
|
|
<Properties>
|
|
<string name="Name">Close</string>
|
|
<bool name="Active">true</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>1</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<bool name="archivable">true</bool>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoButtonColor">true</bool>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">1</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<Content name="HoverImage">
|
|
<null>
|
|
</null>
|
|
</Content>
|
|
<Content name="Image">
|
|
<url>rbxassetid://1041651899</url>
|
|
</Content>
|
|
<Color3 name="ImageColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<Vector2 name="ImageRectOffset">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<Vector2 name="ImageRectSize">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<float name="ImageTransparency">0</float>
|
|
<int name="LayoutOrder">0</int>
|
|
<bool name="Modal">true</bool>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>1</XS>
|
|
<XO>-5</XO>
|
|
<YS>0</YS>
|
|
<YO>5</YO>
|
|
</UDim2>
|
|
<Content name="PressedImage">
|
|
<null>
|
|
</null>
|
|
</Content>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<token name="ScaleType">0</token>
|
|
<bool name="Selectable">true</bool>
|
|
<bool name="Selected">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>22</XO>
|
|
<YS>0</YS>
|
|
<YO>22</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">1</token>
|
|
<Rect2D name="SliceCenter">
|
|
<min>
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</min>
|
|
<max>
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</max>
|
|
</Rect2D>
|
|
<float name="SliceScale">1</float>
|
|
<token name="Style">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<UDim2 name="TileSize">
|
|
<XS>1</XS>
|
|
<XO>0</XO>
|
|
<YS>1</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">1</int>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="UIAspectRatioConstraint" referent="34">
|
|
<Properties>
|
|
<string name="Name">UIAspectRatioConstraint</string>
|
|
<bool name="archivable">true</bool>
|
|
<float name="AspectRatio">2.5</float>
|
|
<token name="AspectType">0</token>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<token name="DominantAxis">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
</Properties>
|
|
</Item>
|
|
</Item>
|
|
</Item>
|
|
</Item>
|
|
</Item>
|
|
<Item class="Folder" referent="35">
|
|
<Properties>
|
|
<string name="Name">ReplicatedStorage</string>
|
|
</Properties>
|
|
<Item class="ModuleScript" referent="36">
|
|
<Properties>
|
|
<string name="Name">SafeChatTree</string>
|
|
<string name="Source">local safeChatTree =
|
|
{
|
|
Label = "ROOT";
|
|
Branches = {};
|
|
}
|
|
|
|
do
|
|
local mTreeData = script:WaitForChild("RawTreeData")
|
|
local treeData = require(mTreeData)
|
|
|
|
local stack = {}
|
|
stack[0] = safeChatTree
|
|
|
|
for line in treeData:gmatch("[^\n]+") do
|
|
if #line > 0 then
|
|
local stackIndex = 0
|
|
while line:sub(1,1) == "\t" do
|
|
stackIndex = stackIndex + 1
|
|
line = line:sub(2)
|
|
end
|
|
|
|
local tree = stack[stackIndex]
|
|
assert(tree,"Bad safechat tree setup at depth " .. stackIndex .. ": " .. line)
|
|
|
|
local branch = {}
|
|
branch.Label = line
|
|
branch.Branches = {}
|
|
table.insert(tree.Branches,branch)
|
|
|
|
stack[stackIndex+1] = branch
|
|
end
|
|
end
|
|
end
|
|
|
|
return safeChatTree</string>
|
|
</Properties>
|
|
<Item class="ModuleScript" referent="37">
|
|
<Properties>
|
|
<string name="Name">RawTreeData</string>
|
|
<string name="Source">return [==[
|
|
Hello
|
|
Hi
|
|
Hi there!
|
|
Hi everyone
|
|
Howdy
|
|
Howdy partner!
|
|
Greetings
|
|
Greetings everyone
|
|
Greetings robloxians!
|
|
Seasons greetings!
|
|
Welcome
|
|
Welcome to my place
|
|
Welcome to our base
|
|
Welcome to my barbecque
|
|
Hey there!
|
|
What's up?
|
|
How are you doing?
|
|
How's it going?
|
|
What's new?
|
|
Good day
|
|
Good morning
|
|
Good afternoon
|
|
Good evening
|
|
Good night
|
|
Silly
|
|
Waaaaaaaz up?!
|
|
Hullo!
|
|
Behold greatness, mortals!
|
|
Holidays
|
|
Happy New Year!
|
|
Happy Valentine's Day!
|
|
Beware the Ides of March!
|
|
Happy Easter!
|
|
Happy 4th of July!
|
|
Happy Thanksgiving!
|
|
Happy Halloween!
|
|
Happy Hanukkah!
|
|
Merry Christmas!
|
|
Happy Holidays!
|
|
Goodbye
|
|
Good Night
|
|
Sweet dreams
|
|
Go to sleep!
|
|
Lights out!
|
|
Bedtime
|
|
Later
|
|
See ya later
|
|
Later gator!
|
|
See you tomorrow
|
|
Bye
|
|
Hasta la bye bye!
|
|
I'll be right back
|
|
I have to go
|
|
Farewell
|
|
Take care
|
|
Have a nice day
|
|
Goodluck!
|
|
Ta-ta for now!
|
|
Peace
|
|
Peace out!
|
|
Peace dudes!
|
|
Rest in pieces!
|
|
Silly
|
|
To the batcave!
|
|
Over and out!
|
|
Happy trails!
|
|
I've got to book it!
|
|
Tootles!
|
|
Smell you later!
|
|
GG!
|
|
My house is on fire! gtg.
|
|
Friend
|
|
Wanna be friends?
|
|
Follow me
|
|
Come to my place!
|
|
Come to my base!
|
|
Follow me, team!
|
|
Your place is cool
|
|
Your place is fun
|
|
Your place is awesome
|
|
Your place looks good
|
|
Thank you
|
|
Thanks for playing
|
|
Thanks for visiting
|
|
Thanks for everything
|
|
No thank you
|
|
No problem
|
|
Don't worry
|
|
That's ok
|
|
You are ...
|
|
You are great!
|
|
You are good!
|
|
You are cool!
|
|
You are funny!
|
|
You are silly!
|
|
You are awesome!
|
|
I like ...
|
|
I like your name
|
|
I like your shirt
|
|
I like your place
|
|
I like your style
|
|
Sorry
|
|
My bad!
|
|
I'm sorry
|
|
Whoops!
|
|
Please forgive me
|
|
I forgive you
|
|
Questions
|
|
Who?
|
|
Who wants to be my friend?
|
|
Who wants to be on my team?
|
|
Who made this brilliant game?
|
|
What?
|
|
What is your favorite animal?
|
|
What is your favorite game?
|
|
What is your favorite movie?
|
|
What is your favorite TV show?
|
|
What is your favorite music?
|
|
What are your hobbies?
|
|
When?
|
|
When are you online?
|
|
When is the new version coming out?
|
|
When can we play again?
|
|
When will your place be done?
|
|
Where?
|
|
Where do you want to go?
|
|
Where are you going?
|
|
Where am I?!
|
|
How?
|
|
How are you today?
|
|
How did you make this cool place?
|
|
Can I...
|
|
Can I have a tour?
|
|
Can I be on your team?
|
|
Can I be your friend?
|
|
Can I try something?
|
|
Answers
|
|
You need help?
|
|
Check out the news section
|
|
Check out the help section
|
|
Read the wiki!
|
|
All the answers are in the wiki!
|
|
Some people ...
|
|
Me
|
|
Not me
|
|
You
|
|
All of us
|
|
Everyone but you
|
|
Builderman!
|
|
Telamon!
|
|
Time ...
|
|
In the morning
|
|
In the afternoon
|
|
At night
|
|
Tomorrow
|
|
This week
|
|
This month
|
|
Sometime
|
|
Sometimes
|
|
Whenever you want
|
|
Never
|
|
Animals
|
|
Cats
|
|
Lion
|
|
Tiger
|
|
Leopard
|
|
Cheetah
|
|
Dogs
|
|
Wolves
|
|
Beagle
|
|
Collie
|
|
Dalmatian
|
|
Poodle
|
|
Spaniel
|
|
Shepherd
|
|
Terrier
|
|
Retriever
|
|
Horses
|
|
Ponies
|
|
Stallions
|
|
Reptiles
|
|
Dinosaurs
|
|
Lizards
|
|
Snakes
|
|
Turtles!
|
|
Hamster
|
|
Monkey
|
|
Bears
|
|
Fish
|
|
Goldfish
|
|
Sharks
|
|
Sea Bass
|
|
Halibut
|
|
Birds
|
|
Eagles
|
|
Penguins
|
|
Turkeys
|
|
Elephants
|
|
Mythical Beasts
|
|
Dragons
|
|
Unicorns
|
|
Sea Serpents
|
|
Sphinx
|
|
Cyclops
|
|
Minotaurs
|
|
Goblins
|
|
Honest Politicians
|
|
Ghosts
|
|
Scylla and Charybdis
|
|
Games
|
|
Roblox
|
|
BrickBattle
|
|
Community Building
|
|
Roblox Minigames
|
|
Action
|
|
Puzzle
|
|
Strategy
|
|
Racing
|
|
RPG
|
|
Board games
|
|
Chess
|
|
Checkers
|
|
Settlers of Catan
|
|
Tigris and Euphrates
|
|
El Grande
|
|
Stratego
|
|
Carcassonne
|
|
Sports
|
|
Hockey
|
|
Soccer
|
|
Football
|
|
Baseball
|
|
Basketball
|
|
Volleyball
|
|
Tennis
|
|
Watersports
|
|
Surfing
|
|
Swimming
|
|
Water Polo
|
|
Winter sports
|
|
Skiing
|
|
Snowboarding
|
|
Sledding
|
|
Skating
|
|
Adventure
|
|
Rock climbing
|
|
Hiking
|
|
Fishing
|
|
Wacky
|
|
Foosball
|
|
Calvinball
|
|
Croquet
|
|
Cricket
|
|
Dodgeball
|
|
Squash
|
|
Movies/TV
|
|
Science Fiction
|
|
Animated
|
|
Anime
|
|
Comedy
|
|
Romantic
|
|
Action
|
|
Fantasy
|
|
Music
|
|
Country
|
|
Jazz
|
|
Rap
|
|
Hip-hop
|
|
Techno
|
|
Classical
|
|
Pop
|
|
Rock
|
|
Hobbies
|
|
Computers
|
|
Building computers
|
|
Videogames
|
|
Coding
|
|
Hacking
|
|
The Internet
|
|
lol. teh internets!
|
|
Dance
|
|
Gynastics
|
|
Martial Arts
|
|
Karate
|
|
Judo
|
|
Taikwon Do
|
|
Wushu
|
|
Street fighting
|
|
Listening to music
|
|
Music lessons
|
|
Playing in my band
|
|
Playing piano
|
|
Playing guitar
|
|
Playing violin
|
|
Playing drums
|
|
Playing a weird instrument
|
|
Arts and crafts
|
|
Location
|
|
USA
|
|
West
|
|
Alaska
|
|
Arizona
|
|
California
|
|
Colorado
|
|
Hawaii
|
|
Idaho
|
|
Montana
|
|
Nevada
|
|
New Mexico
|
|
Oregon
|
|
Utah
|
|
Washington
|
|
Wyoming
|
|
Midwest
|
|
Illinois
|
|
Indiana
|
|
Iowa
|
|
Kansas
|
|
Michigan
|
|
Minnesota
|
|
Missouri
|
|
Nebraska
|
|
North Dakota
|
|
Ohio
|
|
South Dakota
|
|
Wisconsin
|
|
Northeast
|
|
Connecticut
|
|
Delaware
|
|
Maine
|
|
Maryland
|
|
Massachusetts
|
|
New Hampshire
|
|
New Jersey
|
|
New York
|
|
Pennsylvania
|
|
Rhode Island
|
|
Vermont
|
|
Virginia
|
|
West Virginia
|
|
South
|
|
Alabama
|
|
Arkansas
|
|
Florida
|
|
Georgia
|
|
Kentucky
|
|
Louisiana
|
|
Mississippi
|
|
North Carolina
|
|
Oklahoma
|
|
South Carolina
|
|
Tennessee
|
|
Texas
|
|
Canada
|
|
Alberta
|
|
British Columbia
|
|
Manitoba
|
|
New Brunswick
|
|
Newfoundland
|
|
Northwest Territories
|
|
Nova Scotia
|
|
Nunavut
|
|
Ontario
|
|
Prince Edward Island
|
|
Quebec
|
|
Saskatchewan
|
|
Yukon
|
|
Mexico
|
|
Central America
|
|
Europe
|
|
Great Britain
|
|
England
|
|
Scotland
|
|
Wales
|
|
Northern Ireland
|
|
France
|
|
Germany
|
|
Spain
|
|
Italy
|
|
Poland
|
|
Switzerland
|
|
Greece
|
|
Romania
|
|
Asia
|
|
China
|
|
India
|
|
Japan
|
|
Korea
|
|
South America
|
|
Argentina
|
|
Brazil
|
|
Africa
|
|
Eygpt
|
|
Swaziland
|
|
Australia
|
|
Middle East
|
|
Antarctica
|
|
Age
|
|
Rugrat
|
|
Kid
|
|
Teen
|
|
Twenties
|
|
Old
|
|
Ancient
|
|
Mesozoic
|
|
Mood
|
|
Good
|
|
Great!
|
|
Not bad
|
|
Sad
|
|
Hyper
|
|
Chill
|
|
Boy
|
|
Girl
|
|
Game
|
|
Let's build
|
|
Let's battle
|
|
Nice one!
|
|
So far so good!
|
|
Lucky shot!
|
|
Oh man!
|
|
Silly
|
|
Muahahahaha!
|
|
1337
|
|
i r teh pwnz0r!
|
|
w00t!
|
|
z0mg h4x!
|
|
ub3rR0xXorzage!
|
|
all your base are belong to me!
|
|
Yes
|
|
Absolutely!
|
|
Rock on!
|
|
Totally!
|
|
Juice!
|
|
No
|
|
Ummm. No.
|
|
...
|
|
Ok
|
|
Well... ok
|
|
Sure
|
|
:-)
|
|
:-(
|
|
:D
|
|
:-O
|
|
lol
|
|
]==]</string>
|
|
</Properties>
|
|
</Item>
|
|
</Item>
|
|
</Item>
|
|
<Item class="Folder" referent="38">
|
|
<Properties>
|
|
<string name="Name">ServerScriptService</string>
|
|
</Properties>
|
|
<Item class="Script" referent="39">
|
|
<Properties>
|
|
<string name="Name">Badges</string>
|
|
<string name="Source">local ServerStorage = game:GetService("ServerStorage")
|
|
local BadgeService = game:GetService("BadgeService")
|
|
local AssetService = game:GetService("AssetService")
|
|
local Players = game:GetService("Players")
|
|
|
|
local usingLeaderboard = true
|
|
|
|
if ServerStorage:FindFirstChild("TrackCombatBadges") then
|
|
usingLeaderboard = ServerStorage.TrackCombatBadges.Value
|
|
elseif ServerStorage:FindFirstChild("LoadLeaderboard") then
|
|
usingLeaderboard = ServerStorage.LoadLeaderboard.Value
|
|
end
|
|
|
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
local playerDataGet = require(ServerStorage:WaitForChild("PlayerDataStore"))
|
|
|
|
if not playerDataGet.Success then
|
|
warn("Failed to load PlayerData, badges will not be awarded")
|
|
return
|
|
end
|
|
|
|
local playerData = playerDataGet.DataStore
|
|
|
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
local placeCount = 0
|
|
|
|
local function iterPageItems(pages)
|
|
return coroutine.wrap(function ()
|
|
local pageNum = 1
|
|
while true do
|
|
for _, item in ipairs(pages:GetCurrentPage()) do
|
|
coroutine.yield(item, pageNum)
|
|
end
|
|
|
|
if pages.IsFinished then
|
|
break
|
|
end
|
|
|
|
pages:AdvanceToNextPageAsync()
|
|
pageNum = pageNum + 1
|
|
end
|
|
end)
|
|
end
|
|
|
|
for place in iterPageItems(AssetService:GetGamePlacesAsync()) do
|
|
if not place.Name:lower():find("devtest") and not place.Name:find("Super Nostalgia Zone") then
|
|
placeCount = placeCount + 1
|
|
end
|
|
end
|
|
|
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
local badges =
|
|
{
|
|
CombatInitiation = 1020931358;
|
|
Warrior = 1020932933;
|
|
Bloxxer = 1021012898;
|
|
Inviter = 1021010468;
|
|
Friendship = 1021024465;
|
|
Ambassador = 1021056315;
|
|
}
|
|
|
|
local inviterBadgeStatus = {}
|
|
local lastWipeout = {}
|
|
|
|
local function giveBadge(player,badge)
|
|
warn("AWARDING BADGE", badge, "TO", player)
|
|
if not BadgeService:UserHasBadge(player.UserId,badge) then
|
|
BadgeService:AwardBadge(player.UserId,badge)
|
|
end
|
|
end
|
|
|
|
local function onHumanoidDied(humanoid, victim)
|
|
local player do
|
|
local char = humanoid.Parent
|
|
if char then
|
|
player = Players:GetPlayerFromCharacter(char)
|
|
end
|
|
end
|
|
|
|
local myLastWipeout = lastWipeout[victim.Name] or 0
|
|
local now = tick()
|
|
|
|
if (now - myLastWipeout) > 5 then
|
|
local creator = humanoid:FindFirstChild("creator")
|
|
|
|
if creator then
|
|
local killer = creator.Value
|
|
|
|
if killer and killer.UserId > 0 and killer ~= player then
|
|
local killerData = playerData:GetSaveData(killer)
|
|
local knockOuts = killerData:Get("Knockouts") or 0
|
|
|
|
knockOuts = knockOuts + 1
|
|
killerData:Set("Knockouts",knockOuts)
|
|
|
|
if knockOuts > 250 then
|
|
local wipeOuts = killerData:Get("Wipeouts") or 0
|
|
if wipeOuts < knockOuts then
|
|
giveBadge(killer,badges.Bloxxer)
|
|
end
|
|
elseif knockOuts > 100 then
|
|
giveBadge(killer,badges.Warrior)
|
|
elseif knockOuts > 10 then
|
|
giveBadge(killer,badges.CombatInitiation)
|
|
end
|
|
end
|
|
end
|
|
|
|
local myData = playerData:GetSaveData(victim)
|
|
local wipeOuts = myData:Get("Wipeouts") or 0
|
|
|
|
myData:Set("Wipeouts", wipeOuts + 1)
|
|
lastWipeout[victim.Name] = now
|
|
end
|
|
end
|
|
|
|
local function onCharacterAdded(char)
|
|
local player = game.Players:GetPlayerFromCharacter(char)
|
|
local humanoid = char:WaitForChild("Humanoid")
|
|
|
|
humanoid.Died:Connect(function ()
|
|
onHumanoidDied(humanoid,player)
|
|
end)
|
|
end
|
|
|
|
local function handleSocialBadges(player)
|
|
-- Set up our inviter status from scratch.
|
|
inviterBadgeStatus[player.Name] =
|
|
{
|
|
Counted = 0;
|
|
Queried = {};
|
|
}
|
|
|
|
-- Check the status of other players, and see if we can give them the inviter badge.
|
|
local myData = playerData:GetSaveData(player)
|
|
|
|
for _,otherPlayer in pairs(Players:GetPlayers()) do
|
|
if player ~= otherPlayer and player:IsFriendsWith(otherPlayer.UserId) then
|
|
local theirName = otherPlayer.Name
|
|
local theirStatus = inviterBadgeStatus[theirName]
|
|
|
|
if theirStatus and not theirStatus.Queried[player.Name] then
|
|
theirStatus.Queried[player.Name] = true
|
|
theirStatus.Counted = theirStatus.Counted + 1
|
|
if theirStatus.Counted >= 3 then
|
|
giveBadge(otherPlayer,badges.Inviter)
|
|
end
|
|
end
|
|
|
|
-- Also increment the friendship encounters for these two.
|
|
|
|
local myFrEncs = myData:Get("FriendEncounters") or 0
|
|
myFrEncs = myFrEncs + 1
|
|
|
|
myData:Set("FriendEncounters",myFrEncs)
|
|
|
|
if myFrEncs >= 10 then
|
|
giveBadge(player,badges.Friendship)
|
|
end
|
|
|
|
local theirData = playerData:GetSaveData(otherPlayer)
|
|
local theirFrEncs = theirData:Get("FriendEncounters") or 0
|
|
|
|
theirFrEncs = theirFrEncs + 1
|
|
theirData:Set("FriendEncounters",theirFrEncs)
|
|
|
|
if theirFrEncs >= 10 then
|
|
giveBadge(otherPlayer,badges.Friendship)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
local function onPlayerAdded(player)
|
|
if player.UserId > 0 then
|
|
-- Hook up combat badge listeners
|
|
if usingLeaderboard then
|
|
if player.Character and player.Character:IsDescendantOf(workspace) then
|
|
onCharacterAdded(player.Character)
|
|
end
|
|
|
|
player.CharacterAdded:Connect(onCharacterAdded)
|
|
end
|
|
|
|
-- Handle social badges
|
|
handleSocialBadges(player)
|
|
|
|
-- Handle ambassador badge
|
|
local myData = playerData:GetSaveData(player)
|
|
local myPlaceVisits = myData:Get("PlacesVisited")
|
|
|
|
if myPlaceVisits == nil then
|
|
myPlaceVisits =
|
|
{
|
|
Count = 0;
|
|
Record = {};
|
|
}
|
|
end
|
|
|
|
local placeId = tostring(game.PlaceId)
|
|
|
|
if not myPlaceVisits.Record[placeId] then
|
|
myPlaceVisits.Record[placeId] = true
|
|
myPlaceVisits.Count = myPlaceVisits.Count + 1
|
|
end
|
|
|
|
if myPlaceVisits.Count >= placeCount then
|
|
giveBadge(player, badges.Ambassador)
|
|
end
|
|
|
|
myData:Set("PlacesVisited", myPlaceVisits)
|
|
end
|
|
end
|
|
|
|
for _,v in pairs(Players:GetPlayers()) do
|
|
onPlayerAdded(v)
|
|
end
|
|
|
|
Players.PlayerAdded:Connect(onPlayerAdded)
|
|
|
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------</string>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="Script" referent="40">
|
|
<Properties>
|
|
<string name="Name">Bevels</string>
|
|
<string name="Source">------------------------------------------------------------------------------------------------
|
|
-- Initialization
|
|
------------------------------------------------------------------------------------------------
|
|
|
|
local CollectionService = game:GetService("CollectionService")
|
|
local Debris = game:GetService("Debris")
|
|
local Players = game:GetService("Players")
|
|
local RunService = game:GetService("RunService")
|
|
local ServerStorage = game:GetService("ServerStorage")
|
|
|
|
local function getFlag(name)
|
|
local flag = ServerStorage:FindFirstChild(name)
|
|
return (flag and flag:IsA("BoolValue") and flag.Value)
|
|
end
|
|
|
|
local enableBevels = getFlag("EnableBevels")
|
|
local debugMode = getFlag("DevTestMode")
|
|
|
|
local bevelCache = ServerStorage:FindFirstChild("BevelCache")
|
|
local bevelsReady = bevelCache:FindFirstChild("BevelsReady")
|
|
|
|
if not bevelCache then
|
|
bevelCache = Instance.new("Folder")
|
|
bevelCache.Name = "BevelCache"
|
|
bevelCache.Parent = ServerStorage
|
|
end
|
|
|
|
if not bevelsReady then
|
|
bevelsReady = Instance.new("BoolValue")
|
|
bevelsReady.Name = "BevelsReady"
|
|
bevelsReady.Parent = bevelCache
|
|
bevelsReady.Archivable = false
|
|
end
|
|
|
|
if not enableBevels then
|
|
bevelsReady.Value = true
|
|
return
|
|
end
|
|
|
|
do
|
|
local coreBevelCache = ServerStorage:WaitForChild("CoreBevelCache")
|
|
|
|
for _,bevel in pairs(coreBevelCache:GetChildren()) do
|
|
if not bevelCache:FindFirstChild(bevel.Name) then
|
|
bevel.Parent = bevelCache
|
|
bevel.Archivable = false
|
|
end
|
|
end
|
|
|
|
coreBevelCache:Destroy()
|
|
end
|
|
|
|
local regen = ServerStorage:FindFirstChild("Regeneration")
|
|
|
|
if regen then
|
|
local ready = regen:WaitForChild("Ready")
|
|
|
|
while not ready.Value do
|
|
ready.Changed:Wait()
|
|
end
|
|
end
|
|
|
|
local loadBuildTools = ServerStorage:FindFirstChild("LoadBuildTools")
|
|
local hasBuildTools = (loadBuildTools ~= nil)
|
|
|
|
------------------------------------------------------------------------------------------------
|
|
|
|
local edgeDepth = 1 / 15
|
|
local cornerDepth = edgeDepth * math.sqrt(8 / 3)
|
|
|
|
local mirrorProps =
|
|
{
|
|
"Anchored",
|
|
"CanCollide",
|
|
"CastShadow",
|
|
"CFrame",
|
|
"CollisionGroupId",
|
|
"CustomPhysicalProperties",
|
|
"Color",
|
|
"Locked",
|
|
"Material",
|
|
"Name",
|
|
"Reflectance",
|
|
"RotVelocity",
|
|
"Transparency",
|
|
"Velocity",
|
|
}
|
|
|
|
local surfaceProps =
|
|
{
|
|
"ParamA",
|
|
"ParamB",
|
|
"Surface",
|
|
"SurfaceInput"
|
|
}
|
|
|
|
local bevelHash = "%.2f ~ %.2f ~ %.2f"
|
|
local isStudio = RunService:IsStudio()
|
|
|
|
local negateBase = Instance.new("Part")
|
|
negateBase.Name = "__negateplane"
|
|
negateBase.CanCollide = false
|
|
negateBase.BottomSurface = 0
|
|
negateBase.Transparency = 1
|
|
negateBase.Anchored = true
|
|
negateBase.TopSurface = 0
|
|
negateBase.Locked = true
|
|
|
|
CollectionService:AddTag(negateBase, "NoBevels")
|
|
|
|
for _,normalId in pairs(Enum.NormalId:GetEnumItems()) do
|
|
local name = normalId.Name
|
|
for _,surfaceProp in pairs(surfaceProps) do
|
|
table.insert(mirrorProps, name .. surfaceProp)
|
|
end
|
|
end
|
|
|
|
------------------------------------------------------------------------------------------------
|
|
|
|
local overload = 0
|
|
local threshold = Vector3.new(30, 30, 30)
|
|
|
|
if ServerStorage:FindFirstChild("BevelThreshold") then
|
|
threshold = ServerStorage.BevelThreshold.Value
|
|
end
|
|
|
|
local function debugPrint(...)
|
|
if debugMode then
|
|
warn("[BEVELS DEBUG]:", ...)
|
|
end
|
|
end
|
|
|
|
local function isPartOfHumanoid(object)
|
|
local model = object:FindFirstAncestorOfClass("Model")
|
|
|
|
if model then
|
|
if model:FindFirstChildOfClass("Humanoid") then
|
|
return true
|
|
else
|
|
return isPartOfHumanoid(model)
|
|
end
|
|
end
|
|
|
|
return false
|
|
end
|
|
|
|
local function canGiveBevels(part)
|
|
if part.Parent and part:IsA("Part") and not CollectionService:HasTag(part, "NoBevels") then
|
|
if not isPartOfHumanoid(part) and not part:FindFirstChildWhichIsA("DataModelMesh") then
|
|
local inThreshold = false
|
|
local diff = threshold - part.Size
|
|
|
|
if diff.X >= 0 and diff.Y >= 0 and diff.Z >= 0 then
|
|
inThreshold = true
|
|
end
|
|
|
|
if inThreshold then
|
|
if CollectionService:HasTag(part, "ForceBevels") then
|
|
return true
|
|
else
|
|
return part.Shape.Name == "Block" and part.Transparency < 1
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
return false
|
|
end
|
|
|
|
local function createProxyPart(part, name, tag, sizeChange)
|
|
local proxyPart = Instance.new("Part")
|
|
proxyPart.Name = name
|
|
proxyPart.Locked = true
|
|
proxyPart.TopSurface = 0
|
|
proxyPart.Massless = true
|
|
proxyPart.Transparency = 1
|
|
proxyPart.BottomSurface = 0
|
|
proxyPart.CanCollide = false
|
|
proxyPart.CFrame = part.CFrame
|
|
|
|
local size = part.Size
|
|
if sizeChange then
|
|
size = size + sizeChange
|
|
end
|
|
|
|
local proxyWeld = Instance.new("Weld")
|
|
proxyWeld.Name = "ProxyWeld"
|
|
proxyWeld.Part1 = proxyPart
|
|
proxyWeld.Part0 = part
|
|
|
|
if hasBuildTools then
|
|
local mesh = Instance.new("SpecialMesh")
|
|
mesh.Scale = size * 20
|
|
mesh.MeshType = "Brick"
|
|
mesh.Offset = part.Size
|
|
mesh.Parent = proxyPart
|
|
|
|
proxyPart.Size = Vector3.new(.05, .05, .05)
|
|
proxyWeld.C0 = CFrame.new(-mesh.Offset)
|
|
else
|
|
proxyPart.Size = part.Size
|
|
end
|
|
|
|
CollectionService:AddTag(proxyPart, tag)
|
|
CollectionService:AddTag(proxyPart, "NoBevels")
|
|
CollectionService:AddTag(proxyWeld, "GorillaGlue")
|
|
|
|
proxyWeld.Parent = proxyPart
|
|
proxyPart.Parent = part
|
|
|
|
return proxyPart
|
|
end
|
|
|
|
local function createBevels(part, initializing)
|
|
if not canGiveBevels(part) or isPartOfHumanoid(part) then
|
|
return
|
|
end
|
|
|
|
local size = part.Size
|
|
local sx, sy, sz = size.X, size.Y, size.Z
|
|
local bevelKey = bevelHash:format(sx, sy, sz)
|
|
|
|
local debugBox
|
|
|
|
if debugMode then
|
|
debugBox = Instance.new("BoxHandleAdornment")
|
|
|
|
debugBox.Color3 = Color3.new(0, 2, 2)
|
|
debugBox.AlwaysOnTop = true
|
|
debugBox.Name = "DebugBox"
|
|
debugBox.Size = size
|
|
debugBox.ZIndex = 0
|
|
|
|
debugBox.Adornee = part
|
|
debugBox.Parent = part
|
|
end
|
|
|
|
if not bevelCache:FindFirstChild(bevelKey) then
|
|
local halfSize = size / 2
|
|
|
|
local planeScale = math.max(sx, sy, sz)
|
|
local planes = {}
|
|
|
|
local solverPart = part:Clone()
|
|
solverPart.CFrame = CFrame.new()
|
|
solverPart.BrickColor = BrickColor.new(-1)
|
|
|
|
debugPrint("Solving:", bevelKey)
|
|
|
|
for x = -1, 1 do
|
|
local x0 = (x == 0)
|
|
|
|
for y = -1, 1 do
|
|
local y0 = (y == 0)
|
|
|
|
for z = -1, 1 do
|
|
local z0 = (z == 0)
|
|
|
|
local isCenter = (x0 and y0 and z0)
|
|
local isFace = ((x0 and y0) or (y0 and z0) or (z0 and x0))
|
|
|
|
if not (isCenter or isFace) then
|
|
local isCorner = (not x0 and not y0 and not z0)
|
|
local depth = isCorner and cornerDepth or edgeDepth
|
|
|
|
local offset = Vector3.new(x, y, z)
|
|
local cornerPos = (halfSize * offset)
|
|
|
|
local plane = negateBase:Clone()
|
|
plane.CFrame = CFrame.new(cornerPos, cornerPos + offset)
|
|
plane.Size = Vector3.new(planeScale, planeScale, depth)
|
|
plane.Parent = part
|
|
|
|
table.insert(planes, plane)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
local success, union = pcall(function ()
|
|
return solverPart:SubtractAsync(planes, "Box")
|
|
end)
|
|
|
|
if success then
|
|
union.Name = bevelKey
|
|
union.UsePartColor = true
|
|
union.Parent = bevelCache
|
|
|
|
CollectionService:AddTag(union, "HasBevels")
|
|
|
|
if debugBox then
|
|
debugBox.Color3 = Color3.new(0, 2, 0)
|
|
end
|
|
elseif debugBox then
|
|
debugBox.Color3 = Color3.new(2, 0, 0)
|
|
end
|
|
|
|
for _,plane in pairs(planes) do
|
|
plane:Destroy()
|
|
end
|
|
|
|
overload = 0
|
|
else
|
|
if debugBox then
|
|
debugBox.Color3 = Color3.new(2, 0, 2)
|
|
end
|
|
|
|
overload = overload + 1
|
|
|
|
if overload % 10 == 0 then
|
|
RunService.Heartbeat:Wait()
|
|
end
|
|
end
|
|
|
|
local baseUnion = bevelCache:FindFirstChild(bevelKey)
|
|
|
|
if baseUnion then
|
|
local archivable = baseUnion.Archivable
|
|
baseUnion.Archivable = true
|
|
|
|
local union = baseUnion:Clone()
|
|
baseUnion.Archivable = archivable
|
|
|
|
for _,prop in ipairs(mirrorProps) do
|
|
union[prop] = part[prop]
|
|
end
|
|
|
|
for _,joint in pairs(part:GetJoints()) do
|
|
if joint:IsA("JointInstance") or joint:IsA("WeldConstraint") then
|
|
if joint.Part0 == part then
|
|
joint.Part0 = union
|
|
elseif joint.Part1 == part then
|
|
joint.Part1 = union
|
|
end
|
|
end
|
|
end
|
|
|
|
for _,child in pairs(part:GetChildren()) do
|
|
if not child:IsA("TouchTransmitter") and not child:IsA("Texture") then
|
|
if child:IsA("BaseScript") then
|
|
child.Disabled = true
|
|
end
|
|
|
|
child.Parent = union
|
|
|
|
if child:IsA("BaseScript") then
|
|
child.Disabled = false
|
|
end
|
|
end
|
|
end
|
|
|
|
if not initializing then
|
|
wait()
|
|
end
|
|
|
|
if CollectionService:HasTag(part, "DoUnlock") then
|
|
union.Locked = false
|
|
end
|
|
|
|
if part.ClassName ~= "Part" then
|
|
local holder = Instance.new("Weld")
|
|
holder.Part0 = part
|
|
holder.Part1 = union
|
|
holder.Parent = part
|
|
|
|
union.Anchored = false
|
|
union.Massless = true
|
|
union.Parent = part
|
|
|
|
part.Transparency = 1
|
|
CollectionService:AddTag(holder, "GorillaGlue")
|
|
else
|
|
local parent = part.Parent
|
|
part:Destroy()
|
|
|
|
union.Parent = parent
|
|
end
|
|
elseif debugBox then
|
|
debugBox.Color3 = Color3.new(2, 0, 0)
|
|
end
|
|
|
|
if debugBox then
|
|
debugBox.Transparency = 0.5
|
|
Debris:AddItem(debugBox, 2)
|
|
end
|
|
end
|
|
|
|
------------------------------------------------------------------------------------------------
|
|
|
|
do
|
|
local waitForPlayer = getFlag("BevelsWaitForPlayer")
|
|
|
|
if waitForPlayer then
|
|
-- Wait for a player to spawn
|
|
local playerSpawned = false
|
|
|
|
while not playerSpawned do
|
|
for _,player in pairs(Players:GetPlayers()) do
|
|
if player.Character and player.Character:IsDescendantOf(workspace) then
|
|
playerSpawned = true
|
|
break
|
|
end
|
|
end
|
|
|
|
workspace.ChildAdded:Wait()
|
|
end
|
|
end
|
|
|
|
warn("Solving bevels...")
|
|
|
|
-- Collect all blocks currently in the workspace.
|
|
local initialPass = {}
|
|
local debugHint
|
|
|
|
for _,desc in pairs(workspace:GetDescendants()) do
|
|
if canGiveBevels(desc) then
|
|
if not desc.Locked then
|
|
CollectionService:AddTag(desc, "DoUnlock")
|
|
desc.Locked = true
|
|
end
|
|
|
|
table.insert(initialPass, desc)
|
|
end
|
|
end
|
|
|
|
if waitForPlayer then
|
|
-- Sort the blocks by the sum of their distances from players in the game.
|
|
local samplePoints = {}
|
|
|
|
for _,player in pairs(Players:GetPlayers()) do
|
|
local char = player.Character
|
|
if char then
|
|
local root = char.PrimaryPart
|
|
if root then
|
|
local rootPos = root.Position
|
|
table.insert(samplePoints, rootPos)
|
|
end
|
|
end
|
|
end
|
|
|
|
table.sort(initialPass, function (a, b)
|
|
local distSumA = 0
|
|
local distSumB = 0
|
|
|
|
local posA = a.Position
|
|
local posB = b.Position
|
|
|
|
for _,rootPos in pairs(samplePoints) do
|
|
local distA = (rootPos - posA).Magnitude
|
|
distSumA = distSumA + distA
|
|
|
|
local distB = (rootPos - posB).Magnitude
|
|
distSumB = distSumB + distB
|
|
end
|
|
|
|
if distSumA ~= distSumB then
|
|
return distSumA < distSumB
|
|
end
|
|
|
|
if posA.Y ~= posB.Y then
|
|
return posA.Y < posB.Y
|
|
end
|
|
|
|
if posA.X ~= posB.X then
|
|
return posA.X < posB.X
|
|
end
|
|
|
|
if posA.Z ~= posB.Z then
|
|
return posA.Z < posB.Z
|
|
end
|
|
|
|
return 0
|
|
end)
|
|
end
|
|
|
|
if debugMode then
|
|
debugHint = Instance.new("Hint")
|
|
debugHint.Text = "Generating Bevels..."
|
|
debugHint.Parent = workspace
|
|
end
|
|
|
|
-- Run through the initial bevel creation phase.
|
|
for _,block in ipairs(initialPass) do
|
|
createBevels(block, true)
|
|
end
|
|
|
|
if debugHint then
|
|
debugHint:Destroy()
|
|
end
|
|
end
|
|
|
|
-- Listen for new parts being added.
|
|
workspace.DescendantAdded:Connect(createBevels)
|
|
|
|
-- Allow regeneration to request bevel solving
|
|
local bevelSolver = bevelCache:FindFirstChild("RequestSolve")
|
|
|
|
if not bevelSolver then
|
|
bevelSolver = Instance.new("BindableFunction")
|
|
bevelSolver.Name = "RequestSolve"
|
|
bevelSolver.Parent = bevelCache
|
|
bevelSolver.Archivable = false
|
|
end
|
|
|
|
function bevelSolver.OnInvoke(inst)
|
|
for _,desc in pairs(inst:GetDescendants()) do
|
|
if desc:IsA("Part") then
|
|
createBevels(desc)
|
|
end
|
|
end
|
|
end
|
|
|
|
if RunService:IsStudio() then
|
|
local exportBin = Instance.new("Folder")
|
|
exportBin.Name = "ExportBin"
|
|
exportBin.Parent = ServerStorage
|
|
|
|
for _,v in pairs(bevelCache:GetChildren()) do
|
|
if v:IsA("TriangleMeshPart") and v.Archivable then
|
|
v:Clone().Parent = exportBin
|
|
end
|
|
end
|
|
|
|
wait(.1)
|
|
|
|
for _,v in pairs(exportBin:GetChildren()) do
|
|
if v:FindFirstChild("LOD") then
|
|
v.LOD:Destroy()
|
|
end
|
|
end
|
|
end
|
|
|
|
-- Ready!
|
|
warn("Bevels ready!")
|
|
bevelsReady.Value = true
|
|
|
|
------------------------------------------------------------------------------------------------</string>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="Script" referent="41">
|
|
<Properties>
|
|
<string name="Name">BuildTools</string>
|
|
<string name="Source">local CollectionService = game:GetService("CollectionService")
|
|
local HttpService = game:GetService("HttpService")
|
|
local Players = game:GetService("Players")
|
|
local ReplicatedStorage = game:GetService("ReplicatedStorage")
|
|
|
|
local ServerStorage = game:GetService("ServerStorage")
|
|
|
|
local loadBuildTools = ServerStorage:FindFirstChild("LoadBuildTools")
|
|
if not (loadBuildTools and loadBuildTools.Value) then
|
|
return
|
|
end
|
|
|
|
local looseBranches = ServerStorage:FindFirstChild("LooseBranches")
|
|
|
|
if looseBranches and looseBranches:IsA("BoolValue") then
|
|
looseBranches = looseBranches.Value
|
|
else
|
|
looseBranches = false
|
|
end
|
|
|
|
local toolList = loadBuildTools.Value
|
|
if toolList == true then -- If it's a BoolValue, load all of them.
|
|
toolList = "GameTool;Clone;Delete"
|
|
end
|
|
|
|
local DraggerService = Instance.new("Folder")
|
|
DraggerService.Name = "DraggerService"
|
|
DraggerService.Parent = ReplicatedStorage
|
|
|
|
local draggerGateway = Instance.new("RemoteFunction")
|
|
draggerGateway.Name = "DraggerGateway"
|
|
draggerGateway.Parent = DraggerService
|
|
|
|
local submitUpdate = Instance.new("RemoteEvent")
|
|
submitUpdate.Name = "SubmitUpdate"
|
|
submitUpdate.Parent = DraggerService
|
|
|
|
local draggerScript = script:WaitForChild("Dragger")
|
|
|
|
local activeKeys = {}
|
|
local playerToKey = {}
|
|
local partToKey = {}
|
|
local debounce = {}
|
|
|
|
local SIMULATE_TAG = "SimulateAfterDrag"
|
|
local NO_BREAK_TAG = "GorillaGlue"
|
|
|
|
local function assertClass(obj, class)
|
|
assert(obj)
|
|
assert(typeof(obj) == "Instance")
|
|
assert(obj:IsA(class))
|
|
end
|
|
|
|
local function canGiveKey(player, part)
|
|
if part.Locked then
|
|
return false
|
|
end
|
|
local playerHasKey = playerToKey[player]
|
|
if playerHasKey then
|
|
return false
|
|
end
|
|
local partHasKey = partToKey[part]
|
|
if partHasKey then
|
|
return false
|
|
end
|
|
return true
|
|
end
|
|
|
|
local function claimAssembly(player, part)
|
|
if part:CanSetNetworkOwnership() then
|
|
part:SetNetworkOwner(player)
|
|
end
|
|
end
|
|
|
|
local function validJointsOf(part)
|
|
return coroutine.wrap(function ()
|
|
for _,joint in pairs(part:GetJoints()) do
|
|
if not CollectionService:HasTag(joint, NO_BREAK_TAG) then
|
|
coroutine.yield(joint)
|
|
end
|
|
end
|
|
end)
|
|
end
|
|
|
|
local function breakJoints(part)
|
|
for joint in validJointsOf(part) do
|
|
if not CollectionService:HasTag(joint, NO_BREAK_TAG) then
|
|
joint:Destroy()
|
|
end
|
|
end
|
|
end
|
|
|
|
local function makeJoints(part)
|
|
-- Connect this part to a nearby surface
|
|
workspace:JoinToOutsiders({part}, "Surface")
|
|
end
|
|
|
|
local function removePartKey(key)
|
|
local data = activeKeys[key]
|
|
if data then
|
|
local player = data.Player
|
|
if player then
|
|
playerToKey[player] = nil
|
|
end
|
|
|
|
local part = data.Part
|
|
|
|
if part then
|
|
makeJoints(part)
|
|
|
|
if CollectionService:HasTag(part, SIMULATE_TAG) then
|
|
data.Anchored = false
|
|
CollectionService:RemoveTag(part, SIMULATE_TAG)
|
|
end
|
|
|
|
part.Anchored = data.Anchored
|
|
claimAssembly(player, part)
|
|
|
|
partToKey[part] = nil
|
|
end
|
|
|
|
activeKeys[key] = nil
|
|
end
|
|
end
|
|
|
|
local function restoreJointUpstream(part)
|
|
local collectedParts = {}
|
|
|
|
if part and CollectionService:HasTag(part, SIMULATE_TAG) then
|
|
CollectionService:RemoveTag(part, SIMULATE_TAG)
|
|
part.Anchored = false
|
|
|
|
makeJoints(part)
|
|
|
|
for joint in validJointsOf(part) do
|
|
local part0 = joint.Part0
|
|
local part1 = joint.Part1
|
|
|
|
if part0 and part ~= part0 then
|
|
collectedParts[part0] = true
|
|
restoreJointUpstream(part0)
|
|
end
|
|
|
|
if part1 and part ~= part1 then
|
|
collectedParts[part1] = true
|
|
restoreJointUpstream(part1)
|
|
end
|
|
end
|
|
end
|
|
|
|
return collectedParts
|
|
end
|
|
|
|
local function collapseJointUpstream(part)
|
|
if part and not (part.Locked or CollectionService:HasTag(part, SIMULATE_TAG)) then
|
|
CollectionService:AddTag(part, SIMULATE_TAG)
|
|
part.Anchored = true
|
|
|
|
for joint in validJointsOf(part) do
|
|
local part0 = joint.Part0
|
|
local part1 = joint.Part1
|
|
|
|
if part0 and part ~= part0 then
|
|
collapseJointUpstream(part0)
|
|
end
|
|
|
|
if part1 and part ~= part1 then
|
|
collapseJointUpstream(part1)
|
|
end
|
|
end
|
|
|
|
breakJoints(part)
|
|
end
|
|
end
|
|
|
|
function draggerGateway.OnServerInvoke(player, request, ...)
|
|
if request == "GetKey" then
|
|
local part, asClone = ...
|
|
assertClass(part, "BasePart")
|
|
|
|
if asClone then
|
|
local newPart = part:Clone()
|
|
newPart.Parent = workspace
|
|
|
|
breakJoints(newPart)
|
|
newPart.CFrame = CFrame.new(part.Position + Vector3.new(0, part.Size.Y, 0))
|
|
|
|
local copySound = Instance.new("Sound")
|
|
copySound.SoundId = "rbxasset://sounds/electronicpingshort.wav"
|
|
copySound.PlayOnRemove = true
|
|
copySound.Parent = newPart
|
|
|
|
wait()
|
|
|
|
part = newPart
|
|
copySound:Destroy()
|
|
end
|
|
|
|
if canGiveKey(player, part) then
|
|
local key = HttpService:GenerateGUID(false)
|
|
claimAssembly(player, part)
|
|
|
|
playerToKey[player] = key
|
|
partToKey[part] = key
|
|
|
|
local collected = restoreJointUpstream(part)
|
|
|
|
local anchored = part.Anchored
|
|
part.Anchored = true
|
|
breakJoints(part)
|
|
|
|
for otherPart in pairs(collected) do
|
|
if otherPart:IsGrounded() then
|
|
collapseJointUpstream(otherPart)
|
|
end
|
|
end
|
|
|
|
activeKeys[key] =
|
|
{
|
|
Player = player;
|
|
Part = part;
|
|
Anchored = anchored;
|
|
}
|
|
|
|
return true, key, part
|
|
else
|
|
return false
|
|
end
|
|
elseif request == "ClearKey" then
|
|
local key = ...
|
|
|
|
if not key then
|
|
key = playerToKey[player]
|
|
end
|
|
|
|
if key then
|
|
local data = activeKeys[key]
|
|
if data then
|
|
local owner = data.Player
|
|
if player == owner then
|
|
removePartKey(key)
|
|
end
|
|
end
|
|
end
|
|
elseif request == "RequestDelete" then
|
|
if not debounce[player] then
|
|
local part = ...
|
|
assertClass(part, "BasePart")
|
|
|
|
debounce[player] = true
|
|
|
|
if canGiveKey(player, part) then
|
|
local e = Instance.new("Explosion")
|
|
e.BlastPressure = 0
|
|
e.Position = part.Position
|
|
e.Parent = workspace
|
|
|
|
local s = Instance.new("Sound")
|
|
s.SoundId = "rbxasset://sounds/collide.wav"
|
|
s.Volume = 1
|
|
s.PlayOnRemove = true
|
|
s.Parent = part
|
|
|
|
local connectedParts = restoreJointUpstream(part)
|
|
part:Destroy()
|
|
|
|
for otherPart in pairs(connectedParts) do
|
|
if otherPart:IsGrounded() then
|
|
collapseJointUpstream(otherPart)
|
|
end
|
|
end
|
|
end
|
|
|
|
wait(.1)
|
|
debounce[player] = false
|
|
end
|
|
end
|
|
end
|
|
|
|
local function onChildAdded(child)
|
|
if child:IsA("Backpack") then
|
|
for draggerTool in toolList:gmatch("[^;]+") do
|
|
local tool = Instance.new("Tool")
|
|
tool.Name = draggerTool
|
|
tool.RequiresHandle = false
|
|
|
|
local newDragger = draggerScript:Clone()
|
|
newDragger.Parent = tool
|
|
newDragger.Disabled = false
|
|
|
|
tool.Parent = child
|
|
end
|
|
end
|
|
end
|
|
|
|
local function onPlayerAdded(player)
|
|
for _, v in pairs(player:GetChildren()) do
|
|
onChildAdded(v)
|
|
end
|
|
|
|
player.ChildAdded:Connect(onChildAdded)
|
|
end
|
|
|
|
local function onPlayerRemoved(player)
|
|
local key = playerToKey[player]
|
|
if key then
|
|
removePartKey(key)
|
|
end
|
|
end
|
|
|
|
local function onSubmitUpdate(player, key, cframe)
|
|
local keyData = activeKeys[key]
|
|
if keyData then
|
|
local owner = keyData.Player
|
|
if owner == player then
|
|
local part = keyData.Part
|
|
if part and part:IsDescendantOf(workspace) then
|
|
breakJoints(part)
|
|
part.CFrame = cframe
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
for _, player in pairs(game.Players:GetPlayers()) do
|
|
onPlayerAdded(player)
|
|
end
|
|
|
|
submitUpdate.OnServerEvent:Connect(onSubmitUpdate)
|
|
Players.PlayerAdded:Connect(onPlayerAdded)
|
|
Players.PlayerRemoving:Connect(onPlayerRemoved)
|
|
|
|
-- Garbage Collection
|
|
|
|
while wait(5) do
|
|
for part, key in pairs(partToKey) do
|
|
if not part:IsDescendantOf(workspace) then
|
|
removePartKey(key)
|
|
end
|
|
end
|
|
end</string>
|
|
</Properties>
|
|
<Item class="LocalScript" referent="42">
|
|
<Properties>
|
|
<string name="Name">Dragger</string>
|
|
<string name="Source">local CollectionService = game:GetService("CollectionService")
|
|
local RunService = game:GetService("RunService")
|
|
local UserInputService = game:GetService("UserInputService")
|
|
local ReplicatedStorage = game:GetService("ReplicatedStorage")
|
|
local SoundService = game:GetService("SoundService")
|
|
local Dragger = Instance.new("Dragger")
|
|
|
|
local tool = script.Parent
|
|
local selection = Instance.new("SelectionBox")
|
|
selection.Parent = tool
|
|
selection.Transparency = 1
|
|
|
|
local icon = Instance.new("StringValue")
|
|
icon.Name = "IconOverride"
|
|
icon.Parent = tool
|
|
|
|
local mode = tool.Name
|
|
local draggerService = ReplicatedStorage:WaitForChild("DraggerService")
|
|
local gateway = draggerService:WaitForChild("DraggerGateway")
|
|
local submitUpdate = draggerService:WaitForChild("SubmitUpdate")
|
|
|
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
-- Connections
|
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
local cons = {}
|
|
|
|
local function addConnections(connections)
|
|
for event, func in pairs(connections) do
|
|
local con = event:Connect(func)
|
|
table.insert(cons, con)
|
|
end
|
|
end
|
|
|
|
local function clearCons()
|
|
while #cons > 0 do
|
|
local connection = table.remove(cons)
|
|
connection:Disconnect()
|
|
end
|
|
end
|
|
|
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
-- Keys
|
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
local keyLocks = {}
|
|
|
|
local function onInputEnded(input)
|
|
if keyLocks[input.KeyCode.Name] then
|
|
keyLocks[input.KeyCode.Name] = nil
|
|
end
|
|
end
|
|
|
|
local function isKeyDown(key)
|
|
if UserInputService:IsKeyDown(key) and not keyLocks[key] then
|
|
keyLocks[key] = true
|
|
return true
|
|
end
|
|
return false
|
|
end
|
|
|
|
UserInputService.InputEnded:Connect(onInputEnded)
|
|
|
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
-- Tool Style
|
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
local style =
|
|
{
|
|
GameTool =
|
|
{
|
|
Icon = "rbxassetid://1048129653";
|
|
HoverColor = Color3.fromRGB(25,153,255);
|
|
Cursors =
|
|
{
|
|
Idle = "";
|
|
Hover = "rbxasset://textures/DragCursor.png";
|
|
Grab = "rbxasset://textures/GrabRotateCursor.png";
|
|
};
|
|
};
|
|
Clone =
|
|
{
|
|
Icon = "rbxasset://textures/Clone.png";
|
|
HoverColor = Color3.fromRGB(25,153,255);
|
|
Cursors =
|
|
{
|
|
Idle = "rbxasset://textures/CloneCursor.png";
|
|
Hover = "rbxassetid://1048136830";
|
|
Grab = "rbxasset://textures/GrabRotateCursor.png";
|
|
}
|
|
};
|
|
Delete =
|
|
{
|
|
Icon = "rbxasset://textures/Hammer.png";
|
|
HoverColor = Color3.new(1,0.5,0);
|
|
CanShowWithHover = true;
|
|
Cursors =
|
|
{
|
|
Idle = "rbxasset://textures/HammerCursor.png";
|
|
Hover = "rbxasset://textures/HammerOverCursor.png";
|
|
}
|
|
}
|
|
}
|
|
|
|
local function getIcon(iconType)
|
|
return style[mode].Cursors[iconType]
|
|
end
|
|
|
|
tool.TextureId = style[mode].Icon
|
|
selection.Color3 = style[mode].HoverColor
|
|
|
|
if style[mode].CanShowWithHover then
|
|
selection.Transparency = 0
|
|
end
|
|
|
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
-- Dragger
|
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
local mouse
|
|
local currentKey
|
|
local down = false
|
|
local debounce = false
|
|
|
|
local function onIdle()
|
|
if not down and mouse then
|
|
local mousePart = mouse.Target
|
|
|
|
if mousePart and not mousePart.Locked then
|
|
selection.Adornee = mousePart
|
|
icon.Value = getIcon("Hover")
|
|
return
|
|
end
|
|
|
|
selection.Adornee = nil
|
|
icon.Value = getIcon("Idle")
|
|
end
|
|
end
|
|
|
|
local function draggerRotate(axis)
|
|
if down then
|
|
Dragger:AxisRotate(axis)
|
|
end
|
|
end
|
|
|
|
local function startDraggerAction(mPart)
|
|
if mode == "Delete" then
|
|
gateway:InvokeServer("RequestDelete",mPart)
|
|
return
|
|
end
|
|
|
|
local pointOnMousePart = mPart.CFrame:ToObjectSpace(mouse.Hit).Position
|
|
local canDrag, dragKey, mousePart = gateway:InvokeServer("GetKey", mPart, mode == "Clone")
|
|
|
|
if canDrag then
|
|
selection.Adornee = mousePart
|
|
selection.Transparency = 0
|
|
|
|
down = true
|
|
currentKey = dragKey
|
|
|
|
icon.Value = getIcon("Grab")
|
|
Dragger:MouseDown(mousePart, pointOnMousePart, {mousePart})
|
|
|
|
local lastSubmit = 0
|
|
|
|
while down do
|
|
local now = tick()
|
|
local joints = {}
|
|
|
|
for _,joint in pairs(mousePart:GetJoints()) do
|
|
if CollectionService:HasTag(joint, "GorillaGlue") then
|
|
joints[joint] = joint.Parent
|
|
joint.Parent = nil
|
|
end
|
|
end
|
|
|
|
--local mousePart = selection.Adornee
|
|
if down then
|
|
Dragger:MouseMove(mouse.UnitRay)
|
|
end
|
|
|
|
if mousePart and currentKey then
|
|
if isKeyDown("R") then
|
|
draggerRotate("Z")
|
|
elseif isKeyDown("T") then
|
|
draggerRotate("X")
|
|
end
|
|
|
|
if now - lastSubmit > 0.03 then
|
|
submitUpdate:FireServer(currentKey, mousePart.CFrame)
|
|
lastSubmit = now
|
|
end
|
|
end
|
|
|
|
for joint, parent in pairs(joints) do
|
|
joint.Parent = parent
|
|
end
|
|
|
|
RunService.Heartbeat:Wait()
|
|
end
|
|
|
|
selection.Transparency = 1
|
|
gateway:InvokeServer("ClearKey", dragKey)
|
|
|
|
currentKey = nil
|
|
end
|
|
end
|
|
|
|
local function onButton1Down()
|
|
if not debounce then
|
|
debounce = true
|
|
|
|
local mousePart = selection.Adornee
|
|
|
|
if mousePart and not down then
|
|
startDraggerAction(mousePart)
|
|
end
|
|
|
|
debounce = false
|
|
end
|
|
end
|
|
|
|
local function onButton1Up()
|
|
if down then
|
|
down = false
|
|
Dragger:MouseUp()
|
|
end
|
|
end
|
|
|
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
-- Tool
|
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
local function onEquipped(newMouse)
|
|
mouse = newMouse
|
|
addConnections
|
|
{
|
|
[mouse.Button1Down] = onButton1Down;
|
|
[mouse.Button1Up] = onButton1Up;
|
|
[mouse.Idle] = onIdle;
|
|
}
|
|
end
|
|
|
|
local function onUnequipped()
|
|
onButton1Up()
|
|
clearCons()
|
|
|
|
selection.Adornee = nil
|
|
mouse = nil
|
|
end
|
|
|
|
tool.Equipped:Connect(onEquipped)
|
|
tool.Unequipped:Connect(onUnequipped)
|
|
|
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------</string>
|
|
</Properties>
|
|
</Item>
|
|
</Item>
|
|
<Item class="Script" referent="43">
|
|
<Properties>
|
|
<string name="Name">CaptureTheFlag</string>
|
|
<string name="Source">local Players = game:GetService("Players")
|
|
local CollectionService = game:GetService("CollectionService")
|
|
local Teams = game:GetService("Teams")
|
|
|
|
local FlagInstance = "FlagInstance"
|
|
local FlagStandInstance = "FlagStandInstance"
|
|
|
|
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
-- Flags
|
|
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
local function restoreFlag(flag)
|
|
local owner = flag:FindFirstChild("FlagStand")
|
|
local flagStand = owner and owner.Part0
|
|
|
|
if owner and flagStand then
|
|
for _,joint in pairs(flag:GetJoints()) do
|
|
if joint.Name == "RightGrip" then
|
|
joint:Destroy()
|
|
end
|
|
end
|
|
|
|
if flag.Name == "Handle" then
|
|
local tool = flag.Parent
|
|
if tool:IsA("Tool") then
|
|
flag.Name = tool.Name
|
|
tool.Parent = nil
|
|
end
|
|
end
|
|
|
|
flag.CFrame = flagStand.CFrame
|
|
flag.Parent = flagStand.Parent
|
|
|
|
wait()
|
|
|
|
flag.Velocity = Vector3.new()
|
|
flag.RotVelocity = Vector3.new()
|
|
|
|
owner.Part1 = flag
|
|
flag.Anchored = false
|
|
end
|
|
end
|
|
|
|
local function mountFlagAsTool(flag, humanoid)
|
|
local owner = flag:FindFirstChild("FlagStand")
|
|
local teamColor = flag:FindFirstChild("TeamColor")
|
|
|
|
if not (owner and teamColor) or flag.Name == "Handle" then
|
|
return
|
|
end
|
|
|
|
local grip = CFrame.new(0.25, 0, 0) * CFrame.Angles(0, -math.pi / 2, 0)
|
|
|
|
local tool = Instance.new("Tool")
|
|
tool.Name = flag.Name
|
|
tool.Grip = grip
|
|
|
|
local deathCon
|
|
|
|
local function onDied()
|
|
local char = humanoid.Parent
|
|
|
|
if char and tool.Parent == char then
|
|
humanoid:UnequipTools()
|
|
end
|
|
|
|
if deathCon then
|
|
deathCon:Disconnect()
|
|
deathCon = nil
|
|
end
|
|
end
|
|
|
|
local function onUnequipped()
|
|
if deathCon then
|
|
deathCon:Disconnect()
|
|
deathCon = nil
|
|
end
|
|
|
|
if humanoid then
|
|
local rootPart = humanoid.RootPart
|
|
|
|
if rootPart then
|
|
local cf = rootPart.CFrame * CFrame.new(0, 4, -8)
|
|
flag.RotVelocity = Vector3.new(1, 1, 1)
|
|
flag.Position = cf.Position
|
|
end
|
|
end
|
|
|
|
if flag.Parent == tool then
|
|
flag.Parent = workspace
|
|
end
|
|
|
|
flag.Name = tool.Name
|
|
|
|
spawn(function ()
|
|
tool:Destroy()
|
|
end)
|
|
end
|
|
|
|
tool.Unequipped:Connect(onUnequipped)
|
|
CollectionService:AddTag(tool, "Flag")
|
|
|
|
tool.Parent = workspace
|
|
owner.Part1 = nil
|
|
|
|
flag.Name = "Handle"
|
|
flag.Parent = tool
|
|
|
|
humanoid:EquipTool(tool)
|
|
deathCon = humanoid.Died:Connect(onDied)
|
|
end
|
|
|
|
local function onFlagAdded(flag)
|
|
if not flag:IsA("BasePart") then
|
|
return
|
|
end
|
|
|
|
-- Mount TeamColor
|
|
local teamColor = flag:FindFirstChild("TeamColor")
|
|
|
|
if not teamColor then
|
|
teamColor = Instance.new("BrickColorValue")
|
|
teamColor.Value = flag.BrickColor
|
|
teamColor.Name = "TeamColor"
|
|
teamColor.Parent = flag
|
|
end
|
|
|
|
-- Mount FlagStand
|
|
local flagStand, owner
|
|
|
|
for _,part in pairs(flag:GetConnectedParts()) do
|
|
if CollectionService:HasTag(part, FlagStandInstance) then
|
|
flagStand = part
|
|
break
|
|
end
|
|
end
|
|
|
|
if flagStand then
|
|
owner = Instance.new("Weld")
|
|
owner.C0 = flagStand.CFrame:ToObjectSpace(flag.CFrame)
|
|
owner.Name = "FlagStand"
|
|
owner.Part0 = flagStand
|
|
owner.Parent = flag
|
|
|
|
for _,joint in pairs(flag:GetJoints()) do
|
|
if joint ~= owner then
|
|
joint:Destroy()
|
|
end
|
|
end
|
|
|
|
owner.Part1 = flag
|
|
CollectionService:AddTag(owner, "GorillaGlue")
|
|
end
|
|
|
|
spawn(function ()
|
|
-- Try to keep the flag from falling out of the world.
|
|
local deathPlane = workspace.FallenPartsDestroyHeight
|
|
|
|
while flag:IsDescendantOf(workspace) do
|
|
if flag.Position.Y < deathPlane + 200 then
|
|
local tool = flag.Parent
|
|
|
|
if tool:IsA("Tool") then
|
|
tool.Parent = workspace
|
|
wait()
|
|
end
|
|
|
|
restoreFlag(flag)
|
|
end
|
|
|
|
wait()
|
|
end
|
|
end)
|
|
|
|
local function onTouched(hit)
|
|
local char = hit.Parent
|
|
if char then
|
|
local player = Players:GetPlayerFromCharacter(char)
|
|
local humanoid = char:FindFirstChildOfClass("Humanoid")
|
|
|
|
if player and humanoid then
|
|
if player.Neutral then
|
|
return
|
|
end
|
|
|
|
if player.TeamColor == teamColor.Value then
|
|
if owner.Part1 ~= flag then
|
|
restoreFlag(flag)
|
|
end
|
|
else
|
|
mountFlagAsTool(flag, humanoid)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
flag.Touched:Connect(onTouched)
|
|
end
|
|
|
|
for _,flag in pairs(CollectionService:GetTagged(FlagInstance)) do
|
|
onFlagAdded(flag)
|
|
end
|
|
|
|
local flagAdded = CollectionService:GetInstanceAddedSignal(FlagInstance)
|
|
flagAdded:Connect(onFlagAdded)
|
|
|
|
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
-- Flag Stands
|
|
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
local function onFlagStandAdded(flagStand)
|
|
if not flagStand:IsA("BasePart") then
|
|
return
|
|
end
|
|
|
|
local debounce = false
|
|
local teamColor = flagStand:FindFirstChild("TeamColor")
|
|
local flagCaptured = flagStand:FindFirstChild("FlagCaptured")
|
|
|
|
if not teamColor then
|
|
teamColor = Instance.new("BrickColorValue")
|
|
teamColor.Value = flagStand.BrickColor
|
|
teamColor.Name = "TeamColor"
|
|
teamColor.Parent = flagStand
|
|
end
|
|
|
|
if not flagCaptured then
|
|
flagCaptured = Instance.new("BindableEvent")
|
|
flagCaptured.Name = "FlagCaptured"
|
|
flagCaptured.Parent = flagStand
|
|
end
|
|
|
|
local function onTouched(hit)
|
|
if debounce then
|
|
return
|
|
end
|
|
|
|
local char = hit.Parent
|
|
if char then
|
|
local player = Players:GetPlayerFromCharacter(char)
|
|
if player then
|
|
if player.Neutral then
|
|
return
|
|
end
|
|
|
|
if player.TeamColor ~= teamColor.Value then
|
|
return
|
|
end
|
|
|
|
local tool = char:FindFirstChildOfClass("Tool")
|
|
local handle = tool and tool:FindFirstChild("Handle")
|
|
|
|
if handle and CollectionService:HasTag(handle, FlagInstance) then
|
|
debounce = true
|
|
print("flag captured!")
|
|
|
|
flagCaptured:Fire(player)
|
|
restoreFlag(handle)
|
|
|
|
tool:Destroy()
|
|
|
|
wait(1)
|
|
debounce = false
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
flagStand.Touched:Connect(onTouched)
|
|
end
|
|
|
|
local function onFlagStandRemoved(flagStand)
|
|
local teamColor = flagStand:FindFirstChild("TeamColor")
|
|
local flagCaptured = flagStand:FindFirstChild("FlagCaptured")
|
|
|
|
if teamColor then
|
|
teamColor:Destroy()
|
|
end
|
|
|
|
if flagCaptured then
|
|
flagCaptured:Destroy()
|
|
end
|
|
end
|
|
|
|
for _,flagStand in pairs(CollectionService:GetTagged(FlagStandInstance)) do
|
|
onFlagStandAdded(flagStand)
|
|
end
|
|
|
|
local flagStandAdded = CollectionService:GetInstanceAddedSignal(FlagStandInstance)
|
|
flagStandAdded:Connect(onFlagStandAdded)
|
|
|
|
local flagStandRemoved = CollectionService:GetInstanceRemovedSignal(FlagStandInstance)
|
|
flagStandRemoved:Connect(onFlagStandRemoved)
|
|
|
|
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------</string>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="Script" referent="44">
|
|
<Properties>
|
|
<string name="Name">Characters</string>
|
|
<string name="Source">local CollectionService = game:GetService("CollectionService")
|
|
local Players = game:GetService("Players")
|
|
local InsertService = game:GetService("InsertService")
|
|
local ReplicatedStorage = game:GetService("ReplicatedStorage")
|
|
local ServerStorage = game:GetService("ServerStorage")
|
|
|
|
local hats = ServerStorage:WaitForChild("ServerHatCache")
|
|
local requestCharacter = ReplicatedStorage:WaitForChild("RequestCharacter")
|
|
local assetUtil = require(ReplicatedStorage:WaitForChild("AssetUtil"))
|
|
local itemData = ReplicatedStorage:WaitForChild("ItemData")
|
|
local hatData = require(itemData:WaitForChild("Hat"))
|
|
|
|
local playerDataGet = { Success = false }
|
|
pcall(function ()
|
|
playerDataGet = require(ServerStorage:WaitForChild("PlayerDataStore"))
|
|
end)
|
|
|
|
if not playerDataGet.Success then
|
|
warn("Failed to get PlayerData. Avatars will not be loaded.")
|
|
end
|
|
|
|
local playerDataStore = playerDataGet.DataStore
|
|
|
|
local limbs = {"Head", "Torso", "LeftArm", "RightArm", "LeftLeg", "RightLeg"}
|
|
|
|
local function preBufferHat(hatId)
|
|
local hat = hats:FindFirstChild(hatId)
|
|
|
|
if not hat then
|
|
local success, import = assetUtil:SafeCall(InsertService, "LoadAsset", tonumber(hatId))
|
|
|
|
if success then
|
|
hat = import:FindFirstChildWhichIsA("Accoutrement")
|
|
if hat then
|
|
hat.Name = hatId
|
|
hat.Parent = hats
|
|
end
|
|
end
|
|
end
|
|
|
|
return hat
|
|
end
|
|
|
|
local function safeDestroy(obj)
|
|
spawn(function ()
|
|
obj:Destroy()
|
|
end)
|
|
end
|
|
|
|
local function onCharacterAdded(char)
|
|
local player = Players:GetPlayerFromCharacter(char)
|
|
|
|
local bodyColors = script.BodyColors:Clone()
|
|
CollectionService:AddTag(bodyColors, "RespectCharacterAsset")
|
|
|
|
local graphic = script.ShirtGraphic:Clone()
|
|
|
|
local shirt = char:FindFirstChildWhichIsA("Shirt")
|
|
if not shirt then
|
|
shirt = script.Shirt:Clone()
|
|
end
|
|
|
|
local pants = char:FindFirstChildWhichIsA("Pants")
|
|
if not pants then
|
|
pants = script.Pants:Clone()
|
|
end
|
|
|
|
local faceId = 1104210678
|
|
local tshirtId = 131792587
|
|
|
|
local humanoid = char:WaitForChild("Humanoid")
|
|
CollectionService:AddTag(humanoid, "Animator")
|
|
|
|
local function onDied()
|
|
if char:FindFirstChild("HumanoidRootPart") then
|
|
char.HumanoidRootPart:Destroy()
|
|
end
|
|
|
|
wait(5)
|
|
|
|
local player = game.Players:GetPlayerFromCharacter(char)
|
|
if player then
|
|
player:LoadCharacter()
|
|
end
|
|
end
|
|
|
|
local function onDescendantAdded(desc)
|
|
if desc:IsA("CharacterMesh") and not desc.Name:sub(1, 3) == "CL_" then
|
|
safeDestroy(desc)
|
|
elseif desc:IsA("Accoutrement") then
|
|
-- Safe way to deter non-game accessories, since I name them by their AssetId
|
|
if not tonumber(desc.Name) then
|
|
safeDestroy(desc)
|
|
end
|
|
elseif desc:IsA("SpecialMesh") and desc.Parent.Name == "Head" then
|
|
if desc.Name ~= "HeadMesh" then
|
|
wait()
|
|
|
|
local override = Instance.new("SpecialMesh")
|
|
override.Name = "HeadMesh"
|
|
override.Scale = Vector3.new(1.25, 1.25, 1.25)
|
|
override.Parent = desc.Parent
|
|
|
|
safeDestroy(desc)
|
|
end
|
|
elseif desc:IsA("BodyColors") and desc ~= bodyColors and not CollectionService:HasTag(bodyColors, "RespectCharacterAsset") then
|
|
safeDestroy(desc)
|
|
bodyColors.Parent = nil
|
|
wait()
|
|
bodyColors.Parent = char
|
|
end
|
|
end
|
|
|
|
for _,v in pairs(char:GetDescendants()) do
|
|
onDescendantAdded(v)
|
|
end
|
|
|
|
char.DescendantAdded:Connect(onDescendantAdded)
|
|
humanoid.Died:Connect(onDied)
|
|
|
|
if player.UserId > 0 and playerDataStore then
|
|
local playerData = playerDataStore:GetSaveData(player)
|
|
local colorData = playerData:Get("BodyColors")
|
|
if colorData then
|
|
for _,limb in pairs(limbs) do
|
|
local num = colorData[limb]
|
|
if num then
|
|
bodyColors[limb.."Color"] = BrickColor.new(num)
|
|
end
|
|
end
|
|
end
|
|
|
|
local loadout = playerData:Get("Loadout")
|
|
if loadout then
|
|
local shirtId = loadout.Shirt
|
|
if shirtId then
|
|
shirt.ShirtTemplate = "rbxassetid://" .. shirtId
|
|
end
|
|
local pantsId = loadout.Pants
|
|
if pantsId then
|
|
pants.PantsTemplate = "rbxassetid://" .. pantsId
|
|
end
|
|
|
|
faceId = loadout.Face or faceId
|
|
spawn(function ()
|
|
local hatId = loadout.Hat or 0
|
|
if hatId > 0 then
|
|
local hatSrc = preBufferHat(hatId)
|
|
local hat = hatSrc:Clone()
|
|
hat.Parent = char
|
|
end
|
|
end)
|
|
end
|
|
|
|
tshirtId = playerData:Get("TShirt") or tshirtId
|
|
end
|
|
|
|
if tshirtId > 0 then
|
|
local success,img = assetUtil:RequestImage(tshirtId)
|
|
if success and img then
|
|
graphic.Graphic = img
|
|
graphic.Parent = char
|
|
end
|
|
end
|
|
|
|
bodyColors.Parent = char
|
|
shirt.Parent = char
|
|
pants.Parent = char
|
|
|
|
local head = char:WaitForChild("Head")
|
|
local face = head:WaitForChild("face")
|
|
face.Texture = "rbxhttp://Game/Tools/ThumbnailAsset.ashx?fmt=png&wd=420&ht=420&aid=" .. faceId
|
|
end
|
|
|
|
local function onRequestCharacter(player)
|
|
if not player.Character then
|
|
player:LoadCharacter()
|
|
end
|
|
end
|
|
|
|
local function onPlayerAdded(player)
|
|
player.CanLoadCharacterAppearance = false
|
|
player.CharacterAdded:connect(onCharacterAdded)
|
|
|
|
if player.Character then
|
|
onCharacterAdded(player.Character)
|
|
end
|
|
|
|
if game.JobId == "" then
|
|
player:LoadCharacter()
|
|
end
|
|
end
|
|
|
|
for _,v in pairs(Players:GetPlayers()) do
|
|
onPlayerAdded(v)
|
|
end
|
|
|
|
Players.PlayerAdded:connect(onPlayerAdded)
|
|
requestCharacter.OnServerEvent:Connect(onRequestCharacter)</string>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="Script" referent="45">
|
|
<Properties>
|
|
<string name="Name">Chat</string>
|
|
<string name="Source">local Players = game:GetService("Players")
|
|
local TextService = game:GetService("TextService")
|
|
local Chat = game:GetService("Chat")
|
|
local ReplicatedStorage = game:GetService("ReplicatedStorage")
|
|
|
|
local chatRemote = ReplicatedStorage:WaitForChild("ChatRemote")
|
|
local mSafeChatTree = ReplicatedStorage:WaitForChild("SafeChatTree")
|
|
local safeChatTree = require(mSafeChatTree)
|
|
|
|
local filterCache = {}
|
|
local maxChatLength = 128
|
|
|
|
local function onServerEvent(player, message)
|
|
assert(typeof(message) == "string", "bad input passed")
|
|
assert(#message <= maxChatLength, "Chat message was too long!")
|
|
|
|
if message:sub(1,3) == "/sc" then
|
|
local tree = safeChatTree
|
|
|
|
for t in message:gmatch("%d+") do
|
|
local i = tonumber(t) + 1
|
|
tree = tree.Branches[i]
|
|
|
|
if not tree then
|
|
break
|
|
end
|
|
end
|
|
|
|
message = tree and tree.Label or " "
|
|
end
|
|
|
|
local asciiMessage = ""
|
|
|
|
for p, c in utf8.codes(message) do
|
|
if c > 0x1F600 then
|
|
asciiMessage = asciiMessage .. "??"
|
|
else
|
|
asciiMessage = asciiMessage .. utf8.char(c)
|
|
end
|
|
end
|
|
|
|
message = asciiMessage
|
|
|
|
local userId = player.UserId
|
|
if not filterCache[userId] then
|
|
filterCache[userId] = {}
|
|
end
|
|
|
|
local filterResult = filterCache[userId][message]
|
|
|
|
if not filterResult then
|
|
filterResult = TextService:FilterStringAsync(message,userId)
|
|
filterCache[userId][message] = filterResult
|
|
end
|
|
|
|
for _,receiver in pairs(Players:GetPlayers()) do
|
|
spawn(function ()
|
|
pcall(function ()
|
|
local filtered = filterResult:GetChatForUserAsync(receiver.UserId)
|
|
chatRemote:FireClient(receiver, player, filtered, filtered ~= message)
|
|
end)
|
|
end)
|
|
end
|
|
end
|
|
|
|
chatRemote.OnServerEvent:Connect(onServerEvent)</string>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="Script" referent="46">
|
|
<Properties>
|
|
<string name="Name">Cylinders</string>
|
|
<string name="Source"><![CDATA[local CollectionService = game:GetService("CollectionService")
|
|
|
|
local cylinderSurface = script:WaitForChild("CylinderSurface")
|
|
local cylinderListener = CollectionService:GetInstanceAddedSignal("Cylinder")
|
|
|
|
local min, max = math.min, math.max
|
|
|
|
local function makeCylinderSurface(part, sizeUpdated)
|
|
local surface = cylinderSurface:Clone()
|
|
surface.Parent = part
|
|
surface.Adornee = part
|
|
surface.Archivable = false
|
|
|
|
local lastSize = Vector3.new()
|
|
|
|
local function onSizeUpdated()
|
|
local size = part.Size
|
|
if size ~= lastSize then
|
|
local scale = min(size.Y, size.Z)
|
|
surface.CanvasSize = Vector2.new(max(100, scale * 100), max(100, scale * 100))
|
|
lastSize = size
|
|
end
|
|
end
|
|
|
|
onSizeUpdated()
|
|
sizeUpdated:Connect(onSizeUpdated)
|
|
|
|
return surface
|
|
end
|
|
|
|
local function bindCylinder(part)
|
|
if not part:IsA("Part") then
|
|
return
|
|
end
|
|
|
|
local sizeUpdated = part:GetPropertyChangedSignal("Size")
|
|
part.Shape = "Ball"
|
|
part:MakeJoints()
|
|
|
|
local mesh = Instance.new("SpecialMesh")
|
|
mesh.MeshId = "rbxassetid://1009010722"
|
|
mesh.Archivable = false
|
|
mesh.Parent = part
|
|
|
|
local leftSurface = makeCylinderSurface(part, sizeUpdated)
|
|
leftSurface.Face = "Left"
|
|
|
|
local rightSurface = makeCylinderSurface(part, sizeUpdated)
|
|
rightSurface.Face = "Right"
|
|
|
|
local function onSizeUpdated()
|
|
local size = part.Size
|
|
local scale = math.min(size.Y,size.Z)
|
|
mesh.Scale = Vector3.new(scale,scale,scale)
|
|
end
|
|
|
|
onSizeUpdated()
|
|
sizeUpdated:Connect(onSizeUpdated)
|
|
end
|
|
|
|
local function findCylinder(obj)
|
|
if obj:IsA("Part") and obj.Shape == Enum.PartType.Cylinder then
|
|
CollectionService:AddTag(obj, "Cylinder")
|
|
end
|
|
end
|
|
|
|
for _, obj in pairs(workspace:GetDescendants()) do
|
|
findCylinder(obj)
|
|
end
|
|
|
|
for _, cylinder in pairs(CollectionService:GetTagged("Cylinder")) do
|
|
bindCylinder(cylinder)
|
|
end
|
|
|
|
workspace.DescendantAdded:Connect(findCylinder)
|
|
cylinderListener:Connect(bindCylinder)
|
|
]]></string>
|
|
</Properties>
|
|
<Item class="SurfaceGui" referent="47">
|
|
<Properties>
|
|
<string name="Name">CylinderSurface</string>
|
|
<bool name="Active">true</bool>
|
|
<Ref name="Adornee">null</Ref>
|
|
<bool name="AlwaysOnTop">false</bool>
|
|
<bool name="archivable">true</bool>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Vector2 name="CanvasSize">
|
|
<X>100</X>
|
|
<Y>100</Y>
|
|
</Vector2>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Enabled">true</bool>
|
|
<token name="Face">1</token>
|
|
<float name="LightInfluence">0</float>
|
|
<float name="PixelsPerStud">50</float>
|
|
<bool name="ResetOnSpawn">true</bool>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<token name="SizingMode">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<float name="ToolPunchThroughDistance">0</float>
|
|
<token name="ZIndexBehavior">0</token>
|
|
<float name="ZOffset">0</float>
|
|
</Properties>
|
|
<Item class="Frame" referent="48">
|
|
<Properties>
|
|
<string name="Name">Frame</string>
|
|
<bool name="Active">false</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>0.5</X>
|
|
<Y>0.5</Y>
|
|
</Vector2>
|
|
<bool name="archivable">true</bool>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>0.32549020648002625</R>
|
|
<G>0.32549020648002625</G>
|
|
<B>0.32549020648002625</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">0</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<int name="LayoutOrder">0</int>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0.5</XS>
|
|
<XO>0</XO>
|
|
<YS>0.5</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>20</XO>
|
|
<YS>0.699999988079071</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">1</int>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="Frame" referent="49">
|
|
<Properties>
|
|
<string name="Name">Frame</string>
|
|
<bool name="Active">false</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>0.5</X>
|
|
<Y>0.5</Y>
|
|
</Vector2>
|
|
<bool name="archivable">true</bool>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>0.32549020648002625</R>
|
|
<G>0.32549020648002625</G>
|
|
<B>0.32549020648002625</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">0</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<int name="LayoutOrder">0</int>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0.5</XS>
|
|
<XO>0</XO>
|
|
<YS>0.5</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0.699999988079071</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>20</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">1</int>
|
|
</Properties>
|
|
</Item>
|
|
</Item>
|
|
</Item>
|
|
<Item class="Script" referent="50">
|
|
<Properties>
|
|
<string name="Name">Explosions</string>
|
|
<string name="Source">local CollectionService = game:GetService("CollectionService")
|
|
local Debris = game:GetService("Debris")
|
|
local ServerStorage = game:GetService("ServerStorage")
|
|
|
|
local FORCE_GRANULARITY = 2
|
|
local allowTeamDamage = false
|
|
|
|
local teamDamage = ServerStorage:FindFirstChild("TeamDamage")
|
|
if teamDamage then
|
|
allowTeamDamage = teamDamage.Value
|
|
end
|
|
|
|
local function processExplosion(explosion)
|
|
local BLAST_RADIUS = explosion.BlastRadius
|
|
local BLAST_PRESSURE = explosion.BlastPressure
|
|
|
|
if explosion:FindFirstChild("BLAST_PRESSURE") then
|
|
BLAST_PRESSURE = explosion.BLAST_PRESSURE.Value
|
|
end
|
|
|
|
if BLAST_PRESSURE > 0 then
|
|
local damagedPlayerSet = {}
|
|
local blastCenter = explosion.Position
|
|
|
|
local function onExplosionHit(p, dist)
|
|
if explosion:FindFirstChild("Owner") then
|
|
local player = explosion.Owner.Value
|
|
if player then
|
|
local char = player.Character
|
|
if char and p:IsDescendantOf(char) then
|
|
return
|
|
end
|
|
end
|
|
end
|
|
|
|
local isInCharacter = false
|
|
|
|
if p.Size.Magnitude / 2 < 20 then
|
|
--world->ticklePrimitive(p, true);
|
|
|
|
local doBreakjoints = true
|
|
local hitCharacter = p:FindFirstAncestorWhichIsA("Model")
|
|
local hitHumanoid = hitCharacter:FindFirstChild("Humanoid")
|
|
|
|
if hitCharacter and hitHumanoid then
|
|
-- flag as character
|
|
isInCharacter = true
|
|
|
|
-- don't breakjoints characters
|
|
doBreakjoints = false
|
|
|
|
-- work out what damage to do
|
|
local hitPlayer = game.Players:GetPlayerFromCharacter(hitCharacter)
|
|
local creatorTag = explosion:FindFirstChild("creator")
|
|
local myPlayer
|
|
|
|
if creatorTag then
|
|
myPlayer = creatorTag.Value
|
|
end
|
|
|
|
if hitPlayer and not damagedPlayerSet[hitPlayer] then
|
|
local doDamage = true
|
|
|
|
if not allowTeamDamage then
|
|
if myPlayer and hitPlayer ~= myPlayer then
|
|
if hitPlayer.Team and myPlayer.Team and hitPlayer.Team == myPlayer.Team then
|
|
doDamage = false
|
|
end
|
|
end
|
|
end
|
|
|
|
if doDamage then
|
|
-- flag as damaged
|
|
damagedPlayerSet[hitPlayer] = true
|
|
|
|
-- assume the torso is a massless frictionless unit ball in a perfect vaccum
|
|
dist = math.min(math.max(dist - 0.8, 0), 1)
|
|
|
|
-- damage to do
|
|
local frac = (dist / BLAST_RADIUS)
|
|
|
|
-- do damage. See how much damage to do
|
|
if myPlayer == hitPlayer then
|
|
hitHumanoid:TakeDamage((BLAST_RADIUS * 20) - (frac * 38))
|
|
hitHumanoid:ChangeState("Ragdoll")
|
|
else
|
|
hitHumanoid:TakeDamage(100)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
-- breakjoints stuff
|
|
if doBreakjoints then
|
|
if not hitHumanoid and p:CanSetNetworkOwnership() then
|
|
p:SetNetworkOwner(nil)
|
|
end
|
|
|
|
for _,joint in pairs(p:GetJoints()) do
|
|
if not CollectionService:HasTag(joint, "GorillaGlue") then
|
|
joint:Destroy()
|
|
end
|
|
end
|
|
end
|
|
|
|
--Vector3 delta = (p->getCoordinateFrame().translation - position);
|
|
local delta = (p.Position - blastCenter)
|
|
|
|
--Vector3 normal =
|
|
-- (delta == Vector3::zero())
|
|
-- ? Vector3::unitY()
|
|
-- : delta.direction();
|
|
local normal = (delta == Vector3.new(0, 0, 0))
|
|
and Vector3.new(0, 1, 0)
|
|
or delta.unit
|
|
|
|
--float radius = p->getRadius();
|
|
local radius = p.Size.magnitude / 2
|
|
|
|
--float surfaceArea = radius * radius;
|
|
local surfaceArea = radius * radius
|
|
|
|
--Vector3 impulse = normal * blastPressure * surfaceArea * (1.0f / 4560.0f); // normalizing factor
|
|
local impulse = normal * BLAST_PRESSURE * surfaceArea * (1.0 / 4560.0)
|
|
|
|
-- How much force to apply (for characters, ramp it down towards the edge)
|
|
local frac;
|
|
|
|
if isInCharacter then
|
|
frac = 1 - math.max(0, math.min(1, (dist - 2) / BLAST_RADIUS))
|
|
else
|
|
frac = 1
|
|
end
|
|
|
|
--p->getBody()->accumulateLinearImpulse(impulse, p->getCoordinateFrame().translation);
|
|
local currentVelocity = p.Velocity
|
|
local deltaVelocity = impulse / p:GetMass() -- m * del-v = F * del-t = Impulse
|
|
local forceNeeded = workspace.Gravity * p:GetMass() -- F = ma
|
|
|
|
local bodyV = Instance.new('BodyVelocity')
|
|
bodyV.Velocity = currentVelocity + deltaVelocity
|
|
bodyV.MaxForce = Vector3.new(forceNeeded, forceNeeded, forceNeeded) * 10 * frac
|
|
bodyV.Parent = p
|
|
|
|
Debris:AddItem(bodyV, 0.2 / FORCE_GRANULARITY)
|
|
|
|
--p->getBody()->accumulateRotationalImpulse(impulse * 0.5 * radius); // a somewhat arbitrary, but nice torque
|
|
local rotImpulse = impulse * 0.5 * radius
|
|
local currentRotVelocity = p.RotVelocity
|
|
|
|
local momentOfInertia = (2 * p:GetMass() * radius * radius / 5) -- moment of inertia = 2/5*m*r^2 (assuming roughly spherical)
|
|
local deltaRotVelocity = rotImpulse / momentOfInertia
|
|
local torqueNeeded = 20 * momentOfInertia -- torque = r x F, want about alpha = 20 rad/s^2, alpha * P = torque
|
|
|
|
local rot = Instance.new('BodyAngularVelocity')
|
|
rot.MaxTorque = Vector3.new(torqueNeeded, torqueNeeded, torqueNeeded) * 10 * frac
|
|
rot.AngularVelocity = currentRotVelocity + deltaRotVelocity
|
|
rot.Parent = p
|
|
|
|
Debris:AddItem(rot, 0.2 / FORCE_GRANULARITY)
|
|
end
|
|
end
|
|
|
|
explosion.Hit:Connect(onExplosionHit)
|
|
end
|
|
end
|
|
|
|
local function onDescendantAdded(desc)
|
|
if desc:IsA("Explosion") then
|
|
local pressure = desc.BlastPressure
|
|
|
|
if pressure > 0 then
|
|
local blastPressure = Instance.new("NumberValue")
|
|
blastPressure.Name = "BLAST_PRESSURE"
|
|
blastPressure.Value = pressure
|
|
blastPressure.Parent = desc
|
|
|
|
desc.BlastPressure = 0
|
|
end
|
|
|
|
processExplosion(desc)
|
|
end
|
|
end
|
|
|
|
workspace.DescendantAdded:Connect(onDescendantAdded)</string>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="Script" referent="51">
|
|
<Properties>
|
|
<string name="Name">ForceFields</string>
|
|
<string name="Source">local ffAdorns = Instance.new("Folder")
|
|
ffAdorns.Name = "_ForceFieldAdorns"
|
|
ffAdorns.Parent = workspace
|
|
|
|
local hide = false
|
|
if game.ServerStorage:FindFirstChild("HideForceFields") then
|
|
hide = true
|
|
end
|
|
|
|
local ignoreNames =
|
|
{
|
|
HumanoidRootPart = true;
|
|
DebugAdorn = true;
|
|
NoForceField = true;
|
|
}
|
|
|
|
local function onDescendantAdded(desc)
|
|
if desc:IsA("ForceField") then
|
|
desc.Visible = false
|
|
if hide then return end
|
|
|
|
local adorns = {}
|
|
local char = desc.Parent
|
|
|
|
local function registerAdorn(child)
|
|
if child:IsA("BasePart") and not ignoreNames[child.Name] then
|
|
local adorn = Instance.new("SelectionBox")
|
|
adorn.Transparency = 1
|
|
adorn.Adornee = child
|
|
adorn.Parent = ffAdorns
|
|
table.insert(adorns,adorn)
|
|
end
|
|
end
|
|
|
|
for _,part in pairs(char:GetDescendants()) do
|
|
registerAdorn(part)
|
|
end
|
|
|
|
local regSignal = char.DescendantAdded:Connect(registerAdorn)
|
|
|
|
|
|
while desc:IsDescendantOf(workspace) do
|
|
desc.AncestryChanged:Wait()
|
|
end
|
|
|
|
for _,adorn in pairs(adorns) do
|
|
adorn:Destroy()
|
|
end
|
|
|
|
adorns = nil
|
|
regSignal:Disconnect()
|
|
|
|
end
|
|
end
|
|
|
|
for _,v in pairs(workspace:GetDescendants()) do
|
|
onDescendantAdded(v)
|
|
end
|
|
|
|
workspace.DescendantAdded:Connect(onDescendantAdded)</string>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="Script" referent="52">
|
|
<Properties>
|
|
<string name="Name">HatGranter</string>
|
|
<string name="Source">local ReplicatedStorage = game:GetService("ReplicatedStorage")
|
|
local itemData = ReplicatedStorage:WaitForChild("ItemData")
|
|
local hatData = require(itemData:WaitForChild("Hat"))
|
|
|
|
local ServerStorage = game:GetService("ServerStorage")
|
|
local grantHatToUser = ServerStorage:WaitForChild("GrantHatToUser")
|
|
|
|
local authTable =
|
|
{
|
|
["1073469644"] = { ["96"] = true };
|
|
|
|
["1081616136"] = { ["97"] = true,
|
|
["98"] = true };
|
|
|
|
["2421080323"] = { ["100"] = true };
|
|
|
|
["2471146032"] = { ["101"] = true,
|
|
["102"] = true };
|
|
}
|
|
|
|
local playerDataGet = { Success = false }
|
|
|
|
pcall(function ()
|
|
playerDataGet = require(ServerStorage:WaitForChild("PlayerDataStore"))
|
|
end)
|
|
|
|
if not playerDataGet.Success then
|
|
warn("Failed to load PlayerData. HatGranter will not work.")
|
|
end
|
|
|
|
local playerData = playerDataGet.DataStore
|
|
|
|
local function onGrantHat(player,hatId)
|
|
local userId = player.UserId
|
|
|
|
if userId > 0 then
|
|
local auth = authTable[tostring(game.PlaceId)]
|
|
|
|
if auth then
|
|
local canGiveHat = auth[tostring(hatId)]
|
|
|
|
if canGiveHat and playerData then
|
|
local hatInfo = hatData[hatId]
|
|
local hatAsset = hatInfo.AssetId
|
|
|
|
local myData = playerData:GetSaveData(player)
|
|
local items = myData:Get("Items")
|
|
local loadout = myData:Get("Loadout")
|
|
|
|
local id = tostring(hatAsset)
|
|
|
|
if not items.Hat[id] then
|
|
items.Hat[id] = true
|
|
myData:Set("Items", items)
|
|
end
|
|
|
|
loadout.Hat = hatAsset
|
|
myData:Set("Loadout", loadout)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
grantHatToUser.Event:Connect(onGrantHat)</string>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="Script" referent="53">
|
|
<Properties>
|
|
<string name="Name">Heads</string>
|
|
<string name="Source">local function processObject(obj)
|
|
if obj:IsA("SpecialMesh") and obj.MeshType == Enum.MeshType.Head then
|
|
local head = obj.Parent
|
|
|
|
local col = math.min(head.Size.X,head.Size.Z)
|
|
local thickness = head.Size.Y/col
|
|
|
|
if math.abs(thickness-1) <= 0.01 then
|
|
local face = head:FindFirstChild("face")
|
|
if face and face.Texture:lower() == "rbxasset://textures/face.png" then
|
|
face.Texture = "rbxassetid://1104210678"
|
|
end
|
|
obj.Name = "MeshHead"
|
|
obj.MeshId = "rbxassetid://1104623876"
|
|
obj.Scale = obj.Scale * head.Size.Y
|
|
for _,surface in pairs(Enum.NormalId:GetEnumItems()) do
|
|
head[surface.Name .. "Surface"] = 0
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
for _,desc in pairs(workspace:GetDescendants()) do
|
|
processObject(desc)
|
|
end
|
|
|
|
workspace.DescendantAdded:Connect(processObject)</string>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="Script" referent="54">
|
|
<Properties>
|
|
<string name="Name">InputGateway</string>
|
|
<string name="Source">local self = script.Parent
|
|
local remote = self:WaitForChild("Gateway")
|
|
|
|
local tool = self.Parent
|
|
tool.ManualActivationOnly = true
|
|
|
|
local keyEvent = Instance.new("BindableEvent")
|
|
keyEvent.Name = "KeyEvent"
|
|
keyEvent.Parent = tool
|
|
|
|
local function onGatewayReceive(sendingPlayer, request, ...)
|
|
local char = tool.Parent
|
|
|
|
if char and char:IsA("Model") then
|
|
local humanoid = char:FindFirstChild("Humanoid")
|
|
|
|
if humanoid then
|
|
local player = game.Players:GetPlayerFromCharacter(char)
|
|
assert(sendingPlayer == player)
|
|
|
|
if request == "SetActive" then
|
|
local down, target = ...
|
|
assert(typeof(target) == "CFrame","Expected CFrame")
|
|
|
|
humanoid.TargetPoint = target.p
|
|
|
|
if humanoid.Health > 0 and tool:IsDescendantOf(char) then
|
|
if down then
|
|
tool:Activate()
|
|
else
|
|
tool:Deactivate()
|
|
end
|
|
end
|
|
elseif request == "SetTarget" then
|
|
local target = ...
|
|
assert(typeof(target) == "CFrame","Expected CFrame")
|
|
humanoid.TargetPoint = target.p
|
|
elseif request == "KeyEvent" then
|
|
local key, down = ...
|
|
assert(typeof(key) == "string","bad key cast")
|
|
assert(typeof(down) == "boolean","bad down state cast")
|
|
keyEvent:Fire(key, down)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
remote.OnServerEvent:Connect(onGatewayReceive)</string>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="Script" referent="55">
|
|
<Properties>
|
|
<string name="Name">Leaderboard</string>
|
|
<string name="Source"><![CDATA[print("LinkedLeaderboard script version 5.00 loaded")
|
|
|
|
local ServerStorage = game:GetService("ServerStorage")
|
|
local loadConfig = ServerStorage:FindFirstChild("LoadLeaderboard")
|
|
local hasLoadConfig = (loadConfig ~= nil)
|
|
|
|
if hasLoadConfig and not loadConfig.Value then
|
|
return
|
|
end
|
|
|
|
if not (ServerStorage:FindFirstChild("LoadTools") or (hasLoadConfig and loadConfig.Value)) then -- Infer we aren't in a brickbattle.
|
|
return
|
|
end
|
|
|
|
stands = {}
|
|
CTF_mode = false
|
|
|
|
function onHumanoidDied(humanoid, player)
|
|
local stats = player:findFirstChild("leaderstats")
|
|
if stats ~= nil then
|
|
local deaths = stats:findFirstChild("Wipeouts")
|
|
deaths.Value = deaths.Value + 1
|
|
|
|
-- do short dance to try and find the killer
|
|
|
|
local killer = getKillerOfHumanoidIfStillInGame(humanoid)
|
|
|
|
handleKillCount(humanoid, player)
|
|
end
|
|
end
|
|
|
|
function onPlayerRespawn(property, player)
|
|
-- need to connect to new humanoid
|
|
|
|
if property == "Character" and player.Character ~= nil then
|
|
local humanoid = player.Character.Humanoid
|
|
local deathCon
|
|
local p = player
|
|
local h = humanoid
|
|
deathCon = humanoid.Died:connect(function ()
|
|
deathCon:Disconnect()
|
|
onHumanoidDied(h, p)
|
|
end)
|
|
end
|
|
end
|
|
|
|
function getKillerOfHumanoidIfStillInGame(humanoid)
|
|
-- returns the player object that killed this humanoid
|
|
-- returns nil if the killer is no longer in the game
|
|
|
|
-- check for kill tag on humanoid - may be more than one - todo: deal with this
|
|
local tag = humanoid:findFirstChild("creator")
|
|
|
|
-- find player with name on tag
|
|
if tag ~= nil then
|
|
|
|
local killer = tag.Value
|
|
if killer.Parent ~= nil then -- killer still in game
|
|
return killer
|
|
end
|
|
end
|
|
|
|
return nil
|
|
end
|
|
|
|
function handleKillCount(humanoid, player)
|
|
local killer = getKillerOfHumanoidIfStillInGame(humanoid)
|
|
if killer ~= nil then
|
|
local stats = killer:findFirstChild("leaderstats")
|
|
if stats ~= nil then
|
|
local kills = stats:findFirstChild("KOs")
|
|
if killer ~= player then
|
|
kills.Value = kills.Value + 1
|
|
|
|
else
|
|
kills.Value = kills.Value - 1
|
|
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
-----------------------------------------------
|
|
|
|
|
|
|
|
function findAllFlagStands(root)
|
|
local c = root:children()
|
|
for i=1,#c do
|
|
if (c[i].className == "Model" or c[i].className == "Part") then
|
|
findAllFlagStands(c[i])
|
|
end
|
|
if (c[i].className == "FlagStand") then
|
|
table.insert(stands, c[i])
|
|
end
|
|
end
|
|
end
|
|
|
|
function hookUpListeners()
|
|
for i=1,#stands do
|
|
stands[i].FlagCaptured:connect(onCaptureScored)
|
|
end
|
|
end
|
|
|
|
function onPlayerEntered(newPlayer)
|
|
|
|
if CTF_mode == true then
|
|
|
|
local stats = Instance.new("IntValue")
|
|
stats.Name = "leaderstats"
|
|
|
|
local captures = Instance.new("IntValue")
|
|
captures.Name = "Captures"
|
|
captures.Value = 0
|
|
|
|
|
|
captures.Parent = stats
|
|
|
|
-- VERY UGLY HACK
|
|
-- Will this leak threads?
|
|
-- Is the problem even what I think it is (player arrived before character)?
|
|
while true do
|
|
if newPlayer.Character ~= nil then break end
|
|
wait(5)
|
|
end
|
|
|
|
stats.Parent = newPlayer
|
|
|
|
else
|
|
|
|
local stats = Instance.new("IntValue")
|
|
stats.Name = "leaderstats"
|
|
|
|
local kills = Instance.new("IntValue")
|
|
kills.Name = "KOs"
|
|
kills.Value = 0
|
|
|
|
local deaths = Instance.new("IntValue")
|
|
deaths.Name = "Wipeouts"
|
|
deaths.Value = 0
|
|
|
|
kills.Parent = stats
|
|
deaths.Parent = stats
|
|
|
|
-- VERY UGLY HACK
|
|
-- Will this leak threads?
|
|
-- Is the problem even what I think it is (player arrived before character)?
|
|
while true do
|
|
if newPlayer.Character ~= nil then break end
|
|
wait(0.5)
|
|
end
|
|
|
|
local deathCon
|
|
local humanoid = newPlayer.Character.Humanoid
|
|
|
|
deathCon = humanoid.Died:connect(function()
|
|
deathCon:Disconnect()
|
|
onHumanoidDied(humanoid, newPlayer)
|
|
end )
|
|
|
|
-- start to listen for new humanoid
|
|
newPlayer.Changed:connect(function(property) onPlayerRespawn(property, newPlayer) end )
|
|
|
|
|
|
stats.Parent = newPlayer
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
function onCaptureScored(player)
|
|
|
|
local ls = player:findFirstChild("leaderstats")
|
|
if ls == nil then return end
|
|
local caps = ls:findFirstChild("Captures")
|
|
if caps == nil then return end
|
|
caps.Value = caps.Value + 1
|
|
|
|
end
|
|
|
|
|
|
findAllFlagStands(game.Workspace)
|
|
hookUpListeners()
|
|
if (#stands > 0) then CTF_mode = true end
|
|
|
|
for _,v in pairs(game.Players:GetPlayers()) do
|
|
onPlayerEntered(v)
|
|
end
|
|
|
|
game.Players.ChildAdded:connect(onPlayerEntered)
|
|
|
|
|
|
]]></string>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="Script" referent="56">
|
|
<Properties>
|
|
<string name="Name">LoadTools</string>
|
|
<string name="Source">local ServerStorage = game:GetService("ServerStorage")
|
|
local StarterPack = game:GetService("StarterPack")
|
|
local Players = game:GetService("Players")
|
|
|
|
local standardTools = ServerStorage:WaitForChild("StandardTools")
|
|
local loadTools = ServerStorage:FindFirstChild("LoadTools")
|
|
|
|
if loadTools then
|
|
for toolName in loadTools.Value:gmatch("[^;]+") do
|
|
local tool = standardTools:WaitForChild(toolName)
|
|
tool:Clone().Parent = StarterPack
|
|
|
|
for _,v in pairs(Players:GetPlayers()) do
|
|
if v:FindFirstChild("Backpack") and not v:FindFirstChild(tool.Name) then
|
|
tool:Clone().Parent = v.Backpack
|
|
end
|
|
end
|
|
end
|
|
end</string>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="Script" referent="57">
|
|
<Properties>
|
|
<string name="Name">Part</string>
|
|
<string name="Source"><![CDATA[local CollectionService = game:GetService("CollectionService")
|
|
local ReplicatedStorage = game:GetService("ReplicatedStorage")
|
|
local ServerStorage = game:GetService("ServerStorage")
|
|
local Players = game:GetService("Players")
|
|
|
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
local brickColors = require(ReplicatedStorage:WaitForChild("BrickColors"))
|
|
local oldColors = {}
|
|
|
|
for _,v in ipairs(brickColors) do
|
|
oldColors[v] = true
|
|
end
|
|
|
|
local textureCaches = {}
|
|
local colorCaches = {}
|
|
|
|
local char = string.char
|
|
local floor = math.floor
|
|
local clamp = math.clamp
|
|
|
|
local function serializeColor3(color)
|
|
local r = clamp(floor(color.r * 256), 0, 255)
|
|
local g = clamp(floor(color.g * 256), 0, 255)
|
|
local b = clamp(floor(color.b * 256), 0, 255)
|
|
return r .. g .. b
|
|
end
|
|
|
|
local function computeEpsilon(bc, color)
|
|
local bColor = bc.Color
|
|
|
|
local v0 = Vector3.new(bColor.r, bColor.g, bColor.b)
|
|
local v1 = Vector3.new(color.r, color.g, color.b)
|
|
|
|
return (v1-v0).Magnitude
|
|
end
|
|
|
|
local function toNearestOldBrickColor(color)
|
|
local colorKey = serializeColor3(color)
|
|
|
|
if not colorCaches[colorKey] then
|
|
local bestColor, bestEpsilon = nil, math.huge
|
|
|
|
for bcName in pairs(oldColors) do
|
|
local bc = BrickColor.new(bcName)
|
|
local epsilon = computeEpsilon(bc, color)
|
|
|
|
if epsilon < bestEpsilon then
|
|
bestEpsilon = epsilon
|
|
bestColor = bc
|
|
end
|
|
end
|
|
|
|
colorCaches[colorKey] = bestColor
|
|
end
|
|
|
|
return colorCaches[colorKey]
|
|
end
|
|
|
|
local function onBrickColorUpdated(part)
|
|
part.BrickColor = toNearestOldBrickColor(part.Color)
|
|
end
|
|
|
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
local scale = 1
|
|
|
|
if ServerStorage:FindFirstChild("StudScale") then
|
|
scale = ServerStorage.StudScale.Value
|
|
end
|
|
|
|
local surfaces =
|
|
{
|
|
TopSurface = "Top";
|
|
BottomSurface = "Bottom";
|
|
LeftSurface = "Left";
|
|
RightSurface = "Right";
|
|
FrontSurface = "Front";
|
|
BackSurface = "Back";
|
|
}
|
|
|
|
local textures =
|
|
{
|
|
Studs = 3309082834;
|
|
Inlet = 3307955447;
|
|
Glue = 3308133326;
|
|
Weld = 3308005654;
|
|
}
|
|
|
|
local normalIdToAxis =
|
|
{
|
|
Left = 'X';
|
|
Right = 'X';
|
|
Top = 'Y';
|
|
Bottom = 'Y';
|
|
Front = 'Z';
|
|
Back = 'Z';
|
|
}
|
|
|
|
local function selectUVSize(part, normalId)
|
|
if typeof(normalId) == "EnumItem" then
|
|
normalId = normalId.Name
|
|
end
|
|
|
|
local axis = normalIdToAxis[normalId]
|
|
local size = part.Size
|
|
|
|
if axis == 'X' then
|
|
return size.Z, size.Y
|
|
elseif axis == 'Z' then
|
|
return size.X, size.Y
|
|
elseif axis == 'Y' then
|
|
return size.X, size.Z
|
|
end
|
|
end
|
|
|
|
local function onSurfaceChanged(part, surface)
|
|
local surfaceId = part[surface].Name
|
|
|
|
if surfaceId ~= "SmoothNoOutlines" then
|
|
local normalId = surfaces[surface]
|
|
local textureId = textures[surfaceId]
|
|
|
|
local cache = textureCaches[part]
|
|
local texture = cache[surface]
|
|
|
|
if not textureId then
|
|
if texture then
|
|
texture.Texture = ""
|
|
end
|
|
|
|
return
|
|
end
|
|
|
|
if not (texture and texture:IsA("Texture")) then
|
|
texture = Instance.new("Texture")
|
|
cache[surface] = texture
|
|
|
|
texture.StudsPerTileU = 2;
|
|
texture.StudsPerTileV = 4;
|
|
|
|
texture.Face = normalId
|
|
texture.Name = surface
|
|
|
|
texture.Parent = part
|
|
end
|
|
|
|
-- Select the texture id based on the even/odd dimensions of the UV map.
|
|
local mapId = "AA"
|
|
|
|
if part:IsA("MeshPart") then
|
|
local texU, texV = selectUVSize(part, normalId)
|
|
|
|
local alignU = string.format("%i", (texU % 2) + .5)
|
|
local alignV = string.format("%i", (texV % 2) + .5)
|
|
|
|
if alignU == '1' then
|
|
texture.OffsetStudsU = 0.5
|
|
end
|
|
|
|
if alignV == '1' then
|
|
texture.OffsetStudsV = 0.5
|
|
end
|
|
end
|
|
|
|
texture.Texture = "rbxassetid://" .. textureId
|
|
end
|
|
end
|
|
|
|
local function onTransparencyChanged(part)
|
|
local textureCache = textureCaches[part]
|
|
|
|
for _,texture in pairs(textureCache) do
|
|
texture.Transparency = 0.25 + (part.Transparency * 0.75)
|
|
end
|
|
end
|
|
|
|
local function onParentChanged(part)
|
|
local texureCache = textureCaches[part]
|
|
|
|
if not part:IsDescendantOf(workspace) then
|
|
for _,tex in pairs(texureCache) do
|
|
tex:Destroy()
|
|
end
|
|
|
|
texureCache[part] = nil
|
|
end
|
|
end
|
|
|
|
local function registerPartSurfaces(part)
|
|
local textureCache = {}
|
|
textureCaches[part] = textureCache
|
|
|
|
for surface in pairs(surfaces) do
|
|
onSurfaceChanged(part, surface)
|
|
end
|
|
|
|
onBrickColorUpdated(part)
|
|
onTransparencyChanged(part)
|
|
|
|
part.Material = "SmoothPlastic"
|
|
end
|
|
|
|
local function applyCharacter(humanoid)
|
|
local model = humanoid.Parent
|
|
|
|
if not CollectionService:HasTag(humanoid, "Classified") then
|
|
CollectionService:AddTag(humanoid, "Classified")
|
|
|
|
for _,v in pairs(model:GetDescendants()) do
|
|
if v:IsA("SpecialMesh") and v.MeshType == Enum.MeshType.Brick then
|
|
v:Destroy()
|
|
end
|
|
end
|
|
|
|
for _,v in pairs(script:GetChildren()) do
|
|
if v:IsA("CharacterMesh") then
|
|
local copy = v:Clone()
|
|
copy.Parent = model
|
|
CollectionService:AddTag(copy, "NoCharacterBevels")
|
|
end
|
|
end
|
|
|
|
delay(1, function ()
|
|
if not model:FindFirstChildWhichIsA("Shirt") then
|
|
script.Shirt:Clone().Parent = model
|
|
end
|
|
|
|
if not model:FindFirstChildWhichIsA("Pants") then
|
|
script.Pants:Clone().Parent = model
|
|
end
|
|
end)
|
|
end
|
|
end
|
|
|
|
local function onDescendantAdded(desc)
|
|
if desc:IsA("BasePart") then
|
|
local model = desc:FindFirstAncestorWhichIsA("Model")
|
|
|
|
if model then
|
|
local humanoid = model:FindFirstChildWhichIsA("Humanoid")
|
|
|
|
if humanoid then
|
|
applyCharacter(humanoid)
|
|
return
|
|
end
|
|
|
|
local fileMesh = desc:FindFirstChildWhichIsA("FileMesh")
|
|
|
|
if fileMesh then
|
|
local meshType = fileMesh.MeshType.Name
|
|
if meshType == "Head" or meshType == "FileMesh" then
|
|
desc.Material = "SmoothPlastic"
|
|
return
|
|
end
|
|
end
|
|
|
|
if desc:IsA("VehicleSeat") then
|
|
desc.HeadsUpDisplay = false
|
|
end
|
|
|
|
if not CollectionService:HasTag(desc, "NoBevels") then
|
|
registerPartSurfaces(desc)
|
|
end
|
|
end
|
|
elseif desc:IsA("Decal") and desc.Texture:lower() == "rbxasset://textures/spawnlocation.png" then
|
|
desc.Texture = "rbxassetid://989514407"
|
|
elseif desc:IsA("Humanoid") then
|
|
applyCharacter(desc)
|
|
end
|
|
end
|
|
|
|
local function onItemChanged(object, descriptor)
|
|
if textureCaches[object] then
|
|
if surfaces[descriptor] then
|
|
onSurfaceChanged(object, descriptor)
|
|
elseif descriptor == "Transparency" then
|
|
onTransparencyChanged(object)
|
|
elseif descriptor == "BrickColor" then
|
|
onBrickColorUpdated(object)
|
|
elseif descriptor == "Parent" then
|
|
onParentChanged(object)
|
|
end
|
|
end
|
|
end
|
|
|
|
for _,desc in pairs(workspace:GetDescendants()) do
|
|
onDescendantAdded(desc)
|
|
end
|
|
|
|
workspace.DescendantAdded:Connect(onDescendantAdded)
|
|
game.ItemChanged:Connect(onItemChanged)
|
|
|
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
]]></string>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="Script" referent="58">
|
|
<Properties>
|
|
<string name="Name">Regeneration</string>
|
|
<string name="Source">local CollectionService = game:GetService("CollectionService")
|
|
local ServerStorage = game:GetService("ServerStorage")
|
|
|
|
local regen = ServerStorage:FindFirstChild("Regeneration")
|
|
|
|
if regen then
|
|
local REGEN_TIME = 800
|
|
local REGEN_DELAY = 4
|
|
|
|
if regen:FindFirstChild("RegenTime") then
|
|
REGEN_TIME = regen.RegenTime.Value
|
|
end
|
|
|
|
if regen:FindFirstChild("RegenDelay") then
|
|
REGEN_DELAY = regen.RegenDelay.Value
|
|
end
|
|
|
|
local ready = Instance.new("BoolValue")
|
|
ready.Name = "Ready"
|
|
ready.Parent = regen
|
|
|
|
local bevelCache = ServerStorage:WaitForChild("BevelCache")
|
|
local bevelsReady = bevelCache:WaitForChild("BevelsReady")
|
|
|
|
local function isLodPart(part)
|
|
return part and CollectionService:HasTag(part, "PartLOD")
|
|
end
|
|
|
|
local function setupModelRegen(model, title)
|
|
local title = title or model.Name
|
|
|
|
local parent = model.Parent
|
|
local backup = model:Clone()
|
|
|
|
local message, text
|
|
|
|
if typeof(title) == "string" then
|
|
message = Instance.new("Message")
|
|
text = "Regenerating " .. title .. "..."
|
|
end
|
|
|
|
spawn(function ()
|
|
while not bevelsReady.Value do
|
|
bevelsReady.Changed:Wait()
|
|
end
|
|
|
|
local requestSolve = bevelCache:FindFirstChild("RequestSolve")
|
|
if requestSolve then
|
|
requestSolve:Invoke(backup)
|
|
end
|
|
|
|
while wait(REGEN_TIME * (1 - (math.random() * .8))) do
|
|
local cooldown = 0
|
|
|
|
if message then
|
|
message.Text = text
|
|
message.Parent = workspace
|
|
end
|
|
|
|
model:Destroy()
|
|
wait(REGEN_DELAY)
|
|
|
|
model = backup:Clone()
|
|
model.Parent = parent
|
|
|
|
for _,inst in pairs(model:GetDescendants()) do
|
|
if inst:IsA("BasePart") then
|
|
workspace:JoinToOutsiders({inst}, Enum.JointCreationMode.All)
|
|
end
|
|
end
|
|
|
|
for _,joint in pairs(model:GetDescendants()) do
|
|
if joint:IsA("JointInstance") and joint.Name:sub(-12) == "Strong Joint" then
|
|
if isLodPart(joint.Part0) or isLodPart(joint.Part1) then
|
|
joint:Destroy()
|
|
end
|
|
end
|
|
end
|
|
|
|
if message then
|
|
message.Parent = nil
|
|
end
|
|
end
|
|
end)
|
|
end
|
|
|
|
for _,v in pairs(regen:GetChildren()) do
|
|
if v:IsA("ObjectValue") then
|
|
if v.Name == "" then
|
|
setupModelRegen(v.Value, true)
|
|
else
|
|
setupModelRegen(v.Value, v.Name)
|
|
end
|
|
end
|
|
end
|
|
|
|
ready.Value = true
|
|
end</string>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="Script" referent="59">
|
|
<Properties>
|
|
<string name="Name">SessionTracker</string>
|
|
<string name="Source">local MessagingService = game:GetService("MessagingService")
|
|
local Players = game:GetService("Players")
|
|
|
|
local jobId = game.JobId
|
|
local placeId = game.PlaceId
|
|
|
|
if jobId == "" then
|
|
return
|
|
end
|
|
|
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
local closed = false
|
|
|
|
local function publishUpdate()
|
|
local playerCount = #Players:GetPlayers()
|
|
|
|
local serverInfo =
|
|
{
|
|
JobId = jobId;
|
|
PlaceId = placeId;
|
|
Players = playerCount;
|
|
}
|
|
|
|
if closed then
|
|
serverInfo.Closed = true;
|
|
end
|
|
|
|
pcall(function ()
|
|
MessagingService:PublishAsync("ServerData", serverInfo)
|
|
end)
|
|
end
|
|
|
|
local function onGameClosing()
|
|
closed = true
|
|
publishUpdate()
|
|
end
|
|
|
|
game:BindToClose(onGameClosing)
|
|
|
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
while #Players:GetPlayers() < 1 do
|
|
wait(1)
|
|
end
|
|
|
|
while not closed do
|
|
publishUpdate()
|
|
wait(5)
|
|
end
|
|
|
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------</string>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="Script" referent="60">
|
|
<Properties>
|
|
<string name="Name">Time</string>
|
|
<string name="Source"><![CDATA[local Lighting = game:GetService("Lighting")
|
|
local ServerStorage = game:GetService("ServerStorage")
|
|
local loadTime = ServerStorage:FindFirstChild("LoadTime")
|
|
|
|
if loadTime and loadTime.Value then
|
|
while wait() do
|
|
Lighting:SetMinutesAfterMidnight((tick()*5)%1440)
|
|
end
|
|
end
|
|
|
|
]]></string>
|
|
</Properties>
|
|
</Item>
|
|
</Item>
|
|
<Item class="Folder" referent="61">
|
|
<Properties>
|
|
<string name="Name">StarterCharacterScripts</string>
|
|
</Properties>
|
|
<Item class="Script" referent="62">
|
|
<Properties>
|
|
<string name="Name">Animate</string>
|
|
<string name="Source">local Players = game:GetService("Players")
|
|
|
|
local character = script.Parent
|
|
local player = Players:GetPlayerFromCharacter(character)
|
|
|
|
local climbing = Instance.new("BoolValue")
|
|
climbing.Name = "Climbing"
|
|
climbing.Parent = character
|
|
|
|
local setValue = Instance.new("RemoteEvent")
|
|
setValue.Name = "SetValue"
|
|
setValue.Parent = climbing
|
|
|
|
local function onSetValue(requester, value)
|
|
if requester ~= player then
|
|
return
|
|
end
|
|
|
|
if typeof(value) ~= "boolean" then
|
|
return
|
|
end
|
|
|
|
climbing.Value = value
|
|
end
|
|
|
|
setValue.OnServerEvent:Connect(onSetValue)</string>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="Script" referent="63">
|
|
<Properties>
|
|
<string name="Name">Bounciness</string>
|
|
<string name="Source">local Debris = game:GetService("Debris")
|
|
|
|
local char = script.Parent
|
|
local humanoid = char:WaitForChild("Humanoid")
|
|
local head = char:WaitForChild("Head")
|
|
|
|
local function onStateChanged(old,new)
|
|
if new.Name == "Landed" then
|
|
local velocity = humanoid.Torso.Velocity
|
|
local power = (-velocity.Y * workspace.Gravity) / 2
|
|
|
|
local force = Instance.new("BodyForce")
|
|
force.Name = "Bounce"
|
|
force.Force = Vector3.new(0,power,0)
|
|
force.Parent = head
|
|
|
|
Debris:AddItem(force, 1/30)
|
|
end
|
|
end
|
|
|
|
humanoid.StateChanged:connect(onStateChanged)</string>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="Script" referent="64">
|
|
<Properties>
|
|
<string name="Name">DropHats</string>
|
|
<string name="Source">local Players = game:GetService("Players")
|
|
|
|
local char = script.Parent
|
|
local torso = char:WaitForChild("HumanoidRootPart")
|
|
|
|
local humanoid = char:WaitForChild("Humanoid")
|
|
local hatPickup = script:WaitForChild("HatPickup")
|
|
|
|
local dropHat = Instance.new("RemoteEvent")
|
|
dropHat.Name = "DropHat"
|
|
dropHat.Parent = script
|
|
|
|
local function onDropHat(player)
|
|
local myPlayer = Players:GetPlayerFromCharacter(char)
|
|
assert(player == myPlayer, "Cannot drop hats unless it is your character.")
|
|
|
|
local dropPos = torso.CFrame * CFrame.new(0, 5.4, -8)
|
|
|
|
for _,hat in pairs(humanoid:GetAccessories()) do
|
|
local handle = hat:FindFirstChild("Handle")
|
|
|
|
if handle then
|
|
local newHandle = handle:Clone()
|
|
|
|
for _,joint in pairs(newHandle:GetJoints()) do
|
|
joint:Destroy()
|
|
end
|
|
|
|
newHandle.CFrame = dropPos
|
|
newHandle.Anchored = true
|
|
newHandle.CanCollide = false
|
|
newHandle.Parent = workspace
|
|
|
|
handle:Destroy()
|
|
hat.Parent = newHandle
|
|
|
|
wait(.1)
|
|
|
|
newHandle.Anchored = false
|
|
newHandle.CanCollide = true
|
|
newHandle:SetNetworkOwner(nil)
|
|
|
|
local pickup = hatPickup:Clone()
|
|
pickup.Parent = newHandle
|
|
pickup.Disabled = false
|
|
end
|
|
end
|
|
end
|
|
|
|
dropHat.OnServerEvent:Connect(onDropHat)</string>
|
|
</Properties>
|
|
<Item class="Script" referent="65">
|
|
<Properties>
|
|
<string name="Name">HatPickup</string>
|
|
<string name="Source"><![CDATA[local handle = script.Parent
|
|
local hat = handle:FindFirstChildWhichIsA("Accoutrement")
|
|
local equipSignal
|
|
|
|
local function onTouched(hit)
|
|
local char = hit:FindFirstAncestorWhichIsA("Model")
|
|
|
|
if char then
|
|
local hitHum = char:FindFirstChild("Humanoid")
|
|
|
|
if hitHum then
|
|
local existingHat = char:FindFirstChildWhichIsA("Accoutrement")
|
|
|
|
if existingHat == nil or existingHat == hat then
|
|
if equipSignal then
|
|
equipSignal:Disconnect()
|
|
equipSignal = nil
|
|
end
|
|
|
|
hat.Parent = workspace
|
|
handle.Parent = hat
|
|
|
|
handle:SetNetworkOwnershipAuto()
|
|
hitHum:AddAccessory(hat)
|
|
|
|
script:Destroy()
|
|
else
|
|
hat.Parent = workspace
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
equipSignal = handle.Touched:Connect(onTouched) ]]></string>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="LocalScript" referent="66">
|
|
<Properties>
|
|
<string name="Name">LocalDropHat</string>
|
|
<string name="Source">local UserInputService = game:GetService("UserInputService")
|
|
|
|
local server = script.Parent
|
|
local dropHat = server:WaitForChild("DropHat")
|
|
|
|
local function onInputBegan(input, gameProcessed)
|
|
if not gameProcessed then
|
|
local keyCode = input.KeyCode.Name
|
|
if keyCode == "Equals" or keyCode == "DPadDown" then
|
|
dropHat:FireServer()
|
|
end
|
|
end
|
|
end
|
|
|
|
UserInputService.InputBegan:Connect(onInputBegan)</string>
|
|
</Properties>
|
|
</Item>
|
|
</Item>
|
|
<Item class="LocalScript" referent="67">
|
|
<Properties>
|
|
<string name="Name">EdgeWalking</string>
|
|
<string name="Source">local RunService = game:GetService("RunService")
|
|
|
|
local char = script.Parent
|
|
local rootPart = char:WaitForChild("HumanoidRootPart")
|
|
|
|
local platform = Instance.new("Part")
|
|
platform.Name = "NoForceField"
|
|
platform.TopSurface = 0
|
|
platform.BottomSurface = 0
|
|
platform.BrickColor = BrickColor.new("Bright orange")
|
|
platform.Size = Vector3.new(5, 1, 2)
|
|
platform.Anchored = true
|
|
platform.Transparency = 1
|
|
|
|
local down = Vector3.new(0, -100, 0)
|
|
local platformOffset = Vector3.new(0, -.5, 0)
|
|
|
|
while wait() do
|
|
local start = rootPart.CFrame
|
|
local startPos = start.p
|
|
local startRay = Ray.new(startPos, start.lookVector * 5)
|
|
|
|
local hit, pos, norm = workspace:FindPartOnRay(startRay, char)
|
|
local floorCheckRay
|
|
|
|
local pass = false
|
|
|
|
if hit and hit.CanCollide and hit:IsGrounded() then
|
|
if hit:IsA("UnionOperation") or (not hit:IsA("Part") or hit.Shape.Name == "Block") then
|
|
local floorCheckRay = Ray.new(pos - (norm / 5), down)
|
|
local floor, floorPos = workspace:FindPartOnRayWithIgnoreList(floorCheckRay, {char, hit})
|
|
|
|
if floor and floor.CanCollide and startPos.Y - 2 > floorPos.Y then
|
|
floorPos = floorPos + platformOffset
|
|
platform.Parent = char
|
|
platform.CFrame = CFrame.new(Vector3.new(pos.X + norm.X, floorPos.Y, pos.Z + norm.Z),floorPos)
|
|
pass = true
|
|
end
|
|
end
|
|
end
|
|
|
|
if not pass then
|
|
platform.Parent = nil
|
|
end
|
|
end</string>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="LocalScript" referent="68">
|
|
<Properties>
|
|
<string name="Name">FloorDrag</string>
|
|
<string name="Source">local RunService = game:GetService("RunService")
|
|
|
|
local char = script.Parent
|
|
local humanoid = char:WaitForChild("Humanoid")
|
|
local rootPart = char:WaitForChild("HumanoidRootPart")
|
|
local climbForce = rootPart:WaitForChild("ClimbForce")
|
|
local rayDown = Vector3.new(0, -5000, 0)
|
|
|
|
local function moveTowards(value, goal, rate)
|
|
if value < goal then
|
|
return math.min(goal, value + rate)
|
|
elseif value > goal then
|
|
return math.max(goal, value - rate)
|
|
else
|
|
return goal
|
|
end
|
|
end
|
|
|
|
local lastFloorLevel = 0
|
|
|
|
local function getFloorLevel()
|
|
local origin = rootPart.Position
|
|
local ray = Ray.new(origin, rayDown)
|
|
local hit, pos = workspace:FindPartOnRay(ray, char)
|
|
return pos.Y, math.clamp(math.abs(pos.Y - origin.Y), -1, 1)
|
|
end
|
|
|
|
local lastLevel = getFloorLevel()
|
|
local updateCon
|
|
|
|
local function update()
|
|
if humanoid.Health == 0 then
|
|
updateCon:Disconnect()
|
|
return
|
|
end
|
|
|
|
local level, dist = getFloorLevel()
|
|
|
|
if humanoid.SeatPart then
|
|
humanoid.HipHeight = 0
|
|
lastLevel = level
|
|
return
|
|
end
|
|
|
|
local yVel = rootPart.Velocity.Y
|
|
|
|
if math.abs(yVel) > 8 then
|
|
local goal = math.sign(yVel)
|
|
humanoid.HipHeight = moveTowards(humanoid.HipHeight, goal, 0.1)
|
|
elseif lastLevel ~= level then
|
|
humanoid.HipHeight = math.sign(lastLevel - level) * math.clamp(dist - 3, 0, 1)
|
|
lastLevel = level
|
|
else
|
|
humanoid.HipHeight = humanoid.HipHeight * 0.925
|
|
end
|
|
end
|
|
|
|
updateCon = RunService.RenderStepped:Connect(update)</string>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="Script" referent="69">
|
|
<Properties>
|
|
<string name="Name">GoofyBalance</string>
|
|
<string name="Source">local char = script.Parent
|
|
local humanoid = char:WaitForChild("Humanoid")
|
|
|
|
local function onStateChanged(old,new)
|
|
if new == Enum.HumanoidStateType.RunningNoPhysics then
|
|
humanoid:ChangeState(Enum.HumanoidStateType.Running)
|
|
elseif new == Enum.HumanoidStateType.FallingDown then
|
|
humanoid:ChangeState("Ragdoll")
|
|
|
|
while wait(0.5) do
|
|
if humanoid.RootPart then
|
|
local velocity = humanoid.RootPart.Velocity
|
|
|
|
if velocity.Magnitude < 0.1 then
|
|
wait(2)
|
|
humanoid:ChangeState("GettingUp")
|
|
break
|
|
end
|
|
else
|
|
break
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
humanoid.StateChanged:Connect(onStateChanged)</string>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="LocalScript" referent="70">
|
|
<Properties>
|
|
<string name="Name">GoofyMotion</string>
|
|
<string name="Source">local RunService = game:GetService("RunService")
|
|
local GameSettings = UserSettings():GetService("UserGameSettings")
|
|
|
|
local char = script.Parent
|
|
local humanoid = char:WaitForChild("Humanoid")
|
|
local climbing = char:WaitForChild("Climbing")
|
|
local rootPart = humanoid.RootPart
|
|
|
|
local c = workspace.CurrentCamera
|
|
local blankV3 = Vector3.new()
|
|
local xz = Vector3.new(1,0,1)
|
|
local bg = rootPart:FindFirstChild("FirstPersonGyro")
|
|
|
|
local runState = Enum.HumanoidStateType.Running
|
|
|
|
if not bg then
|
|
bg = Instance.new("BodyGyro")
|
|
bg.Name = "FirstPersonGyro"
|
|
bg.MaxTorque = Vector3.new(0,10e6,0)
|
|
bg.D = 100
|
|
end
|
|
|
|
local function toRotation(dir)
|
|
return CFrame.new(blankV3,dir)
|
|
end
|
|
|
|
local velocityThreshold = 200
|
|
spawn(function ()
|
|
local threshold = char:WaitForChild("VelocityThreshold",5)
|
|
if threshold then
|
|
velocityThreshold = threshold.Value
|
|
end
|
|
end)
|
|
|
|
local function update()
|
|
local rotationType = GameSettings.RotationType
|
|
local seatPart = humanoid.SeatPart
|
|
|
|
if rotationType.Name == "CameraRelative" and not seatPart then
|
|
local dir = c.CFrame.lookVector * xz
|
|
bg.CFrame = toRotation(dir)
|
|
bg.Parent = rootPart
|
|
humanoid.AutoRotate = false
|
|
else
|
|
local state = humanoid:GetState()
|
|
local isRunning = (state == runState)
|
|
local isClimbing = climbing.Value
|
|
humanoid.AutoRotate = (isRunning or isClimbing)
|
|
bg.Parent = nil
|
|
end
|
|
|
|
if rootPart.Velocity.Magnitude > velocityThreshold and not seatPart then
|
|
humanoid:ChangeState("FallingDown")
|
|
end
|
|
end
|
|
|
|
humanoid.AutoRotate = false
|
|
humanoid:SetStateEnabled("Climbing",false)
|
|
RunService.RenderStepped:connect(update)
|
|
c.FieldOfView = 65</string>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="Script" referent="71">
|
|
<Properties>
|
|
<string name="Name">InputGateway</string>
|
|
<string name="Source">local ServerStorage = game:GetService("ServerStorage")
|
|
local inputGateway = ServerStorage:WaitForChild("InputGateway")
|
|
local char = script.Parent
|
|
|
|
local function onChildAdded(child)
|
|
if child:IsA("Tool") and not child:FindFirstChild("InputGateway") then
|
|
wait(.1)
|
|
local gateway = inputGateway:Clone()
|
|
gateway.Parent = child
|
|
end
|
|
end
|
|
|
|
local tool = char:FindFirstChildWhichIsA("Tool")
|
|
if tool then
|
|
onChildAdded(tool)
|
|
end
|
|
|
|
char.ChildAdded:Connect(onChildAdded)</string>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="LocalScript" referent="72">
|
|
<Properties>
|
|
<string name="Name">JumpLimiter</string>
|
|
<string name="Source"><![CDATA[local char = script.Parent
|
|
local humanoid = char:WaitForChild("Humanoid")
|
|
|
|
local function onStateChanged(old,new)
|
|
if old == Enum.HumanoidStateType.Freefall and new == Enum.HumanoidStateType.Landed then
|
|
humanoid:SetStateEnabled("Jumping",false)
|
|
wait(0.5)
|
|
humanoid:SetStateEnabled("Jumping",true)
|
|
end
|
|
end
|
|
|
|
humanoid.StateChanged:Connect(onStateChanged)
|
|
]]></string>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="LocalScript" referent="73">
|
|
<Properties>
|
|
<string name="Name">RetroClimbing</string>
|
|
<string name="Source">--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
-- Setup
|
|
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
local char = script.Parent
|
|
|
|
local humanoid = char:WaitForChild("Humanoid")
|
|
humanoid:SetStateEnabled("Climbing", false)
|
|
|
|
local rootPart = humanoid.RootPart
|
|
local bv = rootPart:FindFirstChild("ClimbForce")
|
|
|
|
if not bv then
|
|
bv = Instance.new("BodyVelocity")
|
|
bv.Name = "ClimbForce"
|
|
bv.Parent = humanoid.RootPart
|
|
end
|
|
|
|
bv.MaxForce = Vector3.new()
|
|
|
|
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
-- Climbing State
|
|
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
local climbing = char:WaitForChild("Climbing")
|
|
local setValue = climbing:WaitForChild("SetValue")
|
|
|
|
local function onClimbing(value)
|
|
setValue:FireServer(value)
|
|
end
|
|
|
|
climbing.Changed:Connect(onClimbing)
|
|
|
|
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
-- Debug Visuals
|
|
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
local Debris = game:GetService("Debris")
|
|
local isDevTest = false
|
|
|
|
local DEBUG_COLOR_RED = Color3.new(1, 0, 0)
|
|
local DEBUG_COLOR_YLW = Color3.new(1, 1, 0)
|
|
local DEBUG_COLOR_GRN = Color3.new(0, 1, 0)
|
|
|
|
local debugBox = Instance.new("BoxHandleAdornment")
|
|
debugBox.Adornee = workspace.Terrain
|
|
debugBox.Color3 = DEBUG_COLOR_RED
|
|
debugBox.Visible = false
|
|
debugBox.Parent = script
|
|
|
|
local debugCylinder = Instance.new("CylinderHandleAdornment")
|
|
debugCylinder.Color = BrickColor.new("Bright violet")
|
|
debugCylinder.Adornee = workspace.Terrain
|
|
debugCylinder.Height = 0.2
|
|
debugCylinder.Radius = 1.0
|
|
debugCylinder.Visible = false
|
|
debugCylinder.Parent = script
|
|
|
|
local debugSBox = Instance.new("SelectionBox")
|
|
debugSBox.Color3 = DEBUG_COLOR_RED
|
|
debugSBox.Parent = script
|
|
|
|
local function drawRayIfDebugging(rayStart, look, length, color)
|
|
if isDevTest then
|
|
local line = Instance.new("LineHandleAdornment")
|
|
line.CFrame = CFrame.new(rayStart, rayStart + (look.Unit * length))
|
|
line.Adornee = workspace.Terrain
|
|
line.Length = length
|
|
line.Color3 = color
|
|
line.Thickness = 4
|
|
line.Parent = script
|
|
|
|
local cone = Instance.new("ConeHandleAdornment")
|
|
cone.CFrame = CFrame.new(rayStart + (look.Unit * (length - 0.32)), rayStart + (look.Unit * length))
|
|
cone.Adornee = workspace.Terrain
|
|
cone.Color3 = color
|
|
cone.Radius = 1 / 10
|
|
cone.Height = 1 / 3
|
|
cone.Parent = script
|
|
|
|
Debris:AddItem(line, .5)
|
|
Debris:AddItem(cone, .5)
|
|
end
|
|
end
|
|
|
|
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
-- Main Climbing Logic
|
|
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
local searchDepth = 0.7
|
|
local maxClimbDist = 2.45
|
|
local sampleSpacing = 1 / 7
|
|
local lowLadderSearch = 2.7
|
|
local stepForwardFrames = 0
|
|
local ladderSearchDist = 2.0
|
|
|
|
local running = Enum.HumanoidStateType.Running
|
|
local freefall = Enum.HumanoidStateType.Freefall
|
|
|
|
local function findPartInLadderZone()
|
|
debug.profilebegin("FastClimbCheck")
|
|
--
|
|
|
|
local cf = rootPart.CFrame
|
|
|
|
local top = -humanoid.HipHeight
|
|
local bottom = -lowLadderSearch + top
|
|
local radius = 0.5 * ladderSearchDist
|
|
|
|
local center = cf.Position + (cf.LookVector * ladderSearchDist * 0.5)
|
|
local min = Vector3.new(-radius, bottom, -radius)
|
|
local max = Vector3.new(radius, top, radius)
|
|
|
|
local extents = Region3.new(center + min, center + max)
|
|
local parts = workspace:FindPartsInRegion3(extents, char)
|
|
|
|
if isDevTest then
|
|
if #parts > 0 then
|
|
debugBox.Visible = false
|
|
debugSBox.Visible = true
|
|
debugSBox.Adornee = parts[1]
|
|
else
|
|
debugBox.Visible = true
|
|
debugSBox.Visible = false
|
|
|
|
debugBox.Size = extents.Size
|
|
debugBox.CFrame = extents.CFrame
|
|
|
|
debugCylinder.Visible = false
|
|
end
|
|
end
|
|
|
|
--
|
|
debug.profileend()
|
|
return #parts > 0
|
|
end
|
|
|
|
local function findLadder()
|
|
if not findPartInLadderZone() then
|
|
return false
|
|
end
|
|
|
|
debug.profilebegin("ExpensiveClimbCheck")
|
|
|
|
local torsoCoord = rootPart.CFrame
|
|
local torsoLook = torsoCoord.LookVector
|
|
|
|
local firstSpace = 0
|
|
local firstStep = 0
|
|
|
|
local lookForSpace = true
|
|
local lookForStep = false
|
|
|
|
local debugColor = DEBUG_COLOR_YLW
|
|
local topRay = math.floor(lowLadderSearch / sampleSpacing)
|
|
|
|
for i = 1, topRay do
|
|
local distFromBottom = i * sampleSpacing
|
|
local originOnTorso = Vector3.new(0, -lowLadderSearch + distFromBottom, 0)
|
|
|
|
local casterOrigin = torsoCoord.Position + originOnTorso
|
|
local casterDirection = torsoLook * ladderSearchDist
|
|
|
|
local ray = Ray.new(casterOrigin, casterDirection)
|
|
local hitPrim, hitLoc = workspace:FindPartOnRay(ray, char)
|
|
|
|
-- make trusses climbable.
|
|
if hitPrim and hitPrim:IsA("TrussPart") then
|
|
return true
|
|
end
|
|
|
|
local mag = (hitLoc - casterOrigin).Magnitude
|
|
|
|
if mag < searchDepth then
|
|
if lookForSpace then
|
|
debugColor = DEBUG_COLOR_GRN
|
|
firstSpace = distFromBottom
|
|
|
|
lookForSpace = false
|
|
lookForStep = true
|
|
end
|
|
elseif lookForStep then
|
|
firstStep = distFromBottom - firstSpace
|
|
debugColor = DEBUG_COLOR_RED
|
|
lookForStep = false
|
|
end
|
|
|
|
drawRayIfDebugging(casterOrigin, casterDirection, mag, debugColor)
|
|
end
|
|
|
|
local found = (firstSpace < maxClimbDist and firstStep > 0 and firstStep < maxClimbDist)
|
|
debugCylinder.Visible = isDevTest and found
|
|
|
|
if debugCylinder.Visible then
|
|
local y = Vector3.FromAxis('Y')
|
|
local pos = torsoCoord.Position + Vector3.new(0, 5, 0)
|
|
debugCylinder.CFrame = CFrame.new(pos, pos + y)
|
|
end
|
|
|
|
debug.profileend()
|
|
return found
|
|
end
|
|
|
|
while wait() do
|
|
local canClimb = false
|
|
|
|
local state = humanoid:GetState()
|
|
local speed = humanoid.WalkSpeed
|
|
|
|
if state == freefall or state == running then
|
|
canClimb = findLadder()
|
|
end
|
|
|
|
if canClimb then
|
|
local climbSpeed = speed * 0.7
|
|
bv.Velocity = Vector3.new(0, climbSpeed, 0)
|
|
bv.MaxForce = Vector3.new(climbSpeed * 100, 10e6, climbSpeed * 100)
|
|
else
|
|
if climbing.Value then
|
|
stepForwardFrames = 2
|
|
end
|
|
|
|
bv.MaxForce = Vector3.new()
|
|
end
|
|
|
|
if stepForwardFrames > 0 then
|
|
local cf = rootPart.CFrame
|
|
humanoid:Move(cf.LookVector)
|
|
stepForwardFrames = stepForwardFrames - 1
|
|
end
|
|
|
|
climbing.Value = canClimb
|
|
end
|
|
|
|
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------</string>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="Script" referent="74">
|
|
<Properties>
|
|
<string name="Name">Sound</string>
|
|
<string name="Source"><![CDATA[-- util
|
|
|
|
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
|
|
|
|
function newSound(id)
|
|
local sound = Instance.new("Sound")
|
|
sound.SoundId = id
|
|
sound.archivable = false
|
|
sound.Parent = script.Parent.Head
|
|
return sound
|
|
end
|
|
|
|
-- declarations
|
|
|
|
local sDied = newSound("rbxasset://sounds/uuhhh.wav")
|
|
local sFallingDown = newSound("rbxasset://sounds/splat.wav")
|
|
local sFreeFalling = newSound("rbxasset://sounds/swoosh.wav")
|
|
local sGettingUp = newSound("rbxasset://sounds/hit.wav")
|
|
local sJumping = newSound("rbxasset://sounds/button.wav")
|
|
local sRunning = newSound("rbxasset://sounds/bfsl-minifigfoots1.mp3")
|
|
sRunning.Looped = true
|
|
|
|
local Figure = script.Parent
|
|
local Head = waitForChild(Figure, "Head")
|
|
local Humanoid = waitForChild(Figure, "Humanoid")
|
|
--local Climbing = Figure:WaitForChild("Climbing")
|
|
|
|
-- functions
|
|
|
|
function onDied()
|
|
sDied:Play()
|
|
end
|
|
|
|
function onJumping()
|
|
sJumping:Play()
|
|
wait(0.2)
|
|
sJumping:Stop()
|
|
end
|
|
|
|
function onState(state, sound)
|
|
sound.TimePosition = 0
|
|
sound.Playing = state
|
|
end
|
|
|
|
function onRunning(speed)
|
|
sRunning.Playing = (speed>0.1)
|
|
end
|
|
|
|
-- connect up
|
|
|
|
Humanoid.Died:connect(onDied)
|
|
Humanoid.Running:connect(onRunning)
|
|
Humanoid.Jumping:connect(onJumping)
|
|
Humanoid.GettingUp:connect(function(state) onState(state, sGettingUp) end)
|
|
Humanoid.FreeFalling:connect(function(state)
|
|
--if not Climbing.Value then
|
|
onState(state, sFreeFalling)
|
|
--end
|
|
end)
|
|
|
|
Humanoid.FallingDown:connect(function(state) onState(state, sFallingDown) end)
|
|
]]></string>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="Script" referent="75">
|
|
<Properties>
|
|
<string name="Name">TeamColors</string>
|
|
<string name="Source">local CollectionService = game:GetService("CollectionService")
|
|
local Players = game:GetService("Players")
|
|
|
|
local char = script.Parent
|
|
local player = Players:GetPlayerFromCharacter(char)
|
|
local teamListener = player:GetPropertyChangedSignal("TeamColor")
|
|
local bodyColors = char:WaitForChild("BodyColors")
|
|
|
|
local teamColors = Instance.new("BodyColors")
|
|
teamColors.Name = "TeamColors"
|
|
teamColors.HeadColor = BrickColor.new("Bright yellow")
|
|
teamColors.LeftArmColor = BrickColor.Black()
|
|
teamColors.LeftLegColor = BrickColor.Black()
|
|
teamColors.RightArmColor = BrickColor.Black()
|
|
teamColors.RightLegColor = BrickColor.Black()
|
|
|
|
CollectionService:AddTag(teamColors, "RespectCharacterAsset")
|
|
|
|
local function onTeamChanged()
|
|
local team = player.Team
|
|
if team then
|
|
teamColors.TorsoColor = player.TeamColor
|
|
bodyColors.Parent = nil
|
|
|
|
if not CollectionService:HasTag(team, "NoAutoColor") then
|
|
teamColors.Parent = char
|
|
end
|
|
else
|
|
teamColors.Parent = nil
|
|
bodyColors.Parent = char
|
|
end
|
|
end
|
|
|
|
onTeamChanged()
|
|
teamListener:Connect(onTeamChanged)</string>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="Script" referent="76">
|
|
<Properties>
|
|
<string name="Name">ToolSoundGlitch</string>
|
|
<string name="Source">-- This replicates an old sound bug that used to occur with tools back then.
|
|
|
|
local CollectionService = game:GetService("CollectionService")
|
|
local Debris = game:GetService("Debris")
|
|
|
|
local char = script.Parent
|
|
local torso = char:WaitForChild("Torso")
|
|
local marked = {}
|
|
|
|
local function processHandle(handle)
|
|
for _,child in pairs(handle:GetChildren()) do
|
|
if child:IsA("Sound") then
|
|
if not marked[child.SoundId] then
|
|
marked[child.SoundId] = true
|
|
else
|
|
local replica = child:Clone()
|
|
replica.Name = "ToolSoundGlitch"
|
|
replica.MaxDistance = 0
|
|
replica.Parent = torso
|
|
|
|
CollectionService:AddTag(replica, "ToolSoundGlitch")
|
|
replica:Play()
|
|
|
|
replica.Ended:connect(function ()
|
|
Debris:AddItem(replica, 1)
|
|
end)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
local function onChild(child)
|
|
if child:IsA("Tool") then
|
|
local handle = child:FindFirstChild("Handle")
|
|
|
|
if handle then
|
|
processHandle(handle)
|
|
end
|
|
end
|
|
end
|
|
|
|
char.ChildAdded:connect(onChild)
|
|
char.ChildRemoved:connect(onChild)</string>
|
|
</Properties>
|
|
</Item>
|
|
</Item>
|
|
<Item class="Folder" referent="77">
|
|
<Properties>
|
|
<string name="Name">StarterGui</string>
|
|
</Properties>
|
|
<Item class="ScreenGui" referent="78">
|
|
<Properties>
|
|
<string name="Name">UI</string>
|
|
</Properties>
|
|
<Item class="LocalScript" referent="79">
|
|
<Properties>
|
|
<string name="Name">Backpack</string>
|
|
<string name="Source">-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
-- @CloneTrooper1019, 2015
|
|
-- Backpack
|
|
-- Simulates the 2008 backpack from scratch.
|
|
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
-- Setup
|
|
|
|
local ui = script.Parent
|
|
local rootFrame = ui:WaitForChild("RootFrame")
|
|
|
|
local self = rootFrame:WaitForChild("Backpack")
|
|
local slotTemp = script:WaitForChild("SlotTemp")
|
|
|
|
local backdrop = self:WaitForChild("Backdrop")
|
|
local slotsBin = self:WaitForChild("Slots")
|
|
|
|
local player = game.Players.LocalPlayer
|
|
local UserInputService = game:GetService("UserInputService")
|
|
|
|
local toolIndex = 0
|
|
|
|
local tools = {}
|
|
local slots = {}
|
|
local tokens =
|
|
{
|
|
One = 1;
|
|
Two = 2;
|
|
Three = 3;
|
|
Four = 4;
|
|
Five = 5;
|
|
Six = 6;
|
|
Seven = 7;
|
|
Eight = 8;
|
|
Nine = 9;
|
|
Zero = 10; -- shhh not a hack
|
|
}
|
|
|
|
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
-- Key Hookup
|
|
|
|
local eNumPress = Instance.new("BindableEvent")
|
|
local numPress = eNumPress.Event
|
|
|
|
-- Hack to work around the inputs being overridden while the Plane tool is active.
|
|
local function allowGameProcessedBypassHack()
|
|
local lastInputType = UserInputService:GetLastInputType()
|
|
if lastInputType.Name == "Gamepad1" then
|
|
local char = player.Character
|
|
if char then
|
|
local tool = char:FindFirstChildWhichIsA("Tool")
|
|
if tool and not tool.Enabled then
|
|
return true
|
|
end
|
|
end
|
|
end
|
|
return false
|
|
end
|
|
|
|
local function onInputBegan(input,gameProcessed)
|
|
if not gameProcessed or allowGameProcessedBypassHack() then
|
|
local name = input.UserInputType.Name
|
|
local keyCode = input.KeyCode.Name
|
|
if name == "Keyboard" then
|
|
local toIndex = tokens[keyCode]
|
|
if toIndex then
|
|
eNumPress:Fire(toIndex)
|
|
end
|
|
elseif name == "Gamepad1" then
|
|
if keyCode == "ButtonL1" or keyCode == "ButtonR1" then
|
|
local nextIndex = toolIndex
|
|
if keyCode == "ButtonL1" then
|
|
nextIndex = nextIndex - 1
|
|
elseif keyCode == "ButtonR1" then
|
|
nextIndex = nextIndex + 1
|
|
end
|
|
print(nextIndex,#tools)
|
|
if nextIndex > 0 and nextIndex <= #tools then
|
|
eNumPress:Fire(nextIndex)
|
|
else
|
|
eNumPress:Fire(toolIndex)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
UserInputService.InputBegan:connect(onInputBegan)
|
|
|
|
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
local function resortSlots()
|
|
for index,tool in ipairs(tools) do
|
|
local slot = slots[tool]
|
|
slot.Index.Text = index
|
|
slot.LayoutOrder = index
|
|
slot.Visible = true
|
|
end
|
|
backdrop.Size = UDim2.new(#tools,0,1,0)
|
|
end
|
|
|
|
local function createSlot(tool)
|
|
if not slots[tool] then
|
|
local index = #tools+1
|
|
tools[index] = tool
|
|
|
|
local slot = slotTemp:clone()
|
|
slot.Name = tool.Name
|
|
slot.Parent = slotsBin
|
|
|
|
local textHover = slot:WaitForChild("TextHover")
|
|
local selectionOutline = slot:WaitForChild("SelectionOutline")
|
|
local toolIcon = slot:WaitForChild("ToolIcon")
|
|
local indexLbl = slot:WaitForChild("Index")
|
|
local toolName = slot:WaitForChild("ToolName")
|
|
|
|
local isHovering = false
|
|
local isDown = false
|
|
|
|
local backpack = player:WaitForChild("Backpack")
|
|
local char = player.Character or player.CharacterAdded:Wait()
|
|
|
|
local humanoid = char:WaitForChild("Humanoid")
|
|
local conReg = {}
|
|
|
|
local function killTool()
|
|
local currentIndex = tonumber(indexLbl.Text)
|
|
table.remove(tools, currentIndex)
|
|
|
|
for _,con in pairs(conReg) do
|
|
con:disconnect()
|
|
end
|
|
|
|
slots[tool] = nil
|
|
slot:Destroy()
|
|
|
|
resortSlots()
|
|
end
|
|
|
|
local function checkParent()
|
|
if tool.Parent == char then
|
|
selectionOutline.Visible = true
|
|
elseif tool.Parent == backpack then
|
|
selectionOutline.Visible = false
|
|
else
|
|
killTool()
|
|
end
|
|
end
|
|
|
|
local function toggleTool()
|
|
if tool.Parent == char then
|
|
humanoid:UnequipTools()
|
|
else
|
|
toolIndex = tonumber(indexLbl.Text)
|
|
humanoid:EquipTool(tool)
|
|
end
|
|
end
|
|
|
|
local function renderUpdate()
|
|
if tool.TextureId ~= "" then
|
|
toolName.Visible = false
|
|
toolIcon.Visible = true
|
|
toolIcon.Image = tool.TextureId
|
|
else
|
|
toolIcon.Visible = false
|
|
toolName.Visible = true
|
|
toolName.Text = tool.Name
|
|
end
|
|
if tool.TextureId ~= "" then
|
|
textHover.Visible = false
|
|
if isHovering then
|
|
toolIcon.BackgroundTransparency = 0
|
|
if isDown then
|
|
toolIcon.BackgroundColor3 = Color3.new(0,0,1)
|
|
else
|
|
toolIcon.BackgroundColor3 = Color3.new(1,1,0)
|
|
end
|
|
else
|
|
toolIcon.BackgroundTransparency = 1
|
|
end
|
|
else
|
|
textHover.Visible = true
|
|
if isHovering then
|
|
textHover.BackgroundTransparency = 0
|
|
if isDown then
|
|
textHover.BackgroundColor3 = Color3.new(1,1,0)
|
|
else
|
|
textHover.BackgroundColor3 = Color3.new(0.706,0.706,0.706)
|
|
end
|
|
else
|
|
textHover.BackgroundTransparency = 1
|
|
end
|
|
end
|
|
end
|
|
|
|
local function onInputBegan(input)
|
|
if input.UserInputType.Name == "MouseButton1" then
|
|
isDown = true
|
|
elseif input.UserInputType.Name == "MouseMovement" or input.UserInputType.Name == "Touch" then
|
|
isHovering = true
|
|
end
|
|
renderUpdate()
|
|
end
|
|
|
|
local function onInputEnded(input)
|
|
if input.UserInputType.Name == "MouseButton1" then
|
|
isDown = false
|
|
if isHovering then
|
|
toggleTool()
|
|
end
|
|
elseif input.UserInputType.Name == "MouseMovement" then
|
|
isHovering = false
|
|
elseif input.UserInputType.Name == "Touch" then
|
|
isHovering = false
|
|
if humanoid.MoveDirection == Vector3.new() then
|
|
toggleTool()
|
|
end
|
|
end
|
|
|
|
renderUpdate()
|
|
end
|
|
|
|
local function onNumDown(num)
|
|
local currentIndex = tonumber(indexLbl.Text)
|
|
|
|
if num == currentIndex then
|
|
toggleTool()
|
|
end
|
|
end
|
|
|
|
local function onToolChanged(property)
|
|
if property == "TextureId" or property == "Name" then
|
|
renderUpdate()
|
|
elseif property == "Parent" then
|
|
checkParent()
|
|
end
|
|
end
|
|
|
|
local eventMounts =
|
|
{
|
|
[numPress] = onNumDown;
|
|
[tool.Changed] = onToolChanged;
|
|
[slot.InputBegan] = onInputBegan;
|
|
[slot.InputEnded] = onInputEnded;
|
|
[humanoid.Died] = killTool;
|
|
}
|
|
|
|
renderUpdate()
|
|
checkParent()
|
|
|
|
for event, func in pairs(eventMounts) do
|
|
local connection = event:Connect(func)
|
|
table.insert(conReg, connection)
|
|
end
|
|
|
|
slots[tool] = slot
|
|
resortSlots()
|
|
end
|
|
end
|
|
|
|
local currentChar
|
|
|
|
local function onCharacterAdded(char)
|
|
if currentChar ~= char then
|
|
currentChar = char
|
|
|
|
for _,v in pairs(slots) do
|
|
v:Destroy()
|
|
end
|
|
|
|
slots = {}
|
|
tools = {}
|
|
|
|
local function onChildAdded(child)
|
|
if child:IsA("Tool") then
|
|
createSlot(child)
|
|
end
|
|
end
|
|
|
|
local backpack = player:WaitForChild("Backpack")
|
|
|
|
for _,v in pairs(backpack:GetChildren()) do
|
|
onChildAdded(v)
|
|
end
|
|
|
|
for _,v in pairs(char:GetChildren()) do
|
|
onChildAdded(v)
|
|
end
|
|
|
|
char.ChildAdded:connect(onChildAdded)
|
|
backpack.ChildAdded:connect(onChildAdded)
|
|
end
|
|
end
|
|
|
|
if player.Character then
|
|
onCharacterAdded(player.Character)
|
|
end
|
|
|
|
player.CharacterAdded:connect(onCharacterAdded)
|
|
|
|
game.StarterGui.ResetPlayerGuiOnSpawn = false</string>
|
|
</Properties>
|
|
<Item class="TextButton" referent="80">
|
|
<Properties>
|
|
<string name="Name">SlotTemp</string>
|
|
<bool name="Active">true</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<bool name="archivable">true</bool>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoButtonColor">false</bool>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>0.7058823704719543</R>
|
|
<G>0.7058823704719543</G>
|
|
<B>0.7058823704719543</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">3</token>
|
|
<int name="LayoutOrder">0</int>
|
|
<float name="LineHeight">1</float>
|
|
<bool name="Modal">false</bool>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<bool name="Selected">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>0</XO>
|
|
<YS>1</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<string name="Text"></string>
|
|
<Color3 name="TextColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<float name="TextSize">14</float>
|
|
<Color3 name="TextStrokeColor3">
|
|
<R>0</R>
|
|
<G>0</G>
|
|
<B>0</B>
|
|
</Color3>
|
|
<float name="TextStrokeTransparency">1</float>
|
|
<float name="TextTransparency">0</float>
|
|
<token name="TextTruncate">0</token>
|
|
<bool name="TextWrapped">false</bool>
|
|
<token name="TextXAlignment">2</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">false</bool>
|
|
<int name="ZIndex">1</int>
|
|
</Properties>
|
|
<Item class="TextLabel" referent="81">
|
|
<Properties>
|
|
<string name="Name">Index</string>
|
|
<bool name="Active">true</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>0</X>
|
|
<Y>1</Y>
|
|
</Vector2>
|
|
<bool name="archivable">true</bool>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>0.6666666865348816</R>
|
|
<G>0.6666666865348816</G>
|
|
<B>0.6666666865348816</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">0</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">9</token>
|
|
<int name="LayoutOrder">0</int>
|
|
<float name="LineHeight">1</float>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0.029999999329447746</XS>
|
|
<XO>2</XO>
|
|
<YS>0.9700000286102295</YS>
|
|
<YO>-2</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0.20000000298023224</XS>
|
|
<XO>0</XO>
|
|
<YS>0.20000000298023224</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">2</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<string name="Text">1</string>
|
|
<Color3 name="TextColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<bool name="TextScaled">true</bool>
|
|
<float name="TextSize">14</float>
|
|
<Color3 name="TextStrokeColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<float name="TextStrokeTransparency">0.800000011920929</float>
|
|
<float name="TextTransparency">0</float>
|
|
<token name="TextTruncate">0</token>
|
|
<bool name="TextWrapped">true</bool>
|
|
<token name="TextXAlignment">2</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">3</int>
|
|
</Properties>
|
|
<Item class="UITextSizeConstraint" referent="82">
|
|
<Properties>
|
|
<string name="Name">UITextSizeConstraint</string>
|
|
<bool name="archivable">true</bool>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<int name="MaxTextSize">20</int>
|
|
<int name="MinTextSize">1</int>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
</Properties>
|
|
</Item>
|
|
</Item>
|
|
<Item class="Frame" referent="83">
|
|
<Properties>
|
|
<string name="Name">SelectionOutline</string>
|
|
<bool name="Active">false</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<bool name="archivable">true</bool>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>0</R>
|
|
<G>1</G>
|
|
<B>0</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<int name="LayoutOrder">0</int>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>-1</XO>
|
|
<YS>0</YS>
|
|
<YO>-1</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>2</XO>
|
|
<YS>1</YS>
|
|
<YO>2</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<bool name="Visible">false</bool>
|
|
<int name="ZIndex">1</int>
|
|
</Properties>
|
|
<Item class="Frame" referent="84">
|
|
<Properties>
|
|
<string name="Name">Outline</string>
|
|
<bool name="Active">false</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<bool name="archivable">true</bool>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>0</R>
|
|
<G>1</G>
|
|
<B>0</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">0</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<int name="LayoutOrder">0</int>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>0</XO>
|
|
<YS>0.9700000286102295</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>0</XO>
|
|
<YS>0.029999999329447746</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">3</int>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="Frame" referent="85">
|
|
<Properties>
|
|
<string name="Name">Outline</string>
|
|
<bool name="Active">false</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<bool name="archivable">true</bool>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>0</R>
|
|
<G>1</G>
|
|
<B>0</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">0</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<int name="LayoutOrder">0</int>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0.9700000286102295</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0.029999999329447746</XS>
|
|
<XO>0</XO>
|
|
<YS>1</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">3</int>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="Frame" referent="86">
|
|
<Properties>
|
|
<string name="Name">Outline</string>
|
|
<bool name="Active">false</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<bool name="archivable">true</bool>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>0</R>
|
|
<G>1</G>
|
|
<B>0</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">0</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<int name="LayoutOrder">0</int>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0.029999999329447746</XS>
|
|
<XO>0</XO>
|
|
<YS>1</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">3</int>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="Frame" referent="87">
|
|
<Properties>
|
|
<string name="Name">Outline</string>
|
|
<bool name="Active">false</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<bool name="archivable">true</bool>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>0</R>
|
|
<G>1</G>
|
|
<B>0</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">0</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<int name="LayoutOrder">0</int>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>0</XO>
|
|
<YS>0.029999999329447746</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">3</int>
|
|
</Properties>
|
|
</Item>
|
|
</Item>
|
|
<Item class="Frame" referent="88">
|
|
<Properties>
|
|
<string name="Name">TextHover</string>
|
|
<bool name="Active">false</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<bool name="archivable">true</bool>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>0.7058823704719543</R>
|
|
<G>0.7058823704719543</G>
|
|
<B>0.7058823704719543</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<int name="LayoutOrder">0</int>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>0</XO>
|
|
<YS>1</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<bool name="Visible">false</bool>
|
|
<int name="ZIndex">3</int>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="ImageLabel" referent="89">
|
|
<Properties>
|
|
<string name="Name">ToolIcon</string>
|
|
<bool name="Active">false</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<bool name="archivable">true</bool>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<Content name="Image">
|
|
<null>
|
|
</null>
|
|
</Content>
|
|
<Color3 name="ImageColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<Vector2 name="ImageRectOffset">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<Vector2 name="ImageRectSize">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<float name="ImageTransparency">0</float>
|
|
<int name="LayoutOrder">0</int>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0.15000000596046448</XS>
|
|
<XO>0</XO>
|
|
<YS>0.15000000596046448</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<token name="ScaleType">0</token>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0.699999988079071</XS>
|
|
<XO>0</XO>
|
|
<YS>0.699999988079071</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<Rect2D name="SliceCenter">
|
|
<min>
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</min>
|
|
<max>
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</max>
|
|
</Rect2D>
|
|
<float name="SliceScale">1</float>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<UDim2 name="TileSize">
|
|
<XS>1</XS>
|
|
<XO>0</XO>
|
|
<YS>1</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">4</int>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="TextLabel" referent="90">
|
|
<Properties>
|
|
<string name="Name">ToolName</string>
|
|
<bool name="Active">true</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>0</X>
|
|
<Y>0.5</Y>
|
|
</Vector2>
|
|
<bool name="archivable">true</bool>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">9</token>
|
|
<int name="LayoutOrder">0</int>
|
|
<float name="LineHeight">1</float>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0.10000000149011612</XS>
|
|
<XO>0</XO>
|
|
<YS>0.4749999940395355</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>2</XS>
|
|
<XO>0</XO>
|
|
<YS>0.17000000178813934</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<string name="Text">Tool</string>
|
|
<Color3 name="TextColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<bool name="TextScaled">true</bool>
|
|
<float name="TextSize">100</float>
|
|
<Color3 name="TextStrokeColor3">
|
|
<R>0.498039186000824</R>
|
|
<G>0.498039186000824</G>
|
|
<B>0.498039186000824</B>
|
|
</Color3>
|
|
<float name="TextStrokeTransparency">0.5</float>
|
|
<float name="TextTransparency">0.20000000298023224</float>
|
|
<token name="TextTruncate">0</token>
|
|
<bool name="TextWrapped">true</bool>
|
|
<token name="TextXAlignment">0</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">4</int>
|
|
</Properties>
|
|
</Item>
|
|
</Item>
|
|
</Item>
|
|
<Item class="LocalScript" referent="91">
|
|
<Properties>
|
|
<string name="Name">Chat</string>
|
|
<string name="Source">--------------------------------------------------------------------------------------------
|
|
-- Constants
|
|
--------------------------------------------------------------------------------------------
|
|
|
|
local Debris = game:GetService("Debris")
|
|
local ReplicatedStorage = game:GetService("ReplicatedStorage")
|
|
local RunService = game:GetService("RunService")
|
|
local TextService = game:GetService("TextService")
|
|
local UserInputService = game:GetService("UserInputService")
|
|
|
|
local LinkedList = require(script:WaitForChild("LinkedList"))
|
|
|
|
local ui = script.Parent
|
|
local rootFrame = ui:WaitForChild("RootFrame")
|
|
|
|
local chat = rootFrame:WaitForChild("Chat")
|
|
local chatBar = chat:WaitForChild("ChatBar")
|
|
local chatOutput = chat:WaitForChild("ChatOutput")
|
|
local chatRemote = ReplicatedStorage:WaitForChild("ChatRemote")
|
|
|
|
local focusBackdrop = chatBar:WaitForChild("FocusBackdrop")
|
|
local mainBackdrop = chat:WaitForChild("MainBackdrop")
|
|
local messageTemplate = script:WaitForChild("MessageTemplate")
|
|
|
|
local hasCoreGateway, coreGateway = pcall(function ()
|
|
local getCoreGateway = script:WaitForChild("GetCoreGateway")
|
|
return require(getCoreGateway)
|
|
end)
|
|
|
|
--------------------------------------------------------------------------------------------------------------------------------------
|
|
-- Player Colors
|
|
--------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
local PLAYER_COLORS =
|
|
{
|
|
[0] = Color3.fromRGB(173, 35, 35); -- red
|
|
[1] = Color3.fromRGB( 42, 75, 215); -- blue
|
|
[2] = Color3.fromRGB( 29, 105, 20); -- green
|
|
[3] = Color3.fromRGB(129, 38, 192); -- purple
|
|
[4] = Color3.fromRGB(255, 146, 51); -- orange
|
|
[5] = Color3.fromRGB(255, 238, 51); -- yellow
|
|
[6] = Color3.fromRGB(255, 205, 243); -- pink
|
|
[7] = Color3.fromRGB(233, 222, 187); -- tan
|
|
}
|
|
|
|
local function computePlayerColor(player)
|
|
if player.Team then
|
|
return player.TeamColor.Color
|
|
else
|
|
local pName = player.Name
|
|
local length = #pName
|
|
|
|
local oddShift = (1 - (length % 2))
|
|
local value = 0
|
|
|
|
for i = 1,length do
|
|
local char = pName:sub(i, i):byte()
|
|
local rev = (length - i) + oddShift
|
|
|
|
if (rev % 4) >= 2 then
|
|
value = value - char
|
|
else
|
|
value = value + char
|
|
end
|
|
end
|
|
|
|
return PLAYER_COLORS[value % 8]
|
|
end
|
|
end
|
|
|
|
--------------------------------------------------------------------------------------------
|
|
-- Chat Input
|
|
--------------------------------------------------------------------------------------------
|
|
|
|
local function beginChatting()
|
|
focusBackdrop.Visible = true
|
|
|
|
if not chatBar:IsFocused() then
|
|
chatBar.TextTransparency = 1
|
|
chatBar:CaptureFocus()
|
|
wait()
|
|
chatBar.Text = ""
|
|
chatBar.TextTransparency = 0
|
|
end
|
|
end
|
|
|
|
local function onInputBegan(input, processed)
|
|
if not processed and input.UserInputType == Enum.UserInputType.Keyboard then
|
|
if input.KeyCode == Enum.KeyCode.Slash then
|
|
beginChatting()
|
|
end
|
|
end
|
|
end
|
|
|
|
local function onChatFocusLost(enterPressed)
|
|
local msg = chatBar.Text
|
|
|
|
if enterPressed and #msg > 0 then
|
|
if #msg > 128 then
|
|
msg = msg:sub(1, 125) .. "..."
|
|
end
|
|
|
|
chatRemote:FireServer(msg)
|
|
|
|
if hasCoreGateway then
|
|
coreGateway.ChatWindow.MessagePosted:Fire(msg)
|
|
end
|
|
end
|
|
|
|
chatBar.Text = ""
|
|
focusBackdrop.Visible = false
|
|
end
|
|
|
|
UserInputService.InputBegan:Connect(onInputBegan)
|
|
|
|
chatBar.Focused:Connect(beginChatting)
|
|
chatBar.FocusLost:Connect(onChatFocusLost)
|
|
|
|
--------------------------------------------------------------------------------------------
|
|
-- Chat Output
|
|
--------------------------------------------------------------------------------------------
|
|
|
|
local messageId = 0
|
|
local blank_v2 = Vector2.new()
|
|
local chatQueue = LinkedList.new()
|
|
|
|
local function computeTextBounds(label)
|
|
local bounds = TextService:GetTextSize(label.Text, label.TextSize, label.Font, blank_v2)
|
|
return UDim2.new(0, bounds.X, 0, bounds.Y)
|
|
end
|
|
|
|
local function getMessageId()
|
|
messageId = messageId + 1
|
|
return messageId
|
|
end
|
|
|
|
local function onReceiveChat(player, message, wasFiltered)
|
|
-- Process the message
|
|
if message:sub(1, 1) == "%" then
|
|
message = "(TEAM) " .. message:sub(2)
|
|
end
|
|
|
|
if wasFiltered then
|
|
message = message:gsub("#[# ]+#", "[ Content Deleted ]")
|
|
end
|
|
|
|
-- Create the message
|
|
local msg = messageTemplate:Clone()
|
|
|
|
local playerLbl = msg:WaitForChild("PlayerName")
|
|
playerLbl.TextColor3 = computePlayerColor(player)
|
|
playerLbl.TextStrokeColor3 = playerLbl.TextColor3
|
|
playerLbl.Text = player.Name .. "; "
|
|
playerLbl.Size = computeTextBounds(playerLbl)
|
|
|
|
local msgLbl = msg:WaitForChild("Message")
|
|
msgLbl.Text = message
|
|
msgLbl.Size = computeTextBounds(msgLbl)
|
|
|
|
local width = playerLbl.AbsoluteSize.X + msgLbl.AbsoluteSize.X
|
|
|
|
msg.Size = msg.Size + UDim2.new(0, width, 0, 0)
|
|
msg.LayoutOrder = getMessageId()
|
|
|
|
msg.Name = "Message" .. msg.LayoutOrder
|
|
msg.Parent = chatOutput
|
|
|
|
if chatQueue.size == 6 then
|
|
local front = chatQueue.front
|
|
front.data:Destroy()
|
|
|
|
chatQueue:Remove(front.id)
|
|
end
|
|
|
|
chatQueue:Add(msg)
|
|
Debris:AddItem(msg, 60)
|
|
end
|
|
|
|
chatRemote.OnClientEvent:Connect(onReceiveChat)
|
|
|
|
--------------------------------------------------------------------------------------------</string>
|
|
</Properties>
|
|
<Item class="ModuleScript" referent="92">
|
|
<Properties>
|
|
<string name="Name">GetCoreGateway</string>
|
|
<string name="Source">local ChatConnections = {}
|
|
|
|
local function AddObjects(bindableClass,targetName,...)
|
|
local target = ChatConnections[targetName]
|
|
if not target then
|
|
target = {}
|
|
ChatConnections[targetName] = target
|
|
end
|
|
local names = {...}
|
|
for _,name in pairs(names) do
|
|
local signal = Instance.new(bindableClass)
|
|
signal.Name = targetName .. "_" .. name
|
|
signal.Parent = script
|
|
target[name] = signal
|
|
end
|
|
end
|
|
|
|
AddObjects("BindableEvent","ChatWindow",
|
|
---------------------------
|
|
-- Fired from the CoreGui
|
|
---------------------------
|
|
"ToggleVisibility", -- Fired when the CoreGui chat button is pressed.
|
|
"SetVisible", -- Fired when the CoreGui wants to directly change the visiblity state of the chat window.
|
|
"FocusChatBar", -- Fired when the CoreGui wants to capture the Chatbar's Focus.
|
|
"TopbarEnabledChanged", -- Fired when the visibility of the Topbar is changed.
|
|
"SpecialKeyPressed", -- Fired when the reserved ChatHotkey is pressed.
|
|
"CoreGuiEnabled", -- Fired when a user changes the SetCoreGuiEnabled state of the Chat Gui.
|
|
|
|
---------------------------
|
|
-- Fired to the CoreGui
|
|
---------------------------
|
|
"ChatBarFocusChanged",
|
|
-- ^ Fire this with 'true' when you want to assure the CoreGui that the ChatBar is being focused on.
|
|
|
|
"VisibilityStateChanged",
|
|
-- ^ Fire this with 'true' when the user shows or hides the chat.
|
|
|
|
"MessagesChanged",
|
|
-- ^ Fire this with a number to change the number of messages that have been recorded by the chat window.
|
|
-- If the CoreGui thinks the chat window isn't visible, it will display the recorded difference between
|
|
-- the number of messages that was displayed when it was visible, and the number you supply.
|
|
|
|
"MessagePosted"
|
|
-- ^ Fire this to make the player directly chat under ROBLOX's C++ API.
|
|
-- This will fire the LocalPlayer's Chatted event.
|
|
-- Please only fire this on the player's behalf. If you attempt to spoof a player's chat
|
|
-- to get them in trouble, you could face serious moderation action.
|
|
)
|
|
|
|
AddObjects("BindableFunction","ChatWindow",
|
|
"IsFocused" -- This will be invoked by the CoreGui when it wants to check if the chat window is active.
|
|
)
|
|
|
|
-- The following events are fired if the user calls StarterGui:SetCore(string name, Variant data)
|
|
-- Note that you can only hook onto these ones specifically.
|
|
AddObjects("BindableEvent","SetCore",
|
|
"ChatMakeSystemMessage",
|
|
"ChatWindowPosition",
|
|
"ChatWindowSize",
|
|
"ChatBarDisabled"
|
|
)
|
|
|
|
-- The following functions are invoked if the user calls StarterGui:GetCore(string name)
|
|
-- Note that you can only hook onto these ones specifically.
|
|
AddObjects("BindableFunction","GetCore",
|
|
"ChatWindowPosition", -- Should return a UDim2 representing the position of the chat window.
|
|
"ChatWindowSize", -- Should return a UDim2 representing the size of the chat window.
|
|
"ChatBarDisabled" -- Should return true if the chat bar is currently disabled.
|
|
)
|
|
|
|
-- Connect ChatConnections to the CoreGui.
|
|
local StarterGui = game:GetService("StarterGui")
|
|
local GuiService = game:GetService("GuiService")
|
|
|
|
if not GuiService:IsTenFootInterface() then
|
|
local tries = 0
|
|
local maxAttempts = 30
|
|
|
|
while (tries < maxAttempts) do
|
|
local success,result = pcall(function ()
|
|
StarterGui:SetCore("CoreGuiChatConnections", ChatConnections)
|
|
end)
|
|
if success then
|
|
break
|
|
else
|
|
tries = tries + 1
|
|
if tries == maxAttempts then
|
|
error("Error calling SetCore CoreGuiChatConnections: " .. result)
|
|
else
|
|
wait()
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
return ChatConnections</string>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="ModuleScript" referent="93">
|
|
<Properties>
|
|
<string name="Name">LinkedList</string>
|
|
<string name="Source">local LinkedList = {}
|
|
LinkedList.__index = LinkedList
|
|
|
|
function LinkedList:Add(data)
|
|
local node = {}
|
|
node.data = data
|
|
node.id = tostring(node):sub(8)
|
|
|
|
local back = self.back
|
|
if back then
|
|
back.next = node
|
|
node.prev = back
|
|
end
|
|
|
|
if not self.front then
|
|
self.front = node
|
|
end
|
|
|
|
self.back = node
|
|
self.size = self.size + 1
|
|
|
|
self.nodes[node.id] = node
|
|
self.lookup[data] = node
|
|
|
|
return node.id
|
|
end
|
|
|
|
function LinkedList:Get(id)
|
|
local node = self.nodes[id]
|
|
if node then
|
|
return node.data
|
|
end
|
|
end
|
|
|
|
function LinkedList:Remove(id)
|
|
local node = self.nodes[id]
|
|
|
|
if node then
|
|
if node.prev then
|
|
node.prev.next = node.next
|
|
end
|
|
|
|
if node.next then
|
|
node.next.prev = node.prev
|
|
end
|
|
|
|
if node == self.front then
|
|
self.front = node.next
|
|
end
|
|
|
|
if node == self.back then
|
|
self.back = node.prev
|
|
end
|
|
|
|
if node.data then
|
|
node.data = nil
|
|
end
|
|
|
|
self.size = self.size - 1
|
|
end
|
|
end
|
|
|
|
function LinkedList:GetEnumerator()
|
|
return coroutine.wrap(function ()
|
|
local node = self.front
|
|
while node ~= nil do
|
|
coroutine.yield(node.id, node.data)
|
|
node = node.next
|
|
end
|
|
end)
|
|
end
|
|
|
|
function LinkedList.new()
|
|
local list =
|
|
{
|
|
nodes = {};
|
|
lookup = {};
|
|
size = 0;
|
|
}
|
|
|
|
return setmetatable(list, LinkedList)
|
|
end
|
|
|
|
return LinkedList</string>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="Frame" referent="94">
|
|
<Properties>
|
|
<string name="Name">MessageTemplate</string>
|
|
<bool name="Active">false</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<bool name="archivable">true</bool>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>0.6000000238418579</R>
|
|
<G>0.6000000238418579</G>
|
|
<B>0.6000000238418579</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">0.6000000238418579</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<int name="LayoutOrder">0</int>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>16</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">1</int>
|
|
</Properties>
|
|
<Item class="TextLabel" referent="95">
|
|
<Properties>
|
|
<string name="Name">Message</string>
|
|
<bool name="Active">false</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<bool name="archivable">true</bool>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">9</token>
|
|
<int name="LayoutOrder">1</int>
|
|
<float name="LineHeight">1</float>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>0</XO>
|
|
<YS>1</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<string name="Text"></string>
|
|
<Color3 name="TextColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<float name="TextSize">16</float>
|
|
<Color3 name="TextStrokeColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<float name="TextStrokeTransparency">0.8999999761581421</float>
|
|
<float name="TextTransparency">0</float>
|
|
<token name="TextTruncate">0</token>
|
|
<bool name="TextWrapped">false</bool>
|
|
<token name="TextXAlignment">0</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">1</int>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="TextLabel" referent="96">
|
|
<Properties>
|
|
<string name="Name">PlayerName</string>
|
|
<bool name="Active">false</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<bool name="archivable">true</bool>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">9</token>
|
|
<int name="LayoutOrder">0</int>
|
|
<float name="LineHeight">1</float>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>0</XO>
|
|
<YS>1</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<string name="Text"></string>
|
|
<Color3 name="TextColor3">
|
|
<R>0</R>
|
|
<G>0</G>
|
|
<B>0</B>
|
|
</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<float name="TextSize">16</float>
|
|
<Color3 name="TextStrokeColor3">
|
|
<R>0</R>
|
|
<G>0</G>
|
|
<B>0</B>
|
|
</Color3>
|
|
<float name="TextStrokeTransparency">0.8999999761581421</float>
|
|
<float name="TextTransparency">0</float>
|
|
<token name="TextTruncate">0</token>
|
|
<bool name="TextWrapped">false</bool>
|
|
<token name="TextXAlignment">0</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">1</int>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="UIListLayout" referent="97">
|
|
<Properties>
|
|
<string name="Name">AutoLayout</string>
|
|
<bool name="archivable">true</bool>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<token name="FillDirection">0</token>
|
|
<token name="HorizontalAlignment">1</token>
|
|
<UDim name="Padding">
|
|
<S>0</S>
|
|
<O>0</O>
|
|
</UDim>
|
|
<token name="SortOrder">2</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<token name="VerticalAlignment">1</token>
|
|
</Properties>
|
|
</Item>
|
|
</Item>
|
|
</Item>
|
|
<Item class="LocalScript" referent="98">
|
|
<Properties>
|
|
<string name="Name">Health</string>
|
|
<string name="Source">local StarterGui = game:GetService("StarterGui")
|
|
StarterGui:SetCoreGuiEnabled("All",false)
|
|
|
|
local health = script.Parent
|
|
local redBar = health:WaitForChild("RedBar")
|
|
local greenBar = redBar:WaitForChild("GreenBar")
|
|
|
|
local player = game.Players.LocalPlayer
|
|
local c = workspace.CurrentCamera
|
|
|
|
if c.ViewportSize.Y < 600 then
|
|
local scale = Instance.new("UIScale")
|
|
scale.Scale = 0.6
|
|
scale.Parent = health
|
|
end
|
|
|
|
local function onCharacterAdded(char)
|
|
local humanoid = char:WaitForChild("Humanoid")
|
|
|
|
local function updateHealth(health)
|
|
greenBar.Size = UDim2.new(1, 0, health / humanoid.MaxHealth, 0)
|
|
end
|
|
|
|
updateHealth(humanoid.MaxHealth)
|
|
humanoid.HealthChanged:Connect(updateHealth)
|
|
end
|
|
|
|
if player.Character then
|
|
onCharacterAdded(player.Character)
|
|
end
|
|
|
|
player.CharacterAdded:Connect(onCharacterAdded)</string>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="LocalScript" referent="99">
|
|
<Properties>
|
|
<string name="Name">Messages</string>
|
|
<string name="Source">local Players = game:GetService("Players")
|
|
local RunService = game:GetService("RunService")
|
|
|
|
local gui = script.Parent
|
|
local player = Players.LocalPlayer
|
|
|
|
local hintBin = Instance.new("Folder")
|
|
local msgNameFmt = "MsgLbl_%s [%s]"
|
|
|
|
local function addMessage(sourceMsg,msgType)
|
|
local isInPlayer = (sourceMsg.Parent == player)
|
|
local msgType = sourceMsg.ClassName
|
|
|
|
if msgType == "Message" and isInPlayer then
|
|
msgType = "Player"
|
|
end
|
|
|
|
local msgTemp = script:WaitForChild(msgType)
|
|
|
|
local msg = msgTemp:Clone()
|
|
msg.Name = msgNameFmt:format(msgType, sourceMsg:GetFullName())
|
|
|
|
local textUpdater = sourceMsg:GetPropertyChangedSignal("Text")
|
|
local isUpdating = false
|
|
|
|
local function updateText()
|
|
if not isUpdating then
|
|
isUpdating = true
|
|
|
|
msg.Text = sourceMsg.Text
|
|
sourceMsg.Text = ""
|
|
|
|
if msgType ~= "Hint" then
|
|
msg.Visible = (#msg.Text > 0)
|
|
end
|
|
|
|
isUpdating = false
|
|
end
|
|
end
|
|
|
|
local function onAncestryChanged()
|
|
local desiredAncestor
|
|
|
|
if msgType == "Hint" then
|
|
desiredAncestor = hintBin
|
|
elseif isInPlayer then
|
|
desiredAncestor = player
|
|
else
|
|
desiredAncestor = workspace
|
|
end
|
|
|
|
if not sourceMsg:IsDescendantOf(desiredAncestor) then
|
|
msg:Destroy()
|
|
end
|
|
end
|
|
|
|
--[[
|
|
I have to parent the Hint somewhere where it won't render since it
|
|
draws even if the Hint has no text. The server will remove the object
|
|
by it's reference address even if I change the parent, so this isn't a
|
|
problem online. But I can't rely on this in a non-network scenario so
|
|
regular Hints will still be visible offline if they're in the Workspace :(
|
|
--]]
|
|
|
|
if msgType == "Hint" then
|
|
wait()
|
|
sourceMsg.Parent = hintBin
|
|
end
|
|
|
|
updateText()
|
|
textUpdater:Connect(updateText)
|
|
sourceMsg.AncestryChanged:Connect(onAncestryChanged)
|
|
|
|
msg.Parent = gui
|
|
end
|
|
|
|
local function registerMessage(obj)
|
|
if obj:IsA("Message") then
|
|
addMessage(obj)
|
|
end
|
|
end
|
|
|
|
for _,v in pairs(workspace:GetDescendants()) do
|
|
registerMessage(v)
|
|
end
|
|
|
|
for _,v in pairs(player:GetChildren()) do
|
|
registerMessage(v)
|
|
end
|
|
|
|
player.ChildAdded:Connect(registerMessage)
|
|
workspace.DescendantAdded:Connect(registerMessage)</string>
|
|
</Properties>
|
|
<Item class="TextLabel" referent="100">
|
|
<Properties>
|
|
<string name="Name">Hint</string>
|
|
<bool name="Active">false</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>0</X>
|
|
<Y>1</Y>
|
|
</Vector2>
|
|
<bool name="archivable">true</bool>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>0</R>
|
|
<G>0</G>
|
|
<B>0</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">0</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">1</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">9</token>
|
|
<int name="LayoutOrder">0</int>
|
|
<float name="LineHeight">1</float>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>0</XO>
|
|
<YS>1</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>20</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<string name="Text"></string>
|
|
<Color3 name="TextColor3">
|
|
<R>0.8823530077934265</R>
|
|
<G>0.8823530077934265</G>
|
|
<B>0.8823530077934265</B>
|
|
</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<float name="TextSize">16</float>
|
|
<Color3 name="TextStrokeColor3">
|
|
<R>0.7843137979507446</R>
|
|
<G>0.7843137979507446</G>
|
|
<B>0.7843137979507446</B>
|
|
</Color3>
|
|
<float name="TextStrokeTransparency">0.8999999761581421</float>
|
|
<float name="TextTransparency">0</float>
|
|
<token name="TextTruncate">0</token>
|
|
<bool name="TextWrapped">false</bool>
|
|
<token name="TextXAlignment">2</token>
|
|
<token name="TextYAlignment">2</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">1</int>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="TextLabel" referent="101">
|
|
<Properties>
|
|
<string name="Name">Message</string>
|
|
<bool name="Active">false</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<bool name="archivable">true</bool>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>0.498039186000824</R>
|
|
<G>0.498039186000824</G>
|
|
<B>0.498039186000824</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">0.5</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">9</token>
|
|
<int name="LayoutOrder">0</int>
|
|
<float name="LineHeight">1</float>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>-36</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>0</XO>
|
|
<YS>1</YS>
|
|
<YO>36</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<string name="Text"></string>
|
|
<Color3 name="TextColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<float name="TextSize">18</float>
|
|
<Color3 name="TextStrokeColor3">
|
|
<R>0</R>
|
|
<G>0</G>
|
|
<B>0</B>
|
|
</Color3>
|
|
<float name="TextStrokeTransparency">0.10000000149011612</float>
|
|
<float name="TextTransparency">0.10000000149011612</float>
|
|
<token name="TextTruncate">0</token>
|
|
<bool name="TextWrapped">true</bool>
|
|
<token name="TextXAlignment">2</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">false</bool>
|
|
<int name="ZIndex">1</int>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="TextLabel" referent="102">
|
|
<Properties>
|
|
<string name="Name">Player</string>
|
|
<bool name="Active">false</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<bool name="archivable">true</bool>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>0.5882353186607361</R>
|
|
<G>0.5882353186607361</G>
|
|
<B>0.5882353186607361</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">0.5</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">9</token>
|
|
<int name="LayoutOrder">0</int>
|
|
<float name="LineHeight">1</float>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>32</XO>
|
|
<YS>0</YS>
|
|
<YO>5</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0.25</XS>
|
|
<XO>0</XO>
|
|
<YS>0.25</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<string name="Text">Test</string>
|
|
<Color3 name="TextColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<float name="TextSize">18</float>
|
|
<Color3 name="TextStrokeColor3">
|
|
<R>0</R>
|
|
<G>0</G>
|
|
<B>0</B>
|
|
</Color3>
|
|
<float name="TextStrokeTransparency">0.10000000149011612</float>
|
|
<float name="TextTransparency">0.10000000149011612</float>
|
|
<token name="TextTruncate">0</token>
|
|
<bool name="TextWrapped">true</bool>
|
|
<token name="TextXAlignment">2</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">10</int>
|
|
</Properties>
|
|
</Item>
|
|
</Item>
|
|
<Item class="LocalScript" referent="103">
|
|
<Properties>
|
|
<string name="Name">PlayerList</string>
|
|
<string name="Source">local Players = game:GetService("Players")
|
|
local RunService = game:GetService("RunService")
|
|
local Teams = game:GetService("Teams")
|
|
|
|
spawn(function ()
|
|
local StarterGui = game:GetService("StarterGui")
|
|
StarterGui:SetCoreGuiEnabled("PlayerList", false)
|
|
|
|
local player = Players.LocalPlayer
|
|
|
|
local playerGui = player:WaitForChild("PlayerGui")
|
|
playerGui:SetTopbarTransparency(1)
|
|
end)
|
|
|
|
--------------------------------------------------------------------------------------------------------------------------------------
|
|
-- Setup
|
|
--------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
local playerStates = {}
|
|
local teamGroups = {}
|
|
|
|
local statLookup = {}
|
|
local statNames = {}
|
|
|
|
local inTeamMode = false
|
|
|
|
local basePlayerLbl = script:WaitForChild("BasePlayerLbl")
|
|
local baseGroup = script:WaitForChild("BaseGroup")
|
|
local baseStat = script:WaitForChild("BaseStat")
|
|
|
|
local playerList = script.Parent
|
|
local backdrop = playerList:WaitForChild("Backdrop")
|
|
local container = playerList:WaitForChild("Container")
|
|
|
|
local coreGroup = baseGroup:Clone()
|
|
coreGroup.Name = "Default"
|
|
coreGroup.Parent = container
|
|
|
|
local coreFooter = coreGroup.Footer
|
|
local coreHeader = coreGroup.Header
|
|
|
|
local eUpdateStatLayout = Instance.new("BindableEvent")
|
|
local updateStatLayout = eUpdateStatLayout.Event
|
|
|
|
local eUpdateTeamTotal = Instance.new("BindableEvent")
|
|
local updateTeamTotal = eUpdateTeamTotal.Event
|
|
|
|
local ePlayerTeamChanged = Instance.new("BindableEvent")
|
|
local playerTeamChanged = ePlayerTeamChanged.Event
|
|
|
|
--------------------------------------------------------------------------------------------------------------------------------------
|
|
-- Player Colors
|
|
--------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
local PLAYER_COLORS =
|
|
{
|
|
[0] = Color3.fromRGB(173, 35, 35); -- red
|
|
[1] = Color3.fromRGB( 42, 75, 215); -- blue
|
|
[2] = Color3.fromRGB( 29, 105, 20); -- green
|
|
[3] = Color3.fromRGB(129, 38, 192); -- purple
|
|
[4] = Color3.fromRGB(255, 146, 51); -- orange
|
|
[5] = Color3.fromRGB(255, 238, 51); -- yellow
|
|
[6] = Color3.fromRGB(255, 205, 243); -- pink
|
|
[7] = Color3.fromRGB(233, 222, 187); -- tan
|
|
}
|
|
|
|
local function computePlayerColor(player)
|
|
local pName = player.Name
|
|
local length = #pName
|
|
local oddShift = (1 - (length % 2))
|
|
local value = 0
|
|
|
|
for i = 1,length do
|
|
local char = pName:sub(i,i):byte()
|
|
local rev = (length - i) + oddShift
|
|
if (rev % 4) >= 2 then
|
|
value = value - char
|
|
else
|
|
value = value + char
|
|
end
|
|
end
|
|
|
|
return PLAYER_COLORS[value % 8]
|
|
end
|
|
|
|
--------------------------------------------------------------------------------------------------------------------------------------
|
|
-- Backdrop Handler
|
|
--------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
local isTeamMode = false
|
|
local hasStats = false
|
|
|
|
local size1x1 = Vector2.new(1,1)
|
|
local rawGroups = {}
|
|
|
|
local function onContainerChildAdded(child)
|
|
if child:IsA("Frame") then
|
|
local listLayout = child:WaitForChild("ListLayout",2)
|
|
if listLayout then
|
|
rawGroups[child] = listLayout
|
|
end
|
|
end
|
|
end
|
|
|
|
local function onContainerChildRemoved(child)
|
|
if rawGroups[child] then
|
|
rawGroups[child] = nil
|
|
end
|
|
end
|
|
|
|
local function sortGroups(a,b)
|
|
if a == coreGroup then
|
|
return true
|
|
elseif b == coreGroup then
|
|
return false
|
|
else
|
|
local orderA,orderB = a.LayoutOrder,b.LayoutOrder
|
|
if orderA == orderB then
|
|
return a.Name < b.Name
|
|
else
|
|
return orderA < orderB
|
|
end
|
|
end
|
|
end
|
|
|
|
local function updateBackdrop()
|
|
local groups = {}
|
|
local at = 1
|
|
|
|
for group in pairs(rawGroups) do
|
|
if group.Visible then
|
|
groups[at] = group
|
|
at = at + 1
|
|
end
|
|
end
|
|
|
|
local height = 0
|
|
table.sort(groups,sortGroups)
|
|
|
|
for i = 1,#groups do
|
|
local group = groups[i]
|
|
local layout = rawGroups[group]
|
|
group.Position = UDim2.new(0,0,0,height)
|
|
height = height + layout.AbsoluteContentSize.Y
|
|
end
|
|
|
|
if #statNames > 0 and not hasStats then
|
|
hasStats = true
|
|
container.AnchorPoint = Vector2.new(1,0)
|
|
for _,group in pairs(groups) do
|
|
group.Header.TeamUnderline.Size = UDim2.new(2,-4,0,1)
|
|
end
|
|
eUpdateStatLayout:Fire()
|
|
elseif #statNames == 0 and hasStats then
|
|
hasStats = false
|
|
container.AnchorPoint = Vector2.new(0,0)
|
|
for _,group in pairs(groups) do
|
|
group.Header.TeamUnderline.Size = UDim2.new(1,-4,0,1)
|
|
end
|
|
eUpdateStatLayout:Fire()
|
|
end
|
|
|
|
if isTeamMode then
|
|
height = height + coreHeader.AbsoluteSize.Y
|
|
end
|
|
|
|
local width = container.AbsoluteSize.X * (container.AnchorPoint.X+1)
|
|
backdrop.Size = UDim2.new(0,width,0,height)
|
|
end
|
|
|
|
for _,child in pairs(container:GetChildren()) do
|
|
onContainerChildAdded(child)
|
|
end
|
|
|
|
container.ChildAdded:Connect(onContainerChildAdded)
|
|
container.ChildRemoved:Connect(onContainerChildRemoved)
|
|
RunService.Heartbeat:Connect(updateBackdrop)
|
|
|
|
--------------------------------------------------------------------------------------------------------------------------------------
|
|
-- Header Size Stuff
|
|
--------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
local function switchHeaderMode(isTeamMode)
|
|
if isTeamMode then
|
|
coreHeader.Size = UDim2.new(1,0,1/3,0)
|
|
coreHeader.Stats.Size = UDim2.new(0.75,0,1,0)
|
|
coreHeader.Title.Size = UDim2.new(1,0,1,0)
|
|
else
|
|
coreHeader.Size = UDim2.new(1,0,0.4,0)
|
|
coreHeader.Stats.Size = UDim2.new(0.75,0,0.85,0)
|
|
coreHeader.Title.Size = UDim2.new(1,0,0.85,0)
|
|
end
|
|
end
|
|
|
|
switchHeaderMode(false)
|
|
|
|
--------------------------------------------------------------------------------------------------------------------------------------
|
|
-- Player Stats
|
|
--------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
local function incrementStat(statName)
|
|
if not statLookup[statName] then
|
|
statLookup[statName] = 1
|
|
table.insert(statNames,statName)
|
|
else
|
|
statLookup[statName] = statLookup[statName] + 1
|
|
end
|
|
eUpdateStatLayout:Fire()
|
|
end
|
|
|
|
local function decrementStat(statName)
|
|
if statLookup[statName] then
|
|
statLookup[statName] = statLookup[statName] - 1
|
|
|
|
if statLookup[statName] == 0 then
|
|
statLookup[statName] = nil
|
|
for i,name in ipairs(statNames) do
|
|
if name == statName then
|
|
table.remove(statNames,i)
|
|
break
|
|
end
|
|
end
|
|
end
|
|
|
|
eUpdateStatLayout:Fire()
|
|
end
|
|
end
|
|
|
|
local function getPlayerStateFromStat(stat)
|
|
local leaderstats = stat.Parent
|
|
if leaderstats then
|
|
local player = leaderstats.Parent
|
|
if player then
|
|
return playerStates[player]
|
|
end
|
|
end
|
|
end
|
|
|
|
local function refreshTeamStats()
|
|
for _,team in pairs(Teams:GetTeams()) do
|
|
eUpdateTeamTotal:Fire(team)
|
|
end
|
|
end
|
|
|
|
local function onStatRemoved(stat,statName)
|
|
if stat.ClassName == "IntValue" then
|
|
local statName = statName or stat.Name
|
|
local playerState = getPlayerStateFromStat(stat)
|
|
if playerState and playerState.Stats[statName] then
|
|
playerState.Stats[statName]:Destroy()
|
|
playerState.Stats[statName] = nil
|
|
end
|
|
decrementStat(statName)
|
|
refreshTeamStats()
|
|
end
|
|
end
|
|
|
|
local function onStatAdded(stat)
|
|
if stat.ClassName == "IntValue" then
|
|
local statName = stat.Name
|
|
local playerState = getPlayerStateFromStat(stat)
|
|
if playerState then
|
|
local changeSignal
|
|
|
|
if not playerState.Stats[statName] then
|
|
local statLbl = baseStat:Clone()
|
|
statLbl.Name = statName
|
|
|
|
local function updateStat()
|
|
statLbl.Text = stat.Value
|
|
if isTeamMode then
|
|
local team = playerState.Player.Team
|
|
if team then
|
|
eUpdateTeamTotal:Fire(team)
|
|
end
|
|
end
|
|
end
|
|
|
|
updateStat()
|
|
changeSignal = stat.Changed:Connect(updateStat)
|
|
|
|
statLbl.Parent = playerState.Label.Stats
|
|
playerState.Stats[statName] = statLbl
|
|
end
|
|
|
|
local nameSignal do
|
|
local function onNameChanged()
|
|
if changeSignal then
|
|
changeSignal:Disconnect()
|
|
changeSignal = nil
|
|
end
|
|
nameSignal:Disconnect()
|
|
nameSignal = nil
|
|
|
|
-- Rebuild the stat
|
|
onStatRemoved(stat,statName)
|
|
onStatAdded(stat)
|
|
end
|
|
|
|
nameSignal = stat:GetPropertyChangedSignal("Name"):Connect(onNameChanged)
|
|
end
|
|
end
|
|
|
|
incrementStat(statName)
|
|
refreshTeamStats()
|
|
end
|
|
end
|
|
|
|
local function onPlayerChildAdded(leaderstats)
|
|
if leaderstats.Name == "leaderstats" then
|
|
local player = leaderstats.Parent
|
|
local playerState = playerStates[player]
|
|
if playerState and not playerState.leaderstats then
|
|
playerState.leaderstats = leaderstats
|
|
for _,stat in pairs(leaderstats:GetChildren()) do
|
|
onStatAdded(stat)
|
|
end
|
|
leaderstats.ChildAdded:Connect(onStatAdded)
|
|
leaderstats.ChildRemoved:Connect(onStatRemoved)
|
|
end
|
|
end
|
|
end
|
|
|
|
local function onPlayerChildRemoved(child)
|
|
if child.Name == "leaderstats" then
|
|
for _,stat in pairs(child:GetChildren()) do
|
|
onStatRemoved(stat)
|
|
end
|
|
for player,playerState in pairs(playerStates) do
|
|
if playerState.leaderstats == child then
|
|
playerState.leaderstats = nil
|
|
break
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
local function updateStatLbl(statLbl,index)
|
|
statLbl.Size = UDim2.new(1/#statNames,0,1,0)
|
|
statLbl.Position = UDim2.new((index-1)/#statNames)
|
|
end
|
|
|
|
local function onUpdateStatLayout()
|
|
local statBin = coreHeader.Stats
|
|
|
|
for _,statLbl in pairs(statBin:GetChildren()) do
|
|
if statLbl:IsA("TextLabel") and not statLookup[statLbl.Name] then
|
|
statLbl:Destroy()
|
|
end
|
|
end
|
|
|
|
for i,statName in pairs(statNames) do
|
|
local statLbl = statBin:FindFirstChild(statName)
|
|
if not statLbl then
|
|
statLbl = baseStat:Clone()
|
|
statLbl.Name = statName
|
|
statLbl.Text = statName
|
|
statLbl.Parent = statBin
|
|
end
|
|
updateStatLbl(statLbl,i)
|
|
end
|
|
|
|
for player,playerState in pairs(playerStates) do
|
|
for statName,statLbl in pairs(playerState.Stats) do
|
|
if not statLookup[statName] then
|
|
statLbl:Destroy()
|
|
playerState.Stats[statName] = nil
|
|
end
|
|
end
|
|
|
|
for i,statName in pairs(statNames) do
|
|
local statLbl = playerState.Stats[statName]
|
|
if statLbl then
|
|
if player.Team then
|
|
statLbl.TextColor = player.Team.TeamColor
|
|
else
|
|
statLbl.TextColor3 = Color3.new(1,1,1)
|
|
end
|
|
updateStatLbl(statLbl,i)
|
|
end
|
|
end
|
|
end
|
|
|
|
isTeamMode = (#Teams:GetTeams() > 0)
|
|
|
|
if isTeamMode then
|
|
coreHeader.Visible = hasStats
|
|
coreHeader.Title.Text = "Team"
|
|
else
|
|
coreHeader.Visible = true
|
|
if hasStats then
|
|
coreHeader.Title.Text = "Players"
|
|
else
|
|
coreHeader.Title.Text = "Player List"
|
|
end
|
|
end
|
|
|
|
switchHeaderMode(isTeamMode)
|
|
end
|
|
|
|
updateStatLayout:Connect(onUpdateStatLayout)
|
|
|
|
--------------------------------------------------------------------------------------------------------------------------------------
|
|
-- Player States
|
|
--------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
local function onPlayerAdded(player)
|
|
local playerState = {}
|
|
local name = player.Name
|
|
|
|
local lbl = basePlayerLbl:Clone()
|
|
lbl.Name = name
|
|
lbl.PlayerName.Text = name
|
|
lbl.PlayerName.TextColor3 = computePlayerColor(player)
|
|
lbl.Parent = coreGroup
|
|
|
|
playerState.Player = player
|
|
playerState.Label = lbl
|
|
playerState.Stats = {}
|
|
playerStates[player] = playerState
|
|
|
|
for _,child in pairs(player:GetChildren()) do
|
|
onPlayerChildAdded(child)
|
|
end
|
|
|
|
player.ChildAdded:Connect(onPlayerChildAdded)
|
|
player.ChildRemoved:Connect(onPlayerChildRemoved)
|
|
|
|
player.Changed:Connect(function (property)
|
|
if property == "Team" then
|
|
ePlayerTeamChanged:Fire(player)
|
|
end
|
|
end)
|
|
|
|
ePlayerTeamChanged:Fire(player)
|
|
end
|
|
|
|
local function onPlayerRemoved(player)
|
|
local state = playerStates[player]
|
|
playerStates[player] = nil
|
|
|
|
if state and state.Label then
|
|
state.Label:Destroy()
|
|
end
|
|
end
|
|
|
|
for _,player in pairs(Players:GetPlayers()) do
|
|
onPlayerAdded(player)
|
|
end
|
|
|
|
Players.PlayerAdded:Connect(onPlayerAdded)
|
|
Players.PlayerRemoving:Connect(onPlayerRemoved)
|
|
|
|
--------------------------------------------------------------------------------------------------------------------------------------
|
|
-- Teams
|
|
--------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
local function neutralizePlayer(player)
|
|
local playerState = playerStates[player]
|
|
if playerState then
|
|
local playerLbl = playerState.Label
|
|
playerLbl.PlayerName.Text = player.Name
|
|
playerLbl.PlayerName.TextColor3 = computePlayerColor(player)
|
|
playerLbl.PlayerName.Position = UDim2.new(0,0,0,0)
|
|
for stat,statLbl in pairs(playerState.Stats) do
|
|
statLbl.TextColor3 = Color3.new(1,1,1)
|
|
end
|
|
playerLbl.Visible = (not isTeamMode)
|
|
playerLbl.Parent = coreGroup
|
|
end
|
|
end
|
|
|
|
local function onPlayerAddedToTeam(player)
|
|
local team = player.Team
|
|
local group = teamGroups[team]
|
|
if group then
|
|
local playerState = playerStates[player]
|
|
if playerState then
|
|
local playerLbl = playerState.Label
|
|
playerLbl.PlayerName.TextColor = team.TeamColor
|
|
playerLbl.PlayerName.Position = UDim2.new(0,4,0,0)
|
|
for stat,statLbl in pairs(playerState.Stats) do
|
|
statLbl.TextColor = team.TeamColor
|
|
end
|
|
playerLbl.Parent = group
|
|
playerLbl.Visible = true
|
|
eUpdateStatLayout:Fire()
|
|
refreshTeamStats()
|
|
end
|
|
end
|
|
end
|
|
|
|
local function onPlayerRemovedFromTeam(player)
|
|
if not player.Team then
|
|
neutralizePlayer(player)
|
|
refreshTeamStats()
|
|
end
|
|
end
|
|
|
|
local function onUpdateTeamTotal(team)
|
|
local teamGroup = teamGroups[team]
|
|
if teamGroup then
|
|
local teamStats = teamGroup.Header.Stats
|
|
local totals = {}
|
|
|
|
for i,statName in ipairs(statNames) do
|
|
local total = totals[i]
|
|
if not total then
|
|
total = { Name = statName, Value = 0 }
|
|
totals[i] = total
|
|
end
|
|
for _,player in pairs(team:GetPlayers()) do
|
|
local playerState = playerStates[player]
|
|
if playerState then
|
|
local leaderstats = playerState.leaderstats
|
|
if leaderstats then
|
|
local stat = leaderstats:FindFirstChild(statName)
|
|
if stat then
|
|
total.Value = total.Value + stat.Value
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
local numStats = #statNames
|
|
|
|
for i,statRecord in ipairs(totals) do
|
|
local statName = statRecord.Name
|
|
local statLbl = teamStats:FindFirstChild(statName)
|
|
if not statLbl then
|
|
statLbl = baseStat:Clone()
|
|
statLbl.Name = statName
|
|
statLbl.TextColor = team.TeamColor
|
|
statLbl.TextStrokeTransparency = 0.5
|
|
statLbl.Parent = teamStats
|
|
end
|
|
statLbl.Text = statRecord.Value
|
|
updateStatLbl(statLbl,i)
|
|
end
|
|
|
|
for _,statLbl in pairs(teamStats:GetChildren()) do
|
|
if not statLookup[statLbl.Name] then
|
|
statLbl:Destroy()
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
local function onTeamAdded(team)
|
|
if team.ClassName == "Team" then
|
|
local teamGroup = baseGroup:Clone()
|
|
teamGroup.Name = team.Name
|
|
teamGroup.Footer.Visible = true
|
|
|
|
local teamHeader = teamGroup.Header
|
|
|
|
local teamUnderline = teamHeader.TeamUnderline
|
|
teamUnderline.Visible = true
|
|
teamUnderline.BackgroundColor = team.TeamColor
|
|
|
|
if hasStats then
|
|
teamUnderline.Size = teamUnderline.Size + UDim2.new(1,0,0,0)
|
|
end
|
|
|
|
local teamTitle = teamHeader.Title
|
|
teamTitle.Text = team.Name
|
|
teamTitle.TextColor = team.TeamColor
|
|
teamTitle.TextStrokeTransparency = 0.5
|
|
|
|
teamGroup.Parent = container
|
|
teamGroups[team] = teamGroup
|
|
|
|
for _,player in pairs(team:GetPlayers()) do
|
|
onPlayerAddedToTeam(player)
|
|
end
|
|
|
|
eUpdateTeamTotal:Fire(team)
|
|
eUpdateStatLayout:Fire()
|
|
end
|
|
if #Teams:GetTeams() > 0 and not isTeamMode then
|
|
isTeamMode = true
|
|
for _,player in pairs(Players:GetPlayers()) do
|
|
if not player.Team then
|
|
neutralizePlayer(player)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
local function onTeamRemoved(team)
|
|
if teamGroups[team] then
|
|
for _,player in pairs(Players:GetPlayers()) do
|
|
if player.TeamColor == team.TeamColor then
|
|
neutralizePlayer(player)
|
|
end
|
|
end
|
|
teamGroups[team]:Destroy()
|
|
teamGroups[team] = nil
|
|
eUpdateStatLayout:Fire()
|
|
end
|
|
if #Teams:GetTeams() == 0 then
|
|
isTeamMode = false
|
|
for _,player in pairs(Players:GetPlayers()) do
|
|
neutralizePlayer(player)
|
|
end
|
|
end
|
|
end
|
|
|
|
local function onPlayerTeamChange(player)
|
|
local team = player.Team
|
|
if team then
|
|
onPlayerAddedToTeam(player)
|
|
else
|
|
onPlayerRemovedFromTeam(player)
|
|
end
|
|
end
|
|
|
|
for _,team in pairs(Teams:GetTeams()) do
|
|
onTeamAdded(team)
|
|
end
|
|
|
|
for _,player in pairs(Players:GetPlayers()) do
|
|
onPlayerTeamChange(player)
|
|
end
|
|
|
|
Teams.ChildAdded:Connect(onTeamAdded)
|
|
Teams.ChildRemoved:Connect(onTeamRemoved)
|
|
updateTeamTotal:Connect(onUpdateTeamTotal)
|
|
playerTeamChanged:Connect(onPlayerTeamChange)
|
|
|
|
--------------------------------------------------------------------------------------------------------------------------------------</string>
|
|
</Properties>
|
|
<Item class="Frame" referent="104">
|
|
<Properties>
|
|
<string name="Name">BaseGroup</string>
|
|
<bool name="Active">false</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<bool name="archivable">true</bool>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">1</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<int name="LayoutOrder">-9999</int>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>0</XO>
|
|
<YS>1</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">1</int>
|
|
</Properties>
|
|
<Item class="Frame" referent="105">
|
|
<Properties>
|
|
<string name="Name">Footer</string>
|
|
<bool name="Active">false</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<bool name="archivable">true</bool>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>0</R>
|
|
<G>1</G>
|
|
<B>0</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">1</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<int name="LayoutOrder">999999999</int>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>0</XO>
|
|
<YS>0.16500000655651093</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<bool name="Visible">false</bool>
|
|
<int name="ZIndex">1</int>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="Frame" referent="106">
|
|
<Properties>
|
|
<string name="Name">Header</string>
|
|
<bool name="Active">false</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<bool name="archivable">true</bool>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>0</R>
|
|
<G>0</G>
|
|
<B>0</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">1</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<int name="LayoutOrder">-9999999</int>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>0</XO>
|
|
<YS>0.3330000042915344</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">1</int>
|
|
</Properties>
|
|
<Item class="TextLabel" referent="107">
|
|
<Properties>
|
|
<string name="Name">Title</string>
|
|
<bool name="Active">false</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>1</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<bool name="archivable">true</bool>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>0</R>
|
|
<G>0</G>
|
|
<B>0</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">1</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">9</token>
|
|
<int name="LayoutOrder">0</int>
|
|
<float name="LineHeight">1</float>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>0</XO>
|
|
<YS>1</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<string name="Text">Player List</string>
|
|
<Color3 name="TextColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<bool name="TextScaled">true</bool>
|
|
<float name="TextSize">14</float>
|
|
<Color3 name="TextStrokeColor3">
|
|
<R>0</R>
|
|
<G>0</G>
|
|
<B>0</B>
|
|
</Color3>
|
|
<float name="TextStrokeTransparency">1</float>
|
|
<float name="TextTransparency">0</float>
|
|
<token name="TextTruncate">0</token>
|
|
<bool name="TextWrapped">true</bool>
|
|
<token name="TextXAlignment">0</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="Frame" referent="108">
|
|
<Properties>
|
|
<string name="Name">Stats</string>
|
|
<bool name="Active">false</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<bool name="archivable">true</bool>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>0</R>
|
|
<G>0</G>
|
|
<B>0</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">1</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<int name="LayoutOrder">0</int>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0.75</XS>
|
|
<XO>0</XO>
|
|
<YS>1</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">1</int>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="Frame" referent="109">
|
|
<Properties>
|
|
<string name="Name">TeamUnderline</string>
|
|
<bool name="Active">false</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<bool name="archivable">true</bool>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">0</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<int name="LayoutOrder">0</int>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>-1</XS>
|
|
<XO>2</XO>
|
|
<YS>0.875</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>-4</XO>
|
|
<YS>0</YS>
|
|
<YO>1</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<bool name="Visible">false</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
</Item>
|
|
</Item>
|
|
<Item class="UIListLayout" referent="110">
|
|
<Properties>
|
|
<string name="Name">ListLayout</string>
|
|
<bool name="archivable">true</bool>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<token name="FillDirection">1</token>
|
|
<token name="HorizontalAlignment">1</token>
|
|
<UDim name="Padding">
|
|
<S>0</S>
|
|
<O>0</O>
|
|
</UDim>
|
|
<token name="SortOrder">2</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<token name="VerticalAlignment">1</token>
|
|
</Properties>
|
|
</Item>
|
|
</Item>
|
|
<Item class="Frame" referent="111">
|
|
<Properties>
|
|
<string name="Name">BasePlayerLbl</string>
|
|
<bool name="Active">false</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<bool name="archivable">true</bool>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>0</R>
|
|
<G>1</G>
|
|
<B>0</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">1</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<int name="LayoutOrder">0</int>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>0</XO>
|
|
<YS>0.33329999446868896</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">1</int>
|
|
</Properties>
|
|
<Item class="TextLabel" referent="112">
|
|
<Properties>
|
|
<string name="Name">PlayerName</string>
|
|
<bool name="Active">false</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>1</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<bool name="archivable">true</bool>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>0</R>
|
|
<G>0</G>
|
|
<B>0</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">1</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">9</token>
|
|
<int name="LayoutOrder">0</int>
|
|
<float name="LineHeight">1</float>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>0</XO>
|
|
<YS>1</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<string name="Text">OnlyTwentyCharacters</string>
|
|
<Color3 name="TextColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<bool name="TextScaled">true</bool>
|
|
<float name="TextSize">14</float>
|
|
<Color3 name="TextStrokeColor3">
|
|
<R>0</R>
|
|
<G>0</G>
|
|
<B>0</B>
|
|
</Color3>
|
|
<float name="TextStrokeTransparency">1</float>
|
|
<float name="TextTransparency">0</float>
|
|
<token name="TextTruncate">0</token>
|
|
<bool name="TextWrapped">true</bool>
|
|
<token name="TextXAlignment">0</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="Frame" referent="113">
|
|
<Properties>
|
|
<string name="Name">Stats</string>
|
|
<bool name="Active">false</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<bool name="archivable">true</bool>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>0</R>
|
|
<G>0</G>
|
|
<B>0</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">1</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<int name="LayoutOrder">0</int>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0.75</XS>
|
|
<XO>0</XO>
|
|
<YS>1</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">1</int>
|
|
</Properties>
|
|
</Item>
|
|
</Item>
|
|
<Item class="TextLabel" referent="114">
|
|
<Properties>
|
|
<string name="Name">BaseStat</string>
|
|
<bool name="Active">false</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<bool name="archivable">true</bool>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>0</R>
|
|
<G>0</G>
|
|
<B>0</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">1</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">9</token>
|
|
<int name="LayoutOrder">0</int>
|
|
<float name="LineHeight">1</float>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>0</XO>
|
|
<YS>1</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<string name="Text">0</string>
|
|
<Color3 name="TextColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<bool name="TextScaled">true</bool>
|
|
<float name="TextSize">14</float>
|
|
<Color3 name="TextStrokeColor3">
|
|
<R>0</R>
|
|
<G>0</G>
|
|
<B>0</B>
|
|
</Color3>
|
|
<float name="TextStrokeTransparency">1</float>
|
|
<float name="TextTransparency">0</float>
|
|
<token name="TextTruncate">0</token>
|
|
<bool name="TextWrapped">true</bool>
|
|
<token name="TextXAlignment">0</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
</Item>
|
|
</Item>
|
|
<Item class="Frame" referent="115">
|
|
<Properties>
|
|
<string name="Name">RootFrame</string>
|
|
<bool name="Active">false</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">1</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<int name="LayoutOrder">0</int>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>0</XO>
|
|
<YS>1</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">1</int>
|
|
</Properties>
|
|
<Item class="UIPadding" referent="116">
|
|
<Properties>
|
|
<string name="Name">ChatPadding</string>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<UDim name="PaddingBottom">
|
|
<S>0</S>
|
|
<O>20</O>
|
|
</UDim>
|
|
<UDim name="PaddingLeft">
|
|
<S>0</S>
|
|
<O>0</O>
|
|
</UDim>
|
|
<UDim name="PaddingRight">
|
|
<S>0</S>
|
|
<O>0</O>
|
|
</UDim>
|
|
<UDim name="PaddingTop">
|
|
<S>0</S>
|
|
<O>0</O>
|
|
</UDim>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="ImageLabel" referent="117">
|
|
<Properties>
|
|
<string name="Name">ClassicMouse</string>
|
|
<bool name="Active">false</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>0.5</X>
|
|
<Y>0.5</Y>
|
|
</Vector2>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">1</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<Content name="Image">
|
|
<url>rbxassetid://334630296</url>
|
|
</Content>
|
|
<Color3 name="ImageColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<Vector2 name="ImageRectOffset">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<Vector2 name="ImageRectSize">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<float name="ImageTransparency">0</float>
|
|
<int name="LayoutOrder">0</int>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0.5</XS>
|
|
<XO>0</XO>
|
|
<YS>0.5</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<token name="ScaleType">0</token>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>80</XO>
|
|
<YS>0</YS>
|
|
<YO>80</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<Rect2D name="SliceCenter">
|
|
<min>
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</min>
|
|
<max>
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</max>
|
|
</Rect2D>
|
|
<float name="SliceScale">1</float>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<UDim2 name="TileSize">
|
|
<XS>1</XS>
|
|
<XO>0</XO>
|
|
<YS>1</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">10</int>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="ImageButton" referent="118">
|
|
<Properties>
|
|
<string name="Name">SafeChat</string>
|
|
<bool name="Active">true</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>0</X>
|
|
<Y>1</Y>
|
|
</Vector2>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoButtonColor">true</bool>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<Content name="HoverImage">
|
|
<null>
|
|
</null>
|
|
</Content>
|
|
<Content name="Image">
|
|
<url>rbxassetid://991182833</url>
|
|
</Content>
|
|
<Color3 name="ImageColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<Vector2 name="ImageRectOffset">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<Vector2 name="ImageRectSize">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<float name="ImageTransparency">0</float>
|
|
<int name="LayoutOrder">0</int>
|
|
<bool name="Modal">false</bool>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>22</XO>
|
|
<YS>0.75</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<Content name="PressedImage">
|
|
<null>
|
|
</null>
|
|
</Content>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<token name="ScaleType">0</token>
|
|
<bool name="Selectable">true</bool>
|
|
<bool name="Selected">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>32</XO>
|
|
<YS>0</YS>
|
|
<YO>30</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<Rect2D name="SliceCenter">
|
|
<min>
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</min>
|
|
<max>
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</max>
|
|
</Rect2D>
|
|
<float name="SliceScale">1</float>
|
|
<token name="Style">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<UDim2 name="TileSize">
|
|
<XS>1</XS>
|
|
<XO>0</XO>
|
|
<YS>1</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
<Item class="ImageLabel" referent="119">
|
|
<Properties>
|
|
<string name="Name">GamepadHint</string>
|
|
<bool name="Active">false</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>0.5</X>
|
|
<Y>0.75</Y>
|
|
</Vector2>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">1</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<Content name="Image">
|
|
<url>rbxasset://textures/ui/Settings/Help/XButtonDark@2x.png</url>
|
|
</Content>
|
|
<Color3 name="ImageColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<Vector2 name="ImageRectOffset">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<Vector2 name="ImageRectSize">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<float name="ImageTransparency">0</float>
|
|
<int name="LayoutOrder">0</int>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>1</XS>
|
|
<XO>5</XO>
|
|
<YS>0</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<token name="ScaleType">0</token>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0.75</XS>
|
|
<XO>0</XO>
|
|
<YS>0.75</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">2</token>
|
|
<Rect2D name="SliceCenter">
|
|
<min>
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</min>
|
|
<max>
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</max>
|
|
</Rect2D>
|
|
<float name="SliceScale">1</float>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<UDim2 name="TileSize">
|
|
<XS>1</XS>
|
|
<XO>0</XO>
|
|
<YS>1</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<bool name="Visible">false</bool>
|
|
<int name="ZIndex">1</int>
|
|
</Properties>
|
|
</Item>
|
|
</Item>
|
|
<Item class="Frame" referent="120">
|
|
<Properties>
|
|
<string name="Name">ZoomControls</string>
|
|
<bool name="Active">false</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>1</X>
|
|
<Y>1</Y>
|
|
</Vector2>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">1</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<int name="LayoutOrder">0</int>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>1</XS>
|
|
<XO>0</XO>
|
|
<YS>1</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>70</XO>
|
|
<YS>0</YS>
|
|
<YO>70</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">1</int>
|
|
</Properties>
|
|
<Item class="ImageButton" referent="121">
|
|
<Properties>
|
|
<string name="Name">RotateUp</string>
|
|
<bool name="Active">true</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoButtonColor">true</bool>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<Content name="HoverImage">
|
|
<null>
|
|
</null>
|
|
</Content>
|
|
<Content name="Image">
|
|
<url>rbxassetid://598662248</url>
|
|
</Content>
|
|
<Color3 name="ImageColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<Vector2 name="ImageRectOffset">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<Vector2 name="ImageRectSize">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<float name="ImageTransparency">0</float>
|
|
<int name="LayoutOrder">0</int>
|
|
<bool name="Modal">false</bool>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<Content name="PressedImage">
|
|
<null>
|
|
</null>
|
|
</Content>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<token name="ScaleType">0</token>
|
|
<bool name="Selectable">true</bool>
|
|
<bool name="Selected">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>35</XO>
|
|
<YS>0</YS>
|
|
<YO>35</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<Rect2D name="SliceCenter">
|
|
<min>
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</min>
|
|
<max>
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</max>
|
|
</Rect2D>
|
|
<float name="SliceScale">1</float>
|
|
<token name="Style">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<UDim2 name="TileSize">
|
|
<XS>1</XS>
|
|
<XO>0</XO>
|
|
<YS>1</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="ImageButton" referent="122">
|
|
<Properties>
|
|
<string name="Name">RotateDown</string>
|
|
<bool name="Active">true</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoButtonColor">true</bool>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<Content name="HoverImage">
|
|
<null>
|
|
</null>
|
|
</Content>
|
|
<Content name="Image">
|
|
<url>rbxassetid://598662248</url>
|
|
</Content>
|
|
<Color3 name="ImageColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<Vector2 name="ImageRectOffset">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<Vector2 name="ImageRectSize">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<float name="ImageTransparency">0</float>
|
|
<int name="LayoutOrder">0</int>
|
|
<bool name="Modal">false</bool>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>35</YO>
|
|
</UDim2>
|
|
<Content name="PressedImage">
|
|
<null>
|
|
</null>
|
|
</Content>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">-180</float>
|
|
<token name="ScaleType">0</token>
|
|
<bool name="Selectable">true</bool>
|
|
<bool name="Selected">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>35</XO>
|
|
<YS>0</YS>
|
|
<YO>35</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<Rect2D name="SliceCenter">
|
|
<min>
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</min>
|
|
<max>
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</max>
|
|
</Rect2D>
|
|
<float name="SliceScale">1</float>
|
|
<token name="Style">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<UDim2 name="TileSize">
|
|
<XS>1</XS>
|
|
<XO>0</XO>
|
|
<YS>1</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="ImageButton" referent="123">
|
|
<Properties>
|
|
<string name="Name">ZoomIn</string>
|
|
<bool name="Active">true</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoButtonColor">true</bool>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<Content name="HoverImage">
|
|
<null>
|
|
</null>
|
|
</Content>
|
|
<Content name="Image">
|
|
<url>rbxassetid://598663795</url>
|
|
</Content>
|
|
<Color3 name="ImageColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<Vector2 name="ImageRectOffset">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<Vector2 name="ImageRectSize">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<float name="ImageTransparency">0</float>
|
|
<int name="LayoutOrder">0</int>
|
|
<bool name="Modal">false</bool>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>35</XO>
|
|
<YS>0</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<Content name="PressedImage">
|
|
<null>
|
|
</null>
|
|
</Content>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<token name="ScaleType">0</token>
|
|
<bool name="Selectable">true</bool>
|
|
<bool name="Selected">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>35</XO>
|
|
<YS>0</YS>
|
|
<YO>35</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<Rect2D name="SliceCenter">
|
|
<min>
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</min>
|
|
<max>
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</max>
|
|
</Rect2D>
|
|
<float name="SliceScale">1</float>
|
|
<token name="Style">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<UDim2 name="TileSize">
|
|
<XS>1</XS>
|
|
<XO>0</XO>
|
|
<YS>1</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
<Item class="Frame" referent="124">
|
|
<Properties>
|
|
<string name="Name">Lock</string>
|
|
<bool name="Active">false</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">0.5</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<int name="LayoutOrder">0</int>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>35</XO>
|
|
<YS>0</YS>
|
|
<YO>35</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<bool name="Visible">false</bool>
|
|
<int name="ZIndex">3</int>
|
|
</Properties>
|
|
</Item>
|
|
</Item>
|
|
<Item class="ImageButton" referent="125">
|
|
<Properties>
|
|
<string name="Name">ZoomOut</string>
|
|
<bool name="Active">true</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoButtonColor">true</bool>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<Content name="HoverImage">
|
|
<null>
|
|
</null>
|
|
</Content>
|
|
<Content name="Image">
|
|
<url>rbxassetid://598665130</url>
|
|
</Content>
|
|
<Color3 name="ImageColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<Vector2 name="ImageRectOffset">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<Vector2 name="ImageRectSize">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<float name="ImageTransparency">0</float>
|
|
<int name="LayoutOrder">0</int>
|
|
<bool name="Modal">false</bool>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>35</XO>
|
|
<YS>0</YS>
|
|
<YO>35</YO>
|
|
</UDim2>
|
|
<Content name="PressedImage">
|
|
<null>
|
|
</null>
|
|
</Content>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<token name="ScaleType">0</token>
|
|
<bool name="Selectable">true</bool>
|
|
<bool name="Selected">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>35</XO>
|
|
<YS>0</YS>
|
|
<YO>35</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<Rect2D name="SliceCenter">
|
|
<min>
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</min>
|
|
<max>
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</max>
|
|
</Rect2D>
|
|
<float name="SliceScale">1</float>
|
|
<token name="Style">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<UDim2 name="TileSize">
|
|
<XS>1</XS>
|
|
<XO>0</XO>
|
|
<YS>1</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="ImageLabel" referent="126">
|
|
<Properties>
|
|
<string name="Name">FirstPersonIndicator</string>
|
|
<bool name="Active">false</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>1</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">1</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<Content name="Image">
|
|
<url>rbxassetid://598702035</url>
|
|
</Content>
|
|
<Color3 name="ImageColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<Vector2 name="ImageRectOffset">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<Vector2 name="ImageRectSize">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<float name="ImageTransparency">0</float>
|
|
<int name="LayoutOrder">0</int>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>1</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>-97</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<token name="ScaleType">0</token>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>168</XO>
|
|
<YS>0</YS>
|
|
<YO>42</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<Rect2D name="SliceCenter">
|
|
<min>
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</min>
|
|
<max>
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</max>
|
|
</Rect2D>
|
|
<float name="SliceScale">1</float>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<UDim2 name="TileSize">
|
|
<XS>1</XS>
|
|
<XO>0</XO>
|
|
<YS>1</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<bool name="Visible">false</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
</Item>
|
|
</Item>
|
|
<Item class="Frame" referent="127">
|
|
<Properties>
|
|
<string name="Name">Health</string>
|
|
<bool name="Active">false</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>1</X>
|
|
<Y>0.5</Y>
|
|
</Vector2>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<int name="LayoutOrder">0</int>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>1</XS>
|
|
<XO>-31</XO>
|
|
<YS>0.5</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>66</XO>
|
|
<YS>0</YS>
|
|
<YO>137</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">1</int>
|
|
</Properties>
|
|
<Item class="Frame" referent="128">
|
|
<Properties>
|
|
<string name="Name">RedBar</string>
|
|
<bool name="Active">false</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>0.5</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>1</R>
|
|
<G>0</G>
|
|
<B>0</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">0</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>1</R>
|
|
<G>0</G>
|
|
<B>0</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<int name="LayoutOrder">0</int>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0.5</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>12</XO>
|
|
<YS>0</YS>
|
|
<YO>112</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
<Item class="Frame" referent="129">
|
|
<Properties>
|
|
<string name="Name">GreenBar</string>
|
|
<bool name="Active">false</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>0.5</X>
|
|
<Y>1</Y>
|
|
</Vector2>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>0.5058823823928833</R>
|
|
<G>0.7725490927696228</G>
|
|
<B>0.08627451211214066</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">0</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.5058823823928833</R>
|
|
<G>0.7725490927696228</G>
|
|
<B>0.08627451211214066</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<int name="LayoutOrder">0</int>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0.5</XS>
|
|
<XO>0</XO>
|
|
<YS>1</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>0</XO>
|
|
<YS>1</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">3</int>
|
|
</Properties>
|
|
</Item>
|
|
</Item>
|
|
<Item class="TextLabel" referent="130">
|
|
<Properties>
|
|
<string name="Name">HealthLbl</string>
|
|
<bool name="Active">false</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">1</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">9</token>
|
|
<int name="LayoutOrder">0</int>
|
|
<float name="LineHeight">1</float>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>0</XO>
|
|
<YS>1</YS>
|
|
<YO>-24</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>24</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<string name="Text">Health</string>
|
|
<Color3 name="TextColor3">
|
|
<R>0</R>
|
|
<G>0</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<bool name="TextScaled">true</bool>
|
|
<float name="TextSize">18</float>
|
|
<Color3 name="TextStrokeColor3">
|
|
<R>0</R>
|
|
<G>0</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<float name="TextStrokeTransparency">0.8999999761581421</float>
|
|
<float name="TextTransparency">0</float>
|
|
<token name="TextTruncate">0</token>
|
|
<bool name="TextWrapped">true</bool>
|
|
<token name="TextXAlignment">2</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
</Item>
|
|
</Item>
|
|
<Item class="Frame" referent="131">
|
|
<Properties>
|
|
<string name="Name">Chat</string>
|
|
<bool name="Active">false</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">1</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<int name="LayoutOrder">0</int>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>0</XO>
|
|
<YS>1</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">1</int>
|
|
</Properties>
|
|
<Item class="TextBox" referent="132">
|
|
<Properties>
|
|
<string name="Name">ChatBar</string>
|
|
<bool name="Active">true</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>1</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.16862750053405762</R>
|
|
<G>0.16862750053405762</G>
|
|
<B>0.16862750053405762</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClearTextOnFocus">true</bool>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">4</token>
|
|
<int name="LayoutOrder">0</int>
|
|
<float name="LineHeight">1</float>
|
|
<bool name="MultiLine">false</bool>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<Color3 name="PlaceholderColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>0.7843137979507446</B>
|
|
</Color3>
|
|
<string name="PlaceholderText">To chat click here or press the "/" key</string>
|
|
<UDim2 name="Position">
|
|
<XS>1</XS>
|
|
<XO>0</XO>
|
|
<YS>1</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">true</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<bool name="ShowNativeInput">true</bool>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>-3</XO>
|
|
<YS>0</YS>
|
|
<YO>15</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<string name="Text"></string>
|
|
<Color3 name="TextColor3">
|
|
<R>0</R>
|
|
<G>0</G>
|
|
<B>0</B>
|
|
</Color3>
|
|
<bool name="TextEditable">true</bool>
|
|
<bool name="TextScaled">false</bool>
|
|
<float name="TextSize">15</float>
|
|
<Color3 name="TextStrokeColor3">
|
|
<R>0</R>
|
|
<G>0</G>
|
|
<B>0</B>
|
|
</Color3>
|
|
<float name="TextStrokeTransparency">1</float>
|
|
<float name="TextTransparency">0</float>
|
|
<token name="TextTruncate">0</token>
|
|
<bool name="TextWrapped">false</bool>
|
|
<token name="TextXAlignment">0</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">3</int>
|
|
</Properties>
|
|
<Item class="Frame" referent="133">
|
|
<Properties>
|
|
<string name="Name">FocusBackdrop</string>
|
|
<bool name="Active">false</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>1</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">0</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<int name="LayoutOrder">0</int>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>1</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>3</XO>
|
|
<YS>1</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<bool name="Visible">false</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
</Item>
|
|
</Item>
|
|
<Item class="Frame" referent="134">
|
|
<Properties>
|
|
<string name="Name">MainBackdrop</string>
|
|
<bool name="Active">false</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>0.250980406999588</R>
|
|
<G>0.250980406999588</G>
|
|
<B>0.250980406999588</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">0</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<int name="LayoutOrder">0</int>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>0</XO>
|
|
<YS>1</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>20</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">1</int>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="Frame" referent="135">
|
|
<Properties>
|
|
<string name="Name">ChatOutput</string>
|
|
<bool name="Active">false</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">1</int>
|
|
<bool name="ClipsDescendants">true</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<int name="LayoutOrder">0</int>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>23</XO>
|
|
<YS>0</YS>
|
|
<YO>29</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>96</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">1</int>
|
|
</Properties>
|
|
<Item class="UIListLayout" referent="136">
|
|
<Properties>
|
|
<string name="Name">Stream</string>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<token name="FillDirection">1</token>
|
|
<token name="HorizontalAlignment">1</token>
|
|
<UDim name="Padding">
|
|
<S>0</S>
|
|
<O>0</O>
|
|
</UDim>
|
|
<token name="SortOrder">2</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<token name="VerticalAlignment">2</token>
|
|
</Properties>
|
|
</Item>
|
|
</Item>
|
|
</Item>
|
|
<Item class="Frame" referent="137">
|
|
<Properties>
|
|
<string name="Name">Backpack</string>
|
|
<bool name="Active">true</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>0</X>
|
|
<Y>1</Y>
|
|
</Vector2>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>0.498039186000824</R>
|
|
<G>0.498039186000824</G>
|
|
<B>0.498039186000824</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<int name="LayoutOrder">0</int>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>0</XO>
|
|
<YS>1</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>0</XO>
|
|
<YS>1</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">2</token>
|
|
<token name="Style">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">1</int>
|
|
</Properties>
|
|
<Item class="UIScale" referent="138">
|
|
<Properties>
|
|
<string name="Name">UIScale</string>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<float name="Scale">0.13300000131130219</float>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="Frame" referent="139">
|
|
<Properties>
|
|
<string name="Name">Backdrop</string>
|
|
<bool name="Active">false</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>0.7058823704719543</R>
|
|
<G>0.7058823704719543</G>
|
|
<B>0.7058823704719543</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">0.5</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<int name="LayoutOrder">0</int>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>0</XO>
|
|
<YS>1</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="Frame" referent="140">
|
|
<Properties>
|
|
<string name="Name">Slots</string>
|
|
<bool name="Active">false</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">1</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<int name="LayoutOrder">0</int>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>0</XO>
|
|
<YS>1</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">1</int>
|
|
</Properties>
|
|
<Item class="UIListLayout" referent="141">
|
|
<Properties>
|
|
<string name="Name">UIListLayout</string>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<token name="FillDirection">0</token>
|
|
<token name="HorizontalAlignment">1</token>
|
|
<UDim name="Padding">
|
|
<S>0</S>
|
|
<O>0</O>
|
|
</UDim>
|
|
<token name="SortOrder">2</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<token name="VerticalAlignment">1</token>
|
|
</Properties>
|
|
</Item>
|
|
</Item>
|
|
</Item>
|
|
<Item class="Frame" referent="142">
|
|
<Properties>
|
|
<string name="Name">PlayerList</string>
|
|
<bool name="Active">false</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">1</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<int name="LayoutOrder">0</int>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>-36</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>0</XO>
|
|
<YS>1</YS>
|
|
<YO>36</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">1</int>
|
|
</Properties>
|
|
<Item class="Frame" referent="143">
|
|
<Properties>
|
|
<string name="Name">Backdrop</string>
|
|
<bool name="Active">false</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>1</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>0.6000000238418579</R>
|
|
<G>0.6000000238418579</G>
|
|
<B>0.6000000238418579</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">0.4000000059604645</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<int name="LayoutOrder">0</int>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>1</XS>
|
|
<XO>-10</XO>
|
|
<YS>0</YS>
|
|
<YO>10</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>10</XO>
|
|
<YS>0</YS>
|
|
<YO>10</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">1</int>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="Frame" referent="144">
|
|
<Properties>
|
|
<string name="Name">Container</string>
|
|
<bool name="Active">false</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>0</R>
|
|
<G>0</G>
|
|
<B>0</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<int name="LayoutOrder">0</int>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>1</XS>
|
|
<XO>-10</XO>
|
|
<YS>0</YS>
|
|
<YO>10</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0.16500000655651093</XS>
|
|
<XO>0</XO>
|
|
<YS>1</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">1</int>
|
|
</Properties>
|
|
<Item class="UIAspectRatioConstraint" referent="145">
|
|
<Properties>
|
|
<string name="Name">AspectRatio</string>
|
|
<float name="AspectRatio">3</float>
|
|
<token name="AspectType">0</token>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<token name="DominantAxis">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
</Properties>
|
|
</Item>
|
|
</Item>
|
|
</Item>
|
|
</Item>
|
|
<Item class="LocalScript" referent="146">
|
|
<Properties>
|
|
<string name="Name">SafeChat</string>
|
|
<string name="Source">local UserInputService = game:GetService("UserInputService")
|
|
local ReplicatedStorage = game:GetService("ReplicatedStorage")
|
|
local GuiService = game:GetService("GuiService")
|
|
|
|
local c = workspace.CurrentCamera
|
|
local resUpdate = c:GetPropertyChangedSignal("ViewportSize")
|
|
local safeChat = script.Parent
|
|
local click = script:WaitForChild("Click")
|
|
|
|
local IMG_CHAT = "rbxassetid://991182833"
|
|
local IMG_CHAT_DN = "rbxassetid://991182832"
|
|
local IMG_CHAT_OVR = "rbxassetid://991182834"
|
|
|
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
-- Fetch Tree Data
|
|
|
|
local mSafeChatTree = ReplicatedStorage:WaitForChild("SafeChatTree")
|
|
local safeChatTree = require(mSafeChatTree)
|
|
|
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
-- Button Positioning
|
|
|
|
local IS_PHONE = c.ViewportSize.Y < 600
|
|
|
|
local function onResolutionUpdate()
|
|
local viewPort = c.ViewportSize
|
|
local chatX = math.min(25,viewPort.Y/40)
|
|
local chatY = (viewPort.X/viewPort.Y) * (viewPort.Y * 0.225)
|
|
safeChat.Position = UDim2.new(0,chatX,1,-chatY)
|
|
end
|
|
|
|
onResolutionUpdate()
|
|
resUpdate:Connect(onResolutionUpdate)
|
|
|
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
-- Safe Chat Tree
|
|
|
|
local chatRemote = ReplicatedStorage:WaitForChild("ChatRemote")
|
|
local tempBranch = script:WaitForChild("TempBranch")
|
|
local tempButton = script: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
|
|
safeChat.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
|
|
safeChat.Image = IMG_CHAT_DN
|
|
|
|
if UserInputService:GetLastInputType() == Enum.UserInputType.Gamepad1 then
|
|
GuiService:AddSelectionParent("SafechatNav",safeChat)
|
|
GuiService.SelectedObject = safeChat
|
|
end
|
|
end
|
|
|
|
local function assembleTree(tree)
|
|
local treeFrame = tempBranch:Clone()
|
|
treeFrame.Name = "Branches"
|
|
|
|
local currentBranch
|
|
|
|
for i,branch in ipairs(tree.Branches) do
|
|
local label = branch.Label
|
|
local branches = branch.Branches
|
|
local button = tempButton:Clone()
|
|
button.Name = label
|
|
button.Text = label
|
|
button.LayoutOrder = i
|
|
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
|
|
deactivateRootTree()
|
|
chatRemote:FireServer(label)
|
|
click:Play()
|
|
end
|
|
end
|
|
|
|
button.MouseEnter:Connect(onEnter)
|
|
button.SelectionGained:Connect(onEnter)
|
|
button.MouseButton1Down:Connect(onActivate)
|
|
end
|
|
|
|
return treeFrame
|
|
end
|
|
|
|
rootTree = assembleTree(safeChatTree)
|
|
rootTree.Parent = safeChat
|
|
|
|
if IS_PHONE then
|
|
local uiScale = Instance.new("UIScale")
|
|
uiScale.Parent = rootTree
|
|
uiScale.Scale = 0.7
|
|
end
|
|
|
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
-- Button State
|
|
|
|
local isActivated = false
|
|
local isHovering = false
|
|
|
|
do
|
|
local function onMouseEnter()
|
|
if not isActivated then
|
|
safeChat.Image = IMG_CHAT_OVR
|
|
end
|
|
isHovering = true
|
|
end
|
|
|
|
local function onMouseLeave()
|
|
if not isActivated then
|
|
safeChat.Image = IMG_CHAT
|
|
end
|
|
isHovering = false
|
|
end
|
|
|
|
local function onMouseDown()
|
|
safeChat.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
|
|
|
|
safeChat.MouseEnter:Connect(onMouseEnter)
|
|
safeChat.MouseLeave:Connect(onMouseLeave)
|
|
safeChat.MouseButton1Down:Connect(onMouseDown)
|
|
safeChat.MouseButton1Up:Connect(onMouseUp)
|
|
|
|
UserInputService.InputBegan:Connect(onInputBegan)
|
|
end
|
|
|
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
-- Gamepad Stuff
|
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
local gamepadHint = safeChat:WaitForChild("GamepadHint")
|
|
|
|
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)</string>
|
|
</Properties>
|
|
<Item class="Sound" referent="147">
|
|
<Properties>
|
|
<string name="Name">Click</string>
|
|
<bool name="archivable">true</bool>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<float name="EmitterSize">10</float>
|
|
<bool name="Looped">false</bool>
|
|
<float name="xmlRead_MaxDistance_3">10000</float>
|
|
<bool name="PlayOnRemove">false</bool>
|
|
<float name="PlaybackSpeed">1</float>
|
|
<bool name="Playing">false</bool>
|
|
<token name="RollOffMode">0</token>
|
|
<Ref name="SoundGroup">null</Ref>
|
|
<Content name="SoundId">
|
|
<url>rbxasset://sounds/switch.mp3</url>
|
|
</Content>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<double name="TimePosition">0</double>
|
|
<float name="Volume">0.5</float>
|
|
<float name="xmlRead_MinDistance_3">10</float>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="Frame" referent="148">
|
|
<Properties>
|
|
<string name="Name">NullSelectionImageObject</string>
|
|
<bool name="Active">false</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<bool name="archivable">true</bool>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">0</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<int name="LayoutOrder">0</int>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">1</int>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="Frame" referent="149">
|
|
<Properties>
|
|
<string name="Name">TempBranch</string>
|
|
<bool name="Active">false</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>0</X>
|
|
<Y>0.5</Y>
|
|
</Vector2>
|
|
<bool name="archivable">true</bool>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">1</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<int name="LayoutOrder">0</int>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>1</XS>
|
|
<XO>5</XO>
|
|
<YS>0.5</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>140</XO>
|
|
<YS>0</YS>
|
|
<YO>24</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<bool name="Visible">false</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
<Item class="UIListLayout" referent="150">
|
|
<Properties>
|
|
<string name="Name">UIListLayout</string>
|
|
<bool name="archivable">true</bool>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<token name="FillDirection">1</token>
|
|
<token name="HorizontalAlignment">1</token>
|
|
<UDim name="Padding">
|
|
<S>0</S>
|
|
<O>5</O>
|
|
</UDim>
|
|
<token name="SortOrder">2</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<token name="VerticalAlignment">0</token>
|
|
</Properties>
|
|
</Item>
|
|
</Item>
|
|
<Item class="TextButton" referent="151">
|
|
<Properties>
|
|
<string name="Name">TempButton</string>
|
|
<bool name="Active">true</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<bool name="archivable">true</bool>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoButtonColor">false</bool>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">0</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.24705879390239716</R>
|
|
<G>0.24705879390239716</G>
|
|
<B>0.24705879390239716</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">1</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">9</token>
|
|
<int name="LayoutOrder">0</int>
|
|
<float name="LineHeight">1</float>
|
|
<bool name="Modal">false</bool>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">true</bool>
|
|
<bool name="Selected">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>140</XO>
|
|
<YS>0</YS>
|
|
<YO>24</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<string name="Text">ROOT</string>
|
|
<Color3 name="TextColor3">
|
|
<R>0</R>
|
|
<G>0</G>
|
|
<B>0</B>
|
|
</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<float name="TextSize">12</float>
|
|
<Color3 name="TextStrokeColor3">
|
|
<R>0</R>
|
|
<G>0</G>
|
|
<B>0</B>
|
|
</Color3>
|
|
<float name="TextStrokeTransparency">0.949999988079071</float>
|
|
<float name="TextTransparency">0.25</float>
|
|
<token name="TextTruncate">0</token>
|
|
<bool name="TextWrapped">false</bool>
|
|
<token name="TextXAlignment">2</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
</Item>
|
|
</Item>
|
|
</Item>
|
|
</Item>
|
|
<Item class="Folder" referent="152">
|
|
<Properties>
|
|
<string name="Name">StarterPlayerScripts</string>
|
|
</Properties>
|
|
<Item class="LocalScript" referent="153">
|
|
<Properties>
|
|
<string name="Name">Animator</string>
|
|
<string name="Source">-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
-- Services
|
|
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
local CollectionService = game:GetService("CollectionService")
|
|
local RunService = game:GetService("RunService")
|
|
|
|
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
-- Animator Data
|
|
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
local Animators = {}
|
|
|
|
local function createAnimator(humanoid)
|
|
local Figure = humanoid.Parent
|
|
local Torso = Figure:WaitForChild("Torso")
|
|
local Climbing = Figure:WaitForChild("Climbing")
|
|
|
|
local animator = {}
|
|
animator.Joints = {}
|
|
|
|
do
|
|
local joints =
|
|
{
|
|
RightShoulder = Torso:WaitForChild("Right Shoulder", 5);
|
|
LeftShoulder = Torso:WaitForChild("Left Shoulder", 5);
|
|
RightHip = Torso:WaitForChild("Right Hip", 5);
|
|
LeftHip = Torso:WaitForChild("Left Hip", 5);
|
|
}
|
|
|
|
if not (joints.RightShoulder and joints.LeftShoulder) then
|
|
return
|
|
end
|
|
|
|
if not (joints.RightHip and joints.LeftHip) then
|
|
return
|
|
end
|
|
|
|
for name, joint in pairs(joints) do
|
|
local object =
|
|
{
|
|
JointObject = joint;
|
|
MaxVelocity = joint.MaxVelocity;
|
|
DesiredAngle = joint.DesiredAngle;
|
|
CurrentAngle = joint.CurrentAngle;
|
|
}
|
|
|
|
animator.Joints[name] = object
|
|
end
|
|
end
|
|
|
|
local joints = animator.Joints
|
|
|
|
local pi = math.pi
|
|
local sin = math.sin
|
|
|
|
local pose = "Standing"
|
|
local toolAnim = "None"
|
|
local toolAnimTime = 0
|
|
|
|
local RightShoulder = joints.RightShoulder
|
|
local LeftShoulder = joints.LeftShoulder
|
|
|
|
local RightHip = joints.RightHip
|
|
local LeftHip = joints.LeftHip
|
|
|
|
function animator:SetMaxVelocities(value)
|
|
RightShoulder.MaxVelocity = value
|
|
LeftShoulder.MaxVelocity = value
|
|
|
|
RightHip.MaxVelocity = value
|
|
LeftHip.MaxVelocity = value
|
|
end
|
|
|
|
function animator:Update()
|
|
local now = tick()
|
|
|
|
if Climbing.Value then
|
|
pose = "Climbing"
|
|
else
|
|
local stateType = humanoid:GetState()
|
|
pose = stateType.Name
|
|
|
|
if pose == "Running" then
|
|
local speed = humanoid.WalkSpeed
|
|
local movement = (Torso.Velocity * Vector3.new(1, 0, 1)).Magnitude
|
|
|
|
if (speed * movement) < 1 then
|
|
pose = "Standing"
|
|
end
|
|
end
|
|
end
|
|
|
|
if pose == "Jumping" then
|
|
self:SetMaxVelocities(.5)
|
|
|
|
RightShoulder.DesiredAngle = 1
|
|
LeftShoulder.DesiredAngle = -1
|
|
|
|
RightHip.DesiredAngle = 0
|
|
LeftHip.DesiredAngle = 0
|
|
elseif pose == "Freefall" then
|
|
self:SetMaxVelocities(.5)
|
|
|
|
RightShoulder.DesiredAngle = pi
|
|
LeftShoulder.DesiredAngle = -pi
|
|
|
|
RightHip.DesiredAngle = 0
|
|
LeftHip.DesiredAngle = 0
|
|
elseif pose == "Seated" then
|
|
self:SetMaxVelocities(.15)
|
|
|
|
RightShoulder.DesiredAngle = pi / 2
|
|
LeftShoulder.DesiredAngle = -pi / 2
|
|
|
|
RightHip.DesiredAngle = pi / 2
|
|
LeftHip.DesiredAngle = -pi / 2
|
|
else
|
|
local climbFudge = 0
|
|
local amplitude = .1
|
|
local frequency = 1
|
|
|
|
if pose == "Running" then
|
|
self:SetMaxVelocities(0.15)
|
|
amplitude = 1
|
|
frequency = 9
|
|
elseif pose == "Climbing" then
|
|
self:SetMaxVelocities(0.5)
|
|
climbFudge = pi
|
|
|
|
amplitude = 1
|
|
frequency = 9
|
|
end
|
|
|
|
local desiredAngle = amplitude * sin(now * frequency)
|
|
|
|
RightShoulder.DesiredAngle = desiredAngle + climbFudge
|
|
LeftShoulder.DesiredAngle = desiredAngle - climbFudge
|
|
|
|
RightHip.DesiredAngle = -desiredAngle
|
|
LeftHip.DesiredAngle = -desiredAngle
|
|
|
|
local tool = Figure:FindFirstChildWhichIsA("Tool")
|
|
|
|
if tool and tool.RequiresHandle and not CollectionService:HasTag(tool, "Flag") then
|
|
local animString = tool:FindFirstChild("toolanim")
|
|
|
|
if animString and animString:IsA("StringValue") then
|
|
-- apply tool animation
|
|
toolAnim = animString.Value
|
|
toolAnimTime = now + .3
|
|
|
|
-- delete event sender
|
|
animString:Destroy()
|
|
end
|
|
|
|
if now > toolAnimTime then
|
|
toolAnimTime = 0
|
|
toolAnim = "None"
|
|
end
|
|
|
|
if toolAnim == "None" then
|
|
RightShoulder.DesiredAngle = pi / 2
|
|
elseif toolAnim == "Slash" then
|
|
RightShoulder.MaxVelocity = 0.5
|
|
RightShoulder.DesiredAngle = 0
|
|
elseif toolAnim == "Lunge" then
|
|
self:SetMaxVelocities(0.5)
|
|
|
|
RightShoulder.DesiredAngle = pi / 2
|
|
RightHip.DesiredAngle = pi / 2
|
|
|
|
LeftShoulder.DesiredAngle = 1
|
|
LeftHip.DesiredAngle = 1
|
|
end
|
|
else
|
|
toolAnim = "None"
|
|
toolAnimTime = 0
|
|
end
|
|
end
|
|
end
|
|
|
|
return animator
|
|
end
|
|
|
|
local function onAnimatorAdded(humanoid)
|
|
if humanoid:IsA("Humanoid") then
|
|
local animator = createAnimator(humanoid)
|
|
Animators[humanoid] = animator
|
|
end
|
|
end
|
|
|
|
local function onAnimatorRemoved(humanoid)
|
|
if Animators[humanoid] then
|
|
Animators[humanoid] = nil
|
|
end
|
|
end
|
|
|
|
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
-- Collection Handler
|
|
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
local animTag = "Animator"
|
|
|
|
local animAdded = CollectionService:GetInstanceAddedSignal(animTag)
|
|
local animRemoved = CollectionService:GetInstanceRemovedSignal(animTag)
|
|
|
|
for _,humanoid in pairs(CollectionService:GetTagged(animTag)) do
|
|
spawn(function ()
|
|
onAnimatorAdded(humanoid)
|
|
end)
|
|
end
|
|
|
|
animAdded:Connect(onAnimatorAdded)
|
|
animRemoved:Connect(onAnimatorRemoved)
|
|
|
|
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
-- Motor Angle Updater
|
|
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
local desiredFPS = 1 / 30 -- The framerate that would be expected given the MaxVelocity in use.
|
|
local lastUpdate = tick()
|
|
|
|
local function updateAnimations(deltaTime)
|
|
local velocityAdjust = (1 / desiredFPS) * deltaTime
|
|
|
|
for humanoid, animator in pairs(Animators) do
|
|
-- Update the motor states
|
|
animator:Update()
|
|
|
|
-- Step the motor angles
|
|
for name, jointData in pairs(animator.Joints) do
|
|
local joint = jointData.JointObject
|
|
local maxVelocity = jointData.MaxVelocity
|
|
|
|
local desiredAngle = jointData.DesiredAngle
|
|
local currentAngle = jointData.CurrentAngle
|
|
|
|
-- Adjust the MaxVelocity based on the current framerate
|
|
maxVelocity = math.abs(maxVelocity * velocityAdjust)
|
|
|
|
-- Update the CurrentAngle
|
|
local delta = (desiredAngle - currentAngle)
|
|
|
|
if math.abs(delta) < maxVelocity then
|
|
currentAngle = desiredAngle
|
|
elseif delta > 0 then
|
|
currentAngle = currentAngle + maxVelocity
|
|
else
|
|
currentAngle = currentAngle - maxVelocity
|
|
end
|
|
|
|
-- Apply the motor transform
|
|
joint.Transform = CFrame.Angles(0, 0, currentAngle)
|
|
jointData.CurrentAngle = currentAngle
|
|
end
|
|
end
|
|
end
|
|
|
|
RunService:BindToRenderStep("UpdateAnimations", 301, updateAnimations)
|
|
|
|
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------</string>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="Folder" referent="154">
|
|
<Properties>
|
|
<string name="Name">Camera</string>
|
|
</Properties>
|
|
<Item class="ModuleScript" referent="155">
|
|
<Properties>
|
|
<string name="Name">Main</string>
|
|
<string name="Source">local Players = game:GetService("Players")
|
|
local UserInputService = game:GetService("UserInputService")
|
|
local StarterGui = game:GetService("StarterGui")
|
|
local GuiService = game:GetService("GuiService")
|
|
local ContextActionService = game:GetService("ContextActionService")
|
|
local TeleportService = game:GetService("TeleportService")
|
|
local Debris = game:GetService("Debris")
|
|
|
|
local LocalPlayer = Players.LocalPlayer
|
|
local PlayerGui = LocalPlayer:WaitForChild("PlayerGui")
|
|
local GameSettings = UserSettings():GetService("UserGameSettings")
|
|
|
|
local math_abs = math.abs
|
|
local math_asin = math.asin
|
|
local math_atan2 = math.atan2
|
|
local math_floor = math.floor
|
|
local math_min = math.min
|
|
local math_max = math.max
|
|
local math_pi = math.pi
|
|
local math_rad = math.rad
|
|
local Vector2_new = Vector2.new
|
|
local Vector3_new = Vector3.new
|
|
local CFrame_Angles = CFrame.Angles
|
|
local CFrame_new = CFrame.new
|
|
|
|
local MIN_Y = math_rad(-80)
|
|
local MAX_Y = math_rad(80)
|
|
|
|
local ZERO_VECTOR2 = Vector2_new()
|
|
local ZERO_VECTOR3 = Vector3_new()
|
|
local UP_VECTOR = Vector3_new(0, 1, 0)
|
|
local XZ_VECTOR = Vector3_new(1, 0, 1)
|
|
|
|
local TOUCH_SENSITIVTY = Vector2_new(math_pi*2.25, math_pi*2)
|
|
local MOUSE_SENSITIVITY = Vector2_new(math_pi*4, math_pi*1.9)
|
|
|
|
local THUMBSTICK_DEADZONE = 0.2
|
|
local DEADZONE = 0.1
|
|
local ZOOM_FACTOR = 0.25
|
|
|
|
local humanoid
|
|
|
|
local function findPlayerHumanoid(player)
|
|
local character = player and player.Character
|
|
if character then
|
|
if not (humanoid and humanoid.Parent == character) then
|
|
humanoid = character:FindFirstChildOfClass("Humanoid")
|
|
end
|
|
end
|
|
return humanoid
|
|
end
|
|
|
|
local function clamp(low, high, num)
|
|
return (num > high and high or num < low and low or num)
|
|
end
|
|
|
|
local function findAngleBetweenXZVectors(vec2, vec1)
|
|
return math_atan2(vec1.X*vec2.Z-vec1.Z*vec2.X, vec1.X*vec2.X + vec1.Z*vec2.Z)
|
|
end
|
|
|
|
local function IsFinite(num)
|
|
return num == num and num ~= 1/0 and num ~= -1/0
|
|
end
|
|
|
|
local function SCurveTranform(t)
|
|
t = clamp(-1,1,t)
|
|
if t >= 0 then
|
|
return (.35*t) / (.35 - t + 1)
|
|
end
|
|
return -((.8*-t) / (.8 + t + 1))
|
|
end
|
|
|
|
local function toSCurveSpace(t)
|
|
return (1 + DEADZONE) * (2*math.abs(t) - 1) - DEADZONE
|
|
end
|
|
|
|
local function fromSCurveSpace(t)
|
|
return t/2 + 0.5
|
|
end
|
|
|
|
local function gamepadLinearToCurve(thumbstickPosition)
|
|
local function onAxis(axisValue)
|
|
local sign = 1
|
|
if axisValue < 0 then
|
|
sign = -1
|
|
end
|
|
local point = fromSCurveSpace(SCurveTranform(toSCurveSpace(math_abs(axisValue))))
|
|
point = point * sign
|
|
return clamp(-1, 1, point)
|
|
end
|
|
return Vector2_new(onAxis(thumbstickPosition.x), onAxis(thumbstickPosition.y))
|
|
end
|
|
|
|
-- Reset the camera look vector when the camera is enabled for the first time
|
|
local SetCameraOnSpawn = true
|
|
local this = {}
|
|
|
|
local isFirstPerson = false
|
|
local isRightMouseDown = false
|
|
local isMiddleMouseDown = false
|
|
|
|
this.Enabled = false
|
|
this.RotateInput = ZERO_VECTOR2
|
|
this.DefaultZoom = 10
|
|
this.activeGamepad = nil
|
|
this.PartSubjectHack = nil
|
|
|
|
function this:GetHumanoid()
|
|
local player = Players.LocalPlayer
|
|
return findPlayerHumanoid(player)
|
|
end
|
|
|
|
function this:GetHumanoidRootPart()
|
|
local humanoid = this:GetHumanoid()
|
|
return humanoid and humanoid.Torso
|
|
end
|
|
|
|
function this:GetSubjectPosition()
|
|
local camera = workspace.CurrentCamera
|
|
local result = camera.Focus.p
|
|
|
|
local cameraSubject = camera and camera.CameraSubject
|
|
if cameraSubject then
|
|
if cameraSubject:IsA("Humanoid") then
|
|
local char = cameraSubject.Parent
|
|
if char then
|
|
local head = char:FindFirstChild("Head")
|
|
if head and head:IsA("BasePart") then
|
|
result = head.Position
|
|
end
|
|
end
|
|
if this.PartSubjectHack then
|
|
this:ZoomCamera(this.PartSubjectHack)
|
|
this.PartSubjectHack = nil
|
|
this:UpdateMouseBehavior()
|
|
end
|
|
elseif cameraSubject:IsA("BasePart") then
|
|
result = cameraSubject.Position
|
|
if not this.PartSubjectHack then
|
|
this.PartSubjectHack = this:GetCameraZoom()
|
|
this:ZoomCamera(10)
|
|
this:UpdateMouseBehavior()
|
|
end
|
|
end
|
|
end
|
|
|
|
return result
|
|
end
|
|
|
|
function this:GetCameraLook()
|
|
return workspace.CurrentCamera and workspace.CurrentCamera.CFrame.lookVector or Vector3.new(0,0,1)
|
|
end
|
|
|
|
function this:GetCameraZoom()
|
|
if this.currentZoom == nil then
|
|
local player = Players.LocalPlayer
|
|
this.currentZoom = player and clamp(player.CameraMinZoomDistance, player.CameraMaxZoomDistance, this.DefaultZoom) or this.DefaultZoom
|
|
end
|
|
return this.currentZoom
|
|
end
|
|
|
|
function this:GetCameraActualZoom()
|
|
local camera = workspace.CurrentCamera
|
|
if camera then
|
|
return (camera.CFrame.p - camera.Focus.p).Magnitude
|
|
end
|
|
end
|
|
|
|
function this:ViewSizeX()
|
|
local result = 1024
|
|
local camera = workspace.CurrentCamera
|
|
if camera then
|
|
result = camera.ViewportSize.X
|
|
end
|
|
return result
|
|
end
|
|
|
|
function this:ViewSizeY()
|
|
local result = 768
|
|
local camera = workspace.CurrentCamera
|
|
if camera then
|
|
result = camera.ViewportSize.Y
|
|
end
|
|
return result
|
|
end
|
|
|
|
function this:ScreenTranslationToAngle(translationVector)
|
|
local screenX = this:ViewSizeX()
|
|
local screenY = this:ViewSizeY()
|
|
local xTheta = (translationVector.x / screenX)
|
|
local yTheta = (translationVector.y / screenY)
|
|
return Vector2_new(xTheta, yTheta)
|
|
end
|
|
|
|
function this:MouseTranslationToAngle(translationVector)
|
|
local xTheta = (translationVector.x / 1920)
|
|
local yTheta = (translationVector.y / 1200)
|
|
return Vector2_new(xTheta, yTheta)
|
|
end
|
|
|
|
function this:RotateVector(startVector, xyRotateVector)
|
|
local startCFrame = CFrame_new(ZERO_VECTOR3, startVector)
|
|
local resultLookVector = (CFrame_Angles(0, -xyRotateVector.x, 0) * startCFrame * CFrame_Angles(-xyRotateVector.y,0,0)).lookVector
|
|
return resultLookVector, Vector2_new(xyRotateVector.x, xyRotateVector.y)
|
|
end
|
|
|
|
function this:RotateCamera(startLook, xyRotateVector)
|
|
local startVertical = math_asin(startLook.y)
|
|
local yTheta = clamp(-MAX_Y + startVertical, -MIN_Y + startVertical, xyRotateVector.y)
|
|
return self:RotateVector(startLook, Vector2_new(xyRotateVector.x, yTheta))
|
|
end
|
|
|
|
function this:IsInFirstPerson()
|
|
return isFirstPerson
|
|
end
|
|
|
|
function this:UpdateMouseBehavior()
|
|
if isFirstPerson or this.PartSubjectHack then
|
|
GameSettings.RotationType = Enum.RotationType.CameraRelative
|
|
UserInputService.MouseBehavior = Enum.MouseBehavior.LockCenter
|
|
else
|
|
GameSettings.RotationType = Enum.RotationType.MovementRelative
|
|
if isRightMouseDown or isMiddleMouseDown then
|
|
UserInputService.MouseBehavior = Enum.MouseBehavior.LockCurrentPosition
|
|
else
|
|
UserInputService.MouseBehavior = Enum.MouseBehavior.Default
|
|
end
|
|
end
|
|
end
|
|
|
|
function this:PlayTick()
|
|
local now = tick()
|
|
local lastTickSound = this.LastTickSound
|
|
if not lastTickSound then
|
|
lastTickSound = 0
|
|
end
|
|
|
|
if (now - lastTickSound) > .03 then
|
|
local s = Instance.new("Sound")
|
|
s.SoundId = "rbxasset://sounds/switch3.wav"
|
|
s.Parent = script
|
|
s:Play()
|
|
Debris:AddItem(s,1)
|
|
this.LastTickSound = now
|
|
end
|
|
end
|
|
|
|
function this:ZoomCamera(desiredZoom)
|
|
this.currentZoom = clamp(0.25, 400, desiredZoom)
|
|
isFirstPerson = self:GetCameraZoom() < 1.5
|
|
|
|
-- set mouse behavior
|
|
self:UpdateMouseBehavior()
|
|
return self:GetCameraZoom()
|
|
end
|
|
|
|
function this:ZoomCameraBy(input)
|
|
if TeleportService:GetTeleportSetting("FPSCapTo30") then
|
|
input = input * 1.5
|
|
end
|
|
|
|
local zoom = this:GetCameraActualZoom()
|
|
if zoom then
|
|
if input > 0 then
|
|
zoom = math.max( 1, zoom / (1 + ZOOM_FACTOR*input))
|
|
elseif input < 0 then
|
|
zoom = math.min(5000, zoom * (1 - ZOOM_FACTOR*input))
|
|
end
|
|
self:ZoomCamera(zoom)
|
|
end
|
|
|
|
self:PlayTick()
|
|
return self:GetCameraZoom()
|
|
end
|
|
|
|
function this:ZoomCameraFixedBy(zoomIncrement)
|
|
return self:ZoomCamera(self:GetCameraZoom() + zoomIncrement)
|
|
end
|
|
|
|
------------------------
|
|
---- Input Events ----
|
|
------------------------
|
|
|
|
do
|
|
local startPos = nil
|
|
local lastPos = nil
|
|
local panBeginLook = nil
|
|
local lastTapTime = nil
|
|
|
|
local fingerTouches = {}
|
|
local NumUnsunkTouches = 0
|
|
|
|
local inputStartPositions = {}
|
|
local inputStartTimes = {}
|
|
|
|
local StartingDiff = nil
|
|
local pinchBeginZoom = nil
|
|
|
|
local dynamicThumbstickFrame = nil
|
|
local flaggedDynamic = {}
|
|
|
|
local function getDynamicThumbstickFrame()
|
|
if dynamicThumbstickFrame and dynamicThumbstickFrame:IsDescendantOf(game) then
|
|
return dynamicThumbstickFrame
|
|
else
|
|
local touchGui = PlayerGui:FindFirstChild("TouchGui")
|
|
if not touchGui then return nil end
|
|
|
|
local touchControlFrame = touchGui:FindFirstChild("TouchControlFrame")
|
|
if not touchControlFrame then return nil end
|
|
|
|
dynamicThumbstickFrame = touchControlFrame:FindFirstChild("DynamicThumbstickFrame")
|
|
return dynamicThumbstickFrame
|
|
end
|
|
end
|
|
|
|
this.ZoomEnabled = true
|
|
this.PanEnabled = true
|
|
this.KeyPanEnabled = true
|
|
|
|
local function inputIsDynamic(input)
|
|
if flaggedDynamic[input] ~= nil then
|
|
return flaggedDynamic[input]
|
|
end
|
|
|
|
if GameSettings.TouchMovementMode ~= Enum.TouchMovementMode.DynamicThumbstick then
|
|
return false
|
|
end
|
|
|
|
local df = getDynamicThumbstickFrame()
|
|
if not df then return end
|
|
|
|
local pos = input.Position
|
|
local p0 = df.AbsolutePosition
|
|
local p1 = p0 + df.AbsoluteSize
|
|
|
|
if p0.X <= pos.X and p0.Y <= pos.Y then
|
|
if pos.X <= p1.X and pos.Y <= p1.Y then
|
|
flaggedDynamic[input] = true
|
|
return true
|
|
end
|
|
end
|
|
|
|
flaggedDynamic[input] = false
|
|
return false
|
|
end
|
|
|
|
local function OnTouchBegan(input, processed)
|
|
if not inputIsDynamic(input) then
|
|
fingerTouches[input] = processed
|
|
if not processed then
|
|
|
|
inputStartPositions[input] = input.Position
|
|
inputStartTimes[input] = tick()
|
|
NumUnsunkTouches = NumUnsunkTouches + 1
|
|
end
|
|
end
|
|
end
|
|
|
|
local function OnTouchChanged(input, processed)
|
|
if inputIsDynamic(input) then
|
|
return
|
|
end
|
|
|
|
if fingerTouches[input] == nil then
|
|
fingerTouches[input] = processed
|
|
if not processed then
|
|
NumUnsunkTouches = NumUnsunkTouches + 1
|
|
end
|
|
end
|
|
|
|
if NumUnsunkTouches == 1 then
|
|
if fingerTouches[input] == false then
|
|
panBeginLook = panBeginLook or this:GetCameraLook()
|
|
startPos = startPos or input.Position
|
|
lastPos = lastPos or startPos
|
|
this.UserPanningTheCamera = true
|
|
|
|
local delta = input.Position - lastPos
|
|
|
|
delta = Vector2.new(delta.X, delta.Y * GameSettings:GetCameraYInvertValue())
|
|
|
|
if this.PanEnabled then
|
|
local desiredXYVector = this:ScreenTranslationToAngle(delta) * TOUCH_SENSITIVTY
|
|
this.RotateInput = this.RotateInput + desiredXYVector
|
|
end
|
|
|
|
lastPos = input.Position
|
|
end
|
|
else
|
|
panBeginLook = nil
|
|
startPos = nil
|
|
lastPos = nil
|
|
this.UserPanningTheCamera = false
|
|
end
|
|
|
|
if NumUnsunkTouches == 2 then
|
|
local unsunkTouches = {}
|
|
for touch, wasSunk in pairs(fingerTouches) do
|
|
if not wasSunk then
|
|
table.insert(unsunkTouches, touch)
|
|
end
|
|
end
|
|
if #unsunkTouches == 2 then
|
|
local difference = (unsunkTouches[1].Position - unsunkTouches[2].Position).magnitude
|
|
if StartingDiff and pinchBeginZoom then
|
|
local scale = difference / math_max(0.01, StartingDiff)
|
|
local clampedScale = clamp(0.1, 10, scale)
|
|
if this.ZoomEnabled then
|
|
this:ZoomCamera(pinchBeginZoom / clampedScale)
|
|
this:PlayTick()
|
|
end
|
|
else
|
|
StartingDiff = difference
|
|
pinchBeginZoom = this:GetCameraActualZoom()
|
|
end
|
|
end
|
|
else
|
|
StartingDiff = nil
|
|
pinchBeginZoom = nil
|
|
end
|
|
end
|
|
|
|
local function calcLookBehindRotateInput(torso)
|
|
if torso then
|
|
local newDesiredLook = (torso.CFrame.lookVector - Vector3.new(0,0.23,0)).unit
|
|
local horizontalShift = findAngleBetweenXZVectors(newDesiredLook, this:GetCameraLook())
|
|
local vertShift = math_asin(this:GetCameraLook().y) - math_asin(newDesiredLook.y)
|
|
if not IsFinite(horizontalShift) then
|
|
horizontalShift = 0
|
|
end
|
|
if not IsFinite(vertShift) then
|
|
vertShift = 0
|
|
end
|
|
|
|
return Vector2.new(horizontalShift, vertShift)
|
|
end
|
|
return nil
|
|
end
|
|
|
|
local function OnTouchEnded(input, processed)
|
|
if fingerTouches[input] == false then
|
|
if NumUnsunkTouches == 1 then
|
|
panBeginLook = nil
|
|
startPos = nil
|
|
lastPos = nil
|
|
elseif NumUnsunkTouches == 2 then
|
|
StartingDiff = nil
|
|
pinchBeginZoom = nil
|
|
end
|
|
end
|
|
|
|
if fingerTouches[input] ~= nil and fingerTouches[input] == false then
|
|
NumUnsunkTouches = NumUnsunkTouches - 1
|
|
end
|
|
fingerTouches[input] = nil
|
|
inputStartPositions[input] = nil
|
|
inputStartTimes[input] = nil
|
|
flaggedDynamic[input] = nil
|
|
end
|
|
|
|
local function OnMousePanButtonPressed(input, processed)
|
|
if processed then return end
|
|
this:UpdateMouseBehavior()
|
|
panBeginLook = panBeginLook or this:GetCameraLook()
|
|
startPos = startPos or input.Position
|
|
lastPos = lastPos or startPos
|
|
this.UserPanningTheCamera = true
|
|
end
|
|
|
|
local function OnMousePanButtonReleased(input, processed)
|
|
this:UpdateMouseBehavior()
|
|
if not (isRightMouseDown or isMiddleMouseDown) then
|
|
panBeginLook = nil
|
|
startPos = nil
|
|
lastPos = nil
|
|
this.UserPanningTheCamera = false
|
|
end
|
|
end
|
|
|
|
local function OnMouse2Down(input, processed)
|
|
if processed then return end
|
|
|
|
isRightMouseDown = true
|
|
OnMousePanButtonPressed(input, processed)
|
|
end
|
|
|
|
local function OnMouse2Up(input, processed)
|
|
isRightMouseDown = false
|
|
OnMousePanButtonReleased(input, processed)
|
|
end
|
|
|
|
local function OnMouse3Down(input, processed)
|
|
if processed then return end
|
|
|
|
isMiddleMouseDown = true
|
|
OnMousePanButtonPressed(input, processed)
|
|
end
|
|
|
|
local function OnMouse3Up(input, processed)
|
|
isMiddleMouseDown = false
|
|
OnMousePanButtonReleased(input, processed)
|
|
end
|
|
|
|
local function OnMouseMoved(input, processed)
|
|
|
|
local inputDelta = input.Delta
|
|
inputDelta = Vector2.new(inputDelta.X, inputDelta.Y * GameSettings:GetCameraYInvertValue())
|
|
|
|
if startPos and lastPos and panBeginLook then
|
|
local currPos = lastPos + input.Delta
|
|
local totalTrans = currPos - startPos
|
|
if this.PanEnabled then
|
|
local desiredXYVector = this:MouseTranslationToAngle(inputDelta) * MOUSE_SENSITIVITY
|
|
this.RotateInput = this.RotateInput + desiredXYVector
|
|
end
|
|
lastPos = currPos
|
|
elseif (this:IsInFirstPerson() or this.PartSubjectHack) and this.PanEnabled then
|
|
local desiredXYVector = this:MouseTranslationToAngle(inputDelta) * MOUSE_SENSITIVITY
|
|
this.RotateInput = this.RotateInput + desiredXYVector
|
|
end
|
|
end
|
|
|
|
local function OnMouseWheel(input, processed)
|
|
if not processed then
|
|
if this.ZoomEnabled then
|
|
this:ZoomCameraBy(clamp(-1, 1, input.Position.Z))
|
|
end
|
|
end
|
|
end
|
|
|
|
local function round(num)
|
|
return math_floor(num + 0.5)
|
|
end
|
|
|
|
local eight2Pi = math_pi / 4
|
|
|
|
local function rotateVectorByAngleAndRound(camLook, rotateAngle, roundAmount)
|
|
if camLook ~= ZERO_VECTOR3 then
|
|
camLook = camLook.unit
|
|
local currAngle = math_atan2(camLook.z, camLook.x)
|
|
local newAngle = round((math_atan2(camLook.z, camLook.x) + rotateAngle) / roundAmount) * roundAmount
|
|
return newAngle - currAngle
|
|
end
|
|
return 0
|
|
end
|
|
|
|
local function OnKeyDown(input, processed)
|
|
if processed then return end
|
|
if this.ZoomEnabled then
|
|
if input.KeyCode == Enum.KeyCode.I then
|
|
this:ZoomCameraBy(1)
|
|
elseif input.KeyCode == Enum.KeyCode.O then
|
|
this:ZoomCameraBy(-1)
|
|
end
|
|
end
|
|
if panBeginLook == nil and this.KeyPanEnabled then
|
|
if input.KeyCode == Enum.KeyCode.Left then
|
|
this.TurningLeft = true
|
|
elseif input.KeyCode == Enum.KeyCode.Right then
|
|
this.TurningRight = true
|
|
elseif input.KeyCode == Enum.KeyCode.Comma then
|
|
local angle = rotateVectorByAngleAndRound(this:GetCameraLook() * Vector3.new(1,0,1), -eight2Pi * (3/4), eight2Pi)
|
|
if angle ~= 0 then
|
|
this.RotateInput = this.RotateInput + Vector2.new(angle, 0)
|
|
this.LastUserPanCamera = tick()
|
|
this.LastCameraTransform = nil
|
|
end
|
|
this:PlayTick()
|
|
elseif input.KeyCode == Enum.KeyCode.Period then
|
|
local angle = rotateVectorByAngleAndRound(this:GetCameraLook() * Vector3.new(1,0,1), eight2Pi * (3/4), eight2Pi)
|
|
if angle ~= 0 then
|
|
this.RotateInput = this.RotateInput + Vector2.new(angle, 0)
|
|
this.LastUserPanCamera = tick()
|
|
this.LastCameraTransform = nil
|
|
end
|
|
this:PlayTick()
|
|
elseif input.KeyCode == Enum.KeyCode.PageUp then
|
|
this.RotateInput = this.RotateInput + Vector2.new(0,math_pi/12)
|
|
this.LastCameraTransform = nil
|
|
this:PlayTick()
|
|
elseif input.KeyCode == Enum.KeyCode.PageDown then
|
|
this.RotateInput = this.RotateInput + Vector2.new(0,-math_pi/12)
|
|
this.LastCameraTransform = nil
|
|
this:PlayTick()
|
|
end
|
|
end
|
|
end
|
|
|
|
local function OnKeyUp(input, processed)
|
|
if input.KeyCode == Enum.KeyCode.Left then
|
|
this.TurningLeft = false
|
|
elseif input.KeyCode == Enum.KeyCode.Right then
|
|
this.TurningRight = false
|
|
end
|
|
end
|
|
|
|
local lastThumbstickRotate = nil
|
|
local numOfSeconds = 0.7
|
|
local currentSpeed = 0
|
|
local maxSpeed = 6
|
|
local lastThumbstickPos = Vector2.new(0,0)
|
|
local ySensitivity = 0.65
|
|
local lastVelocity = nil
|
|
|
|
function this:UpdateGamepad()
|
|
local gamepadPan = this.GamepadPanningCamera
|
|
if gamepadPan then
|
|
gamepadPan = gamepadLinearToCurve(gamepadPan)
|
|
local currentTime = tick()
|
|
if gamepadPan.X ~= 0 or gamepadPan.Y ~= 0 then
|
|
this.userPanningTheCamera = true
|
|
elseif gamepadPan == ZERO_VECTOR2 then
|
|
lastThumbstickRotate = nil
|
|
if lastThumbstickPos == ZERO_VECTOR2 then
|
|
currentSpeed = 0
|
|
end
|
|
end
|
|
|
|
local finalConstant = 0
|
|
|
|
if lastThumbstickRotate then
|
|
local elapsed = (currentTime - lastThumbstickRotate) * 10
|
|
currentSpeed = currentSpeed + (maxSpeed * ((elapsed*elapsed)/numOfSeconds))
|
|
|
|
if currentSpeed > maxSpeed then currentSpeed = maxSpeed end
|
|
|
|
if lastVelocity then
|
|
local velocity = (gamepadPan - lastThumbstickPos)/(currentTime - lastThumbstickRotate)
|
|
local velocityDeltaMag = (velocity - lastVelocity).magnitude
|
|
|
|
if velocityDeltaMag > 12 then
|
|
currentSpeed = currentSpeed * (20/velocityDeltaMag)
|
|
if currentSpeed > maxSpeed then currentSpeed = maxSpeed end
|
|
end
|
|
end
|
|
|
|
local gamepadCameraSensitivity = GameSettings.GamepadCameraSensitivity
|
|
finalConstant = (gamepadCameraSensitivity * currentSpeed)
|
|
lastVelocity = (gamepadPan - lastThumbstickPos)/(currentTime - lastThumbstickRotate)
|
|
end
|
|
|
|
lastThumbstickPos = gamepadPan
|
|
lastThumbstickRotate = currentTime
|
|
|
|
return Vector2_new( gamepadPan.X * finalConstant, gamepadPan.Y * finalConstant * ySensitivity * GameSettings:GetCameraYInvertValue())
|
|
end
|
|
|
|
return ZERO_VECTOR2
|
|
end
|
|
|
|
local InputEvents = {}
|
|
|
|
function this:DisconnectInputEvents()
|
|
-- Disconnect all input events.
|
|
while true do
|
|
local signalName = next(InputEvents)
|
|
if signalName then
|
|
InputEvents[signalName]:Disconnect()
|
|
InputEvents[signalName] = nil
|
|
else
|
|
break
|
|
end
|
|
end
|
|
|
|
this.TurningLeft = false
|
|
this.TurningRight = false
|
|
this.LastCameraTransform = nil
|
|
this.UserPanningTheCamera = false
|
|
this.RotateInput = ZERO_VECTOR2
|
|
this.GamepadPanningCamera = ZERO_VECTOR2
|
|
|
|
-- Reset input states
|
|
startPos = nil
|
|
lastPos = nil
|
|
panBeginLook = nil
|
|
isRightMouseDown = false
|
|
isMiddleMouseDown = false
|
|
|
|
fingerTouches = {}
|
|
NumUnsunkTouches = 0
|
|
|
|
StartingDiff = nil
|
|
pinchBeginZoom = nil
|
|
|
|
-- Unlock mouse for example if right mouse button was being held down
|
|
if UserInputService.MouseBehavior ~= Enum.MouseBehavior.LockCenter then
|
|
UserInputService.MouseBehavior = Enum.MouseBehavior.Default
|
|
end
|
|
end
|
|
|
|
local function resetInputStates()
|
|
isRightMouseDown = false
|
|
isMiddleMouseDown = false
|
|
OnMousePanButtonReleased() -- this function doesn't seem to actually need parameters
|
|
|
|
if UserInputService.TouchEnabled then
|
|
--[[menu opening was causing serious touch issues
|
|
this should disable all active touch events if
|
|
they're active when menu opens.]]
|
|
for inputObject, value in pairs(fingerTouches) do
|
|
fingerTouches[inputObject] = nil
|
|
end
|
|
panBeginLook = nil
|
|
startPos = nil
|
|
lastPos = nil
|
|
this.UserPanningTheCamera = false
|
|
StartingDiff = nil
|
|
pinchBeginZoom = nil
|
|
NumUnsunkTouches = 0
|
|
end
|
|
end
|
|
|
|
local function getGamepadPan(name, state, input)
|
|
if input.UserInputType == this.activeGamepad and input.KeyCode == Enum.KeyCode.Thumbstick2 then
|
|
|
|
if state == Enum.UserInputState.Cancel then
|
|
this.GamepadPanningCamera = ZERO_VECTOR2
|
|
return
|
|
end
|
|
|
|
local inputVector = Vector2.new(input.Position.X, -input.Position.Y)
|
|
if inputVector.magnitude > THUMBSTICK_DEADZONE then
|
|
this.GamepadPanningCamera = Vector2_new(input.Position.X, -input.Position.Y)
|
|
else
|
|
this.GamepadPanningCamera = ZERO_VECTOR2
|
|
end
|
|
end
|
|
end
|
|
|
|
local function doGamepadZoom(name, state, input)
|
|
if input.UserInputType == this.activeGamepad and input.KeyCode == Enum.KeyCode.ButtonR3 and state == Enum.UserInputState.Begin then
|
|
if this.ZoomEnabled then
|
|
if this:GetCameraZoom() > 0.5 then
|
|
this:ZoomCamera(0)
|
|
else
|
|
this:ZoomCamera(10)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
local function assignActivateGamepad()
|
|
local connectedGamepads = UserInputService:GetConnectedGamepads()
|
|
if #connectedGamepads > 0 then
|
|
for i = 1, #connectedGamepads do
|
|
if this.activeGamepad == nil then
|
|
this.activeGamepad = connectedGamepads[i]
|
|
elseif connectedGamepads[i].Value < this.activeGamepad.Value then
|
|
this.activeGamepad = connectedGamepads[i]
|
|
end
|
|
end
|
|
end
|
|
|
|
if this.activeGamepad == nil then -- nothing is connected, at least set up for gamepad1
|
|
this.activeGamepad = Enum.UserInputType.Gamepad1
|
|
end
|
|
end
|
|
|
|
local function onInputBegan(input, processed)
|
|
if input.UserInputType == Enum.UserInputType.Touch then
|
|
OnTouchBegan(input, processed)
|
|
elseif input.UserInputType == Enum.UserInputType.MouseButton2 then
|
|
OnMouse2Down(input, processed)
|
|
elseif input.UserInputType == Enum.UserInputType.MouseButton3 then
|
|
OnMouse3Down(input, processed)
|
|
end
|
|
-- Keyboard
|
|
if input.UserInputType == Enum.UserInputType.Keyboard then
|
|
OnKeyDown(input, processed)
|
|
end
|
|
end
|
|
|
|
local function onInputChanged(input, processed)
|
|
if input.UserInputType == Enum.UserInputType.Touch then
|
|
OnTouchChanged(input, processed)
|
|
elseif input.UserInputType == Enum.UserInputType.MouseMovement then
|
|
OnMouseMoved(input, processed)
|
|
elseif input.UserInputType == Enum.UserInputType.MouseWheel then
|
|
OnMouseWheel(input, processed)
|
|
end
|
|
end
|
|
|
|
local function onInputEnded(input, processed)
|
|
if input.UserInputType == Enum.UserInputType.Touch then
|
|
OnTouchEnded(input, processed)
|
|
elseif input.UserInputType == Enum.UserInputType.MouseButton2 then
|
|
OnMouse2Up(input, processed)
|
|
elseif input.UserInputType == Enum.UserInputType.MouseButton3 then
|
|
OnMouse3Up(input, processed)
|
|
end
|
|
-- Keyboard
|
|
if input.UserInputType == Enum.UserInputType.Keyboard then
|
|
OnKeyUp(input, processed)
|
|
end
|
|
end
|
|
|
|
local inputPassCmds =
|
|
{
|
|
ZoomIn = Enum.KeyCode.I;
|
|
ZoomOut = Enum.KeyCode.O;
|
|
RotateUp = Enum.KeyCode.PageUp;
|
|
RotateDown = Enum.KeyCode.PageDown;
|
|
}
|
|
|
|
local function onInputPassed(command)
|
|
local passKey = inputPassCmds[command]
|
|
if passKey then
|
|
OnKeyDown({KeyCode = passKey}, false)
|
|
end
|
|
end
|
|
|
|
local function onGamepadConnected(gamepadEnum)
|
|
if this.activeGamepad == nil then
|
|
assignActivateGamepad()
|
|
end
|
|
end
|
|
|
|
local function onGamepadDisconnected(gamepadEnum)
|
|
if this.activeGamepad ~= gamepadEnum then return end
|
|
this.activeGamepad = nil
|
|
assignActivateGamepad()
|
|
end
|
|
|
|
function this:ConnectInputEvents()
|
|
local player = Players.LocalPlayer
|
|
local playerScripts = player:WaitForChild("PlayerScripts")
|
|
local passCameraEvent = playerScripts:WaitForChild("PassCameraEvent")
|
|
|
|
this.RotateInput = ZERO_VECTOR2
|
|
this.activeGamepad = nil
|
|
|
|
InputEvents =
|
|
{
|
|
InputBegan = UserInputService.InputBegan:Connect(onInputBegan);
|
|
InputChanged = UserInputService.InputChanged:Connect(onInputChanged);
|
|
InputEnded = UserInputService.InputEnded:Connect(onInputEnded);
|
|
MenuOpened = GuiService.MenuOpened:Connect(resetInputStates);
|
|
MenuOpenedConn = GuiService.MenuOpened:Connect(resetInputStates);
|
|
GamepadConnected = UserInputService.GamepadConnected:Connect(onGamepadConnected);
|
|
GamepadDisconnected = UserInputService.GamepadDisconnected:Connect(onGamepadDisconnected);
|
|
InputPassed = passCameraEvent.Event:Connect(onInputPassed);
|
|
}
|
|
|
|
ContextActionService:BindAction("RootCamGamepadPan", getGamepadPan, false, Enum.KeyCode.Thumbstick2)
|
|
ContextActionService:BindAction("RootCamGamepadZoom", doGamepadZoom, false, Enum.KeyCode.ButtonR3)
|
|
|
|
assignActivateGamepad()
|
|
|
|
-- set mouse behavior
|
|
self:UpdateMouseBehavior()
|
|
end
|
|
|
|
function this:SetEnabled(newState)
|
|
if newState ~= self.Enabled then
|
|
self.Enabled = newState
|
|
if self.Enabled then
|
|
self:ConnectInputEvents()
|
|
else
|
|
self:DisconnectInputEvents()
|
|
end
|
|
end
|
|
end
|
|
|
|
local function OnPlayerAdded(player)
|
|
player.Changed:Connect(function (prop)
|
|
if this.Enabled then
|
|
if prop == "CameraMode" or prop == "CameraMaxZoomDistance" or prop == "CameraMinZoomDistance" then
|
|
this:ZoomCameraFixedBy(0)
|
|
end
|
|
end
|
|
end)
|
|
|
|
local function OnCharacterAdded(newCharacter)
|
|
local humanoid = findPlayerHumanoid(player)
|
|
local start = tick()
|
|
while tick() - start < 0.3 and (humanoid == nil or humanoid.Torso == nil) do
|
|
wait()
|
|
humanoid = findPlayerHumanoid(player)
|
|
end
|
|
|
|
if humanoid and humanoid.Torso and player.Character == newCharacter then
|
|
local newDesiredLook = (humanoid.Torso.CFrame.lookVector - Vector3.new(0,0.23,0)).unit
|
|
local horizontalShift = findAngleBetweenXZVectors(newDesiredLook, this:GetCameraLook())
|
|
local vertShift = math_asin(this:GetCameraLook().y) - math_asin(newDesiredLook.y)
|
|
if not IsFinite(horizontalShift) then
|
|
horizontalShift = 0
|
|
end
|
|
if not IsFinite(vertShift) then
|
|
vertShift = 0
|
|
end
|
|
this.RotateInput = Vector2.new(horizontalShift, vertShift)
|
|
|
|
-- reset old camera info so follow cam doesn't rotate us
|
|
this.LastCameraTransform = nil
|
|
end
|
|
|
|
-- Need to wait for camera cframe to update before we zoom in
|
|
-- Not waiting will force camera to original cframe
|
|
wait()
|
|
this:ZoomCamera(this.DefaultZoom)
|
|
end
|
|
|
|
player.CharacterAdded:Connect(function (character)
|
|
if this.Enabled or SetCameraOnSpawn then
|
|
OnCharacterAdded(character)
|
|
SetCameraOnSpawn = false
|
|
end
|
|
end)
|
|
|
|
if player.Character then
|
|
spawn(function () OnCharacterAdded(player.Character) end)
|
|
end
|
|
end
|
|
|
|
if Players.LocalPlayer then
|
|
OnPlayerAdded(Players.LocalPlayer)
|
|
end
|
|
|
|
Players.ChildAdded:Connect(function (child)
|
|
if child and Players.LocalPlayer == child then
|
|
OnPlayerAdded(Players.LocalPlayer)
|
|
end
|
|
end)
|
|
|
|
end
|
|
|
|
------------------------
|
|
---- Main Updater ----
|
|
------------------------
|
|
|
|
do
|
|
local tweenAcceleration = math_rad(220)
|
|
local tweenSpeed = math_rad(0)
|
|
local tweenMaxSpeed = math_rad(250)
|
|
local timeBeforeAutoRotate = 2
|
|
|
|
local lastUpdate = tick()
|
|
this.LastUserPanCamera = lastUpdate
|
|
|
|
|
|
function this:Update()
|
|
local now = tick()
|
|
local timeDelta = (now - lastUpdate)
|
|
|
|
local userPanningTheCamera = (self.UserPanningTheCamera == true)
|
|
local camera = workspace.CurrentCamera
|
|
local humanoid = self:GetHumanoid()
|
|
local cameraSubject = camera and camera.CameraSubject
|
|
local isInVehicle = cameraSubject and cameraSubject:IsA('VehicleSeat')
|
|
local isOnASkateboard = cameraSubject and cameraSubject:IsA('SkateboardPlatform')
|
|
|
|
if isInVehicle and cameraSubject.Occupant == humanoid then
|
|
cameraSubject = humanoid
|
|
camera.CameraSubject = humanoid
|
|
isInVehicle = false
|
|
end
|
|
|
|
if lastUpdate == nil or (now - lastUpdate) > 1 then
|
|
self.LastCameraTransform = nil
|
|
end
|
|
|
|
if lastUpdate then
|
|
local gamepadRotation = self:UpdateGamepad()
|
|
|
|
-- Cap out the delta to 0.1 so we don't get some crazy things when we re-resume from
|
|
local delta = math_min(0.1, now - lastUpdate)
|
|
|
|
if gamepadRotation ~= ZERO_VECTOR2 then
|
|
userPanningTheCamera = true
|
|
self.RotateInput = self.RotateInput + (gamepadRotation * delta)
|
|
end
|
|
|
|
local angle = 0
|
|
if not (isInVehicle or isOnASkateboard) then
|
|
angle = angle + (self.TurningLeft and -120 or 0)
|
|
angle = angle + (self.TurningRight and 120 or 0)
|
|
end
|
|
|
|
if angle ~= 0 then
|
|
self.RotateInput = self.RotateInput + Vector2.new(math_rad(angle * delta), 0)
|
|
userPanningTheCamera = true
|
|
end
|
|
end
|
|
|
|
-- Reset tween speed if user is panning
|
|
if userPanningTheCamera then
|
|
tweenSpeed = 0
|
|
self.LastUserPanCamera = now
|
|
end
|
|
|
|
local userRecentlyPannedCamera = now - self.LastUserPanCamera < timeBeforeAutoRotate
|
|
local subjectPosition = self:GetSubjectPosition()
|
|
|
|
if subjectPosition and camera then
|
|
local zoom = self:GetCameraZoom()
|
|
if zoom < 0.25 then
|
|
zoom = 0.25
|
|
end
|
|
|
|
if TeleportService:GetTeleportSetting("FollowCamera") then
|
|
if self.LastCameraTransform and not self:IsInFirstPerson() then
|
|
local lastVec = -(self.LastCameraTransform.p - subjectPosition)
|
|
local y = findAngleBetweenXZVectors(lastVec, self:GetCameraLook())
|
|
-- Check for NaNs
|
|
if IsFinite(y) and math.abs(y) > 0.0001 then
|
|
self.RotateInput = self.RotateInput + Vector2.new(y, 0)
|
|
end
|
|
end
|
|
end
|
|
|
|
camera.Focus = CFrame_new(subjectPosition)
|
|
|
|
local newLookVector = self:RotateCamera(self:GetCameraLook(), self.RotateInput)
|
|
self.RotateInput = ZERO_VECTOR2
|
|
|
|
if self.LastZoom ~= zoom then
|
|
self.LastZoom = zoom
|
|
|
|
if camera.CameraSubject and camera.CameraSubject:IsA("Humanoid") then
|
|
-- Flatten the lookVector
|
|
newLookVector = (newLookVector * XZ_VECTOR).Unit
|
|
|
|
-- Apply upwards tilt
|
|
local upY = -math_min(6, zoom/40)
|
|
newLookVector = (newLookVector + (UP_VECTOR * upY)).Unit
|
|
end
|
|
end
|
|
|
|
local newCF = CFrame_new(subjectPosition - (zoom * newLookVector), subjectPosition)
|
|
camera.CFrame = camera.CFrame:Lerp(newCF,.8)
|
|
self.LastCameraTransform = camera.CFrame
|
|
end
|
|
|
|
lastUpdate = now
|
|
end
|
|
|
|
GameSettings:SetCameraYInvertVisible()
|
|
GameSettings:SetGamepadCameraSensitivityVisible()
|
|
end
|
|
|
|
return this</string>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="ModuleScript" referent="156">
|
|
<Properties>
|
|
<string name="Name">Opacity</string>
|
|
<string name="Source">-- SolarCrane
|
|
|
|
local module = {}
|
|
|
|
local LastUpdate = tick()
|
|
local TransparencyDirty = false
|
|
local Enabled = false
|
|
local LastTransparency = nil
|
|
|
|
local DescendantAddedConn, DescendantRemovingConn = nil, nil
|
|
local ToolDescendantAddedConns = {}
|
|
local ToolDescendantRemovingConns = {}
|
|
local CachedParts = {}
|
|
|
|
local function HasToolAncestor(object)
|
|
return (object:FindFirstAncestorWhichIsA("Tool")) ~= nil
|
|
end
|
|
|
|
local function IsValidPartToModify(part)
|
|
if part:IsA('BasePart') or part:IsA('Decal') then
|
|
return not HasToolAncestor(part)
|
|
end
|
|
return false
|
|
end
|
|
|
|
local function TeardownTransparency()
|
|
for child, _ in pairs(CachedParts) do
|
|
child.LocalTransparencyModifier = 0
|
|
end
|
|
|
|
CachedParts = {}
|
|
TransparencyDirty = true
|
|
LastTransparency = nil
|
|
|
|
if DescendantAddedConn then
|
|
DescendantAddedConn:disconnect()
|
|
DescendantAddedConn = nil
|
|
end
|
|
|
|
if DescendantRemovingConn then
|
|
DescendantRemovingConn:disconnect()
|
|
DescendantRemovingConn = nil
|
|
end
|
|
|
|
for object, conn in pairs(ToolDescendantAddedConns) do
|
|
conn:disconnect()
|
|
ToolDescendantAddedConns[object] = nil
|
|
end
|
|
|
|
for object, conn in pairs(ToolDescendantRemovingConns) do
|
|
conn:disconnect()
|
|
ToolDescendantRemovingConns[object] = nil
|
|
end
|
|
end
|
|
|
|
local function SetupTransparency(character)
|
|
TeardownTransparency()
|
|
|
|
if DescendantAddedConn then
|
|
DescendantAddedConn:Disconnect()
|
|
end
|
|
|
|
DescendantAddedConn = character.DescendantAdded:connect(function (object)
|
|
-- This is a part we want to invisify
|
|
if IsValidPartToModify(object) then
|
|
CachedParts[object] = true
|
|
TransparencyDirty = true
|
|
-- There is now a tool under the character
|
|
elseif object:IsA('Tool') then
|
|
if ToolDescendantAddedConns[object] then
|
|
ToolDescendantAddedConns[object]:Disconnect()
|
|
end
|
|
|
|
ToolDescendantAddedConns[object] = object.DescendantAdded:connect(function (toolChild)
|
|
CachedParts[toolChild] = nil
|
|
if toolChild:IsA('BasePart') or toolChild:IsA('Decal') then
|
|
-- Reset the transparency
|
|
toolChild.LocalTransparencyModifier = 0
|
|
end
|
|
end)
|
|
|
|
if ToolDescendantRemovingConns[object] then
|
|
ToolDescendantRemovingConns[object]:Disconnect()
|
|
end
|
|
|
|
ToolDescendantRemovingConns[object] = object.DescendantRemoving:connect(function (formerToolChild)
|
|
wait() -- wait for new parent
|
|
if character and formerToolChild and formerToolChild:IsDescendantOf(character) then
|
|
if IsValidPartToModify(formerToolChild) then
|
|
CachedParts[formerToolChild] = true
|
|
TransparencyDirty = true
|
|
end
|
|
end
|
|
end)
|
|
end
|
|
end)
|
|
|
|
if DescendantRemovingConn then
|
|
DescendantRemovingConn:Disconnect()
|
|
end
|
|
|
|
DescendantRemovingConn = character.DescendantRemoving:connect(function (object)
|
|
if CachedParts[object] then
|
|
CachedParts[object] = nil
|
|
-- Reset the transparency
|
|
object.LocalTransparencyModifier = 0
|
|
end
|
|
end)
|
|
|
|
for _,desc in pairs(character:GetDescendants()) do
|
|
if IsValidPartToModify(desc) then
|
|
CachedParts[desc] = true
|
|
TransparencyDirty = true
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
function module:SetEnabled(newState)
|
|
if Enabled ~= newState then
|
|
Enabled = newState
|
|
self:Update()
|
|
end
|
|
end
|
|
|
|
function module:SetSubject(subject)
|
|
local character = nil
|
|
if subject and subject:IsA("Humanoid") then
|
|
character = subject.Parent
|
|
end
|
|
if subject and subject:IsA("VehicleSeat") and subject.Occupant then
|
|
character = subject.Occupant.Parent
|
|
end
|
|
if character then
|
|
SetupTransparency(character)
|
|
else
|
|
TeardownTransparency()
|
|
end
|
|
end
|
|
|
|
function module:Update()
|
|
local instant = false
|
|
local now = tick()
|
|
local currentCamera = workspace.CurrentCamera
|
|
|
|
if currentCamera then
|
|
local transparency = 0
|
|
if not Enabled then
|
|
instant = true
|
|
else
|
|
local distance = (currentCamera.Focus.p - currentCamera.CFrame.p).magnitude
|
|
if distance < 2 then
|
|
transparency = 1
|
|
elseif distance < 6 then
|
|
transparency = 0.5
|
|
else
|
|
transparency = 0
|
|
end
|
|
end
|
|
|
|
if TransparencyDirty or LastTransparency ~= transparency then
|
|
for child in pairs(CachedParts) do
|
|
if child.ClassName == "Decal" then
|
|
child.LocalTransparencyModifier = math.floor(transparency)
|
|
else
|
|
child.LocalTransparencyModifier = transparency
|
|
end
|
|
end
|
|
TransparencyDirty = false
|
|
LastTransparency = transparency
|
|
end
|
|
end
|
|
LastUpdate = now
|
|
end
|
|
|
|
return module</string>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="ModuleScript" referent="157">
|
|
<Properties>
|
|
<string name="Name">Popper</string>
|
|
<string name="Source">-- PopperCam Version 16
|
|
-- OnlyTwentyCharacters
|
|
|
|
local PopperCam = {} -- Guarantees your players won't see outside the bounds of your map!
|
|
|
|
-----------------
|
|
--| Constants |--
|
|
-----------------
|
|
|
|
local POP_RESTORE_RATE = 0.3
|
|
local MIN_CAMERA_ZOOM = 0.5
|
|
|
|
local VALID_SUBJECTS = {
|
|
'Humanoid',
|
|
'VehicleSeat',
|
|
'SkateboardPlatform',
|
|
}
|
|
|
|
-----------------
|
|
--| Variables |--
|
|
-----------------
|
|
|
|
local Players = game:GetService('Players')
|
|
|
|
local Camera = nil
|
|
local CameraSubjectChangeConn = nil
|
|
|
|
local SubjectPart = nil
|
|
|
|
local PlayerCharacters = {} -- For ignoring in raycasts
|
|
local VehicleParts = {} -- Also just for ignoring
|
|
|
|
local LastPopAmount = 0
|
|
local LastZoomLevel = 0
|
|
local PopperEnabled = true
|
|
|
|
local CFrame_new = CFrame.new
|
|
|
|
-----------------------
|
|
--| Local Functions |--
|
|
-----------------------
|
|
|
|
local math_abs = math.abs
|
|
|
|
local function OnCharacterAdded(player, character)
|
|
PlayerCharacters[player] = character
|
|
end
|
|
|
|
local function OnPlayersChildAdded(child)
|
|
if child:IsA('Player') then
|
|
child.CharacterAdded:connect(function(character)
|
|
OnCharacterAdded(child, character)
|
|
end)
|
|
if child.Character then
|
|
OnCharacterAdded(child, child.Character)
|
|
end
|
|
end
|
|
end
|
|
|
|
local function OnPlayersChildRemoved(child)
|
|
if child:IsA('Player') then
|
|
PlayerCharacters[child] = nil
|
|
end
|
|
end
|
|
|
|
-------------------------
|
|
--| Exposed Functions |--
|
|
-------------------------
|
|
|
|
function PopperCam:Update()
|
|
if PopperEnabled then
|
|
-- First, prep some intermediate vars
|
|
local Camera = workspace.CurrentCamera
|
|
local cameraCFrame = Camera.CFrame
|
|
local focusPoint = Camera.Focus.p
|
|
|
|
if SubjectPart then
|
|
focusPoint = SubjectPart.CFrame.p
|
|
end
|
|
|
|
local ignoreList = {}
|
|
for _, character in pairs(PlayerCharacters) do
|
|
ignoreList[#ignoreList + 1] = character
|
|
end
|
|
for i = 1, #VehicleParts do
|
|
ignoreList[#ignoreList + 1] = VehicleParts[i]
|
|
end
|
|
|
|
-- Get largest cutoff distance
|
|
local largest = Camera:GetLargestCutoffDistance(ignoreList)
|
|
|
|
-- Then check if the player zoomed since the last frame,
|
|
-- and if so, reset our pop history so we stop tweening
|
|
local zoomLevel = (cameraCFrame.p - focusPoint).Magnitude
|
|
if math_abs(zoomLevel - LastZoomLevel) > 0.001 then
|
|
LastPopAmount = 0
|
|
end
|
|
|
|
-- Finally, zoom the camera in (pop) by that most-cut-off amount, or the last pop amount if that's more
|
|
local popAmount = largest
|
|
if LastPopAmount > popAmount then
|
|
popAmount = LastPopAmount
|
|
end
|
|
|
|
if popAmount > 0 then
|
|
Camera.CFrame = cameraCFrame + (cameraCFrame.lookVector * popAmount)
|
|
LastPopAmount = popAmount - POP_RESTORE_RATE -- Shrink it for the next frame
|
|
if LastPopAmount < 0 then
|
|
LastPopAmount = 0
|
|
end
|
|
end
|
|
|
|
LastZoomLevel = zoomLevel
|
|
end
|
|
end
|
|
|
|
--------------------
|
|
--| Script Logic |--
|
|
--------------------
|
|
|
|
|
|
-- Connect to all Players so we can ignore their Characters
|
|
Players.ChildRemoved:connect(OnPlayersChildRemoved)
|
|
Players.ChildAdded:connect(OnPlayersChildAdded)
|
|
for _, player in pairs(Players:GetPlayers()) do
|
|
OnPlayersChildAdded(player)
|
|
end
|
|
|
|
return PopperCam</string>
|
|
</Properties>
|
|
</Item>
|
|
</Item>
|
|
<Item class="LocalScript" referent="158">
|
|
<Properties>
|
|
<string name="Name">Camera</string>
|
|
<string name="Source">local RunService = game:GetService("RunService")
|
|
local UserInputService = game:GetService("UserInputService")
|
|
local Players = game:GetService("Players")
|
|
|
|
local playerScripts = script.Parent
|
|
local playerModule = require(playerScripts:WaitForChild("PlayerModule"))
|
|
|
|
local cameraSystem = playerModule:GetCameras()
|
|
|
|
local main = require(script:WaitForChild("Main"))
|
|
local popper = require(script:WaitForChild("Popper"))
|
|
local opacity = require(script:WaitForChild("Opacity"))
|
|
|
|
local cameraSubjectChangedConn = nil
|
|
local renderSteppedConn = nil
|
|
|
|
local function onCameraSubjectChanged()
|
|
local currentCamera = workspace.CurrentCamera
|
|
if currentCamera then
|
|
local newSubject = currentCamera.CameraSubject
|
|
opacity:SetSubject(newSubject)
|
|
end
|
|
end
|
|
|
|
local function onNewCamera()
|
|
local currentCamera = workspace.CurrentCamera
|
|
if currentCamera then
|
|
if cameraSubjectChangedConn then
|
|
cameraSubjectChangedConn:Disconnect()
|
|
end
|
|
|
|
local cameraSubjectChanged = currentCamera:GetPropertyChangedSignal("CameraSubject")
|
|
cameraSubjectChangedConn = cameraSubjectChanged:Connect(onCameraSubjectChanged)
|
|
|
|
onCameraSubjectChanged()
|
|
end
|
|
end
|
|
|
|
-- Initialize cameras.
|
|
local cameraUpdated = workspace:GetPropertyChangedSignal("CurrentCamera")
|
|
cameraUpdated:Connect(onNewCamera)
|
|
|
|
onNewCamera()
|
|
main:SetEnabled(true)
|
|
opacity:SetEnabled(true)
|
|
|
|
-- Overload the camera update function.
|
|
function cameraSystem:Update()
|
|
if cameraSystem.activeCameraController then
|
|
cameraSystem.activeCameraController:Enable(false)
|
|
cameraSystem.activeCameraController = nil
|
|
end
|
|
|
|
main:Update()
|
|
popper:Update()
|
|
opacity:Update()
|
|
end
|
|
|
|
playerScripts:RegisterTouchCameraMovementMode(Enum.TouchCameraMovementMode.Default)
|
|
playerScripts:RegisterComputerCameraMovementMode(Enum.ComputerCameraMovementMode.Default)</string>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="LocalScript" referent="159">
|
|
<Properties>
|
|
<string name="Name">CharacterBevels</string>
|
|
<string name="Source"><![CDATA[local CollectionService = game:GetService("CollectionService")
|
|
local TeleportService = game:GetService("TeleportService")
|
|
|
|
local noBevelsTag = "NoCharacterBevels"
|
|
local bevelTracker = CollectionService:GetInstanceAddedSignal(noBevelsTag)
|
|
|
|
local function safeDestroy(obj)
|
|
spawn(function ()
|
|
obj:Destroy()
|
|
end)
|
|
end
|
|
|
|
local function onInstanceAdded(inst)
|
|
if TeleportService:GetTeleportSetting("CharacterBevels") then
|
|
safeDestroy(inst)
|
|
end
|
|
end
|
|
|
|
for _,inst in pairs(CollectionService:GetTagged(noBevelsTag)) do
|
|
onInstanceAdded(inst)
|
|
end
|
|
|
|
bevelTracker:Connect(onInstanceAdded)
|
|
|
|
|
|
]]></string>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="LocalScript" referent="160">
|
|
<Properties>
|
|
<string name="Name">ClickToMove</string>
|
|
<string name="Source">-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
-- @CloneTrooper1019, 2018
|
|
-- ClickToMove
|
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
-- Constants
|
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
local ContextActionService = game:GetService("ContextActionService")
|
|
local GuiService = game:GetService("GuiService")
|
|
local Players = game:GetService("Players")
|
|
local RunService = game:GetService("RunService")
|
|
local TeleportService = game:GetService("TeleportService")
|
|
local UserInputService = game:GetService("UserInputService")
|
|
|
|
local IS_TOUCH = UserInputService.TouchEnabled
|
|
|
|
local ICON_IDLE = "rbxassetid://334630296"
|
|
local ICON_HOVER = "rbxassetid://1000000"
|
|
local ICON_CLICK = "rbxasset://textures/DragCursor.png"
|
|
|
|
local DISK_OFFSET = CFrame.Angles(math.pi / 2,0,0)
|
|
|
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
-- Character Listener
|
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
local player = game.Players.LocalPlayer
|
|
local character,humanoid
|
|
|
|
local function onCharacterAdded(char)
|
|
humanoid = char:WaitForChild("Humanoid")
|
|
character = char
|
|
end
|
|
|
|
if player.Character then
|
|
onCharacterAdded(player.Character)
|
|
end
|
|
|
|
player.CharacterAdded:Connect(onCharacterAdded)
|
|
|
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
-- Gui Focus
|
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
local isMouseHoveringUi = false
|
|
|
|
local function onInputChanged(input, gameProcessed)
|
|
local inputType = input.UserInputType.Name
|
|
|
|
if inputType == "MouseMovement" then
|
|
isMouseHoveringUi = gameProcessed
|
|
end
|
|
end
|
|
|
|
local function isGuiFocused()
|
|
return isMouseHoveringUi or GuiService.SelectedObject ~= nil
|
|
end
|
|
|
|
UserInputService.InputChanged:Connect(onInputChanged)
|
|
|
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
-- Movement Goal
|
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
local currentGoal, moveSignal
|
|
|
|
local function findAngleBetweenXZVectors(vec2, vec1)
|
|
return math.atan2(vec1.X*vec2.Z-vec1.Z*vec2.X, vec1.X*vec2.X + vec1.Z*vec2.Z)
|
|
end
|
|
|
|
local function isFinite(num)
|
|
return num == num and num ~= 1/0 and num ~= -1/0
|
|
end
|
|
|
|
local function rotateCameraTowardsGoal()
|
|
local c = workspace.CurrentCamera
|
|
if c then
|
|
local cf = c.CFrame
|
|
local focus = c.Focus
|
|
|
|
local desiredAngle = CFrame.new(cf.p,currentGoal).lookVector
|
|
local currentAngle = cf.lookVector
|
|
|
|
local angleBetween = findAngleBetweenXZVectors(desiredAngle,currentAngle)
|
|
|
|
if isFinite(angleBetween) then
|
|
local abs = math.abs(angleBetween)
|
|
local sign = math.sign(angleBetween)
|
|
local rotation = math.min(0.01,abs)
|
|
|
|
local cfLocal = focus:toObjectSpace(cf)
|
|
c.CFrame = focus * CFrame.Angles(0,-rotation*sign,0) * cfLocal
|
|
end
|
|
end
|
|
end
|
|
|
|
local function finishGoal()
|
|
if currentGoal then
|
|
currentGoal = nil
|
|
end
|
|
if moveSignal then
|
|
moveSignal:Disconnect()
|
|
moveSignal = nil
|
|
end
|
|
end
|
|
|
|
local function clickToMove(goal)
|
|
finishGoal()
|
|
currentGoal = goal
|
|
|
|
moveSignal = humanoid.MoveToFinished:Connect(finishGoal)
|
|
|
|
humanoid:Move(Vector3.new(1,1,1))
|
|
humanoid:MoveTo(currentGoal)
|
|
end
|
|
|
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
-- Green Disk
|
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
local mouse = player:GetMouse()
|
|
local mouseIcon = script.Parent
|
|
mouse.TargetFilter = workspace.CurrentCamera
|
|
|
|
local lastTarget
|
|
local lastTargetCanClick = false
|
|
|
|
local disk = Instance.new("CylinderHandleAdornment")
|
|
disk.Name = "Disk"
|
|
disk.Color3 = Color3.new(0,1,0)
|
|
disk.Radius = 1
|
|
disk.Height = 0.2
|
|
disk.Visible = false
|
|
disk.Adornee = workspace.Terrain
|
|
disk.Parent = script
|
|
|
|
local goalDisk = disk:Clone()
|
|
goalDisk.Name = "Goal"
|
|
goalDisk.Parent = script
|
|
|
|
local function hasTool()
|
|
if character then
|
|
return character:FindFirstChildOfClass("Tool") ~= nil
|
|
end
|
|
|
|
return false
|
|
end
|
|
|
|
local function isFirstPerson()
|
|
if character then
|
|
local head = character:FindFirstChild("Head")
|
|
if head then
|
|
return head.LocalTransparencyModifier == 1
|
|
end
|
|
end
|
|
return false
|
|
end
|
|
|
|
local function canClickTarget()
|
|
local target = mouse.Target
|
|
if target then
|
|
if target ~= lastTarget then
|
|
local canClick = false
|
|
local clickDetector = target:FindFirstChildOfClass("ClickDetector")
|
|
|
|
if clickDetector then
|
|
local dist = player:DistanceFromCharacter(target.Position)
|
|
if dist <= clickDetector.MaxActivationDistance then
|
|
canClick = true
|
|
end
|
|
end
|
|
|
|
lastTarget = target
|
|
lastTargetCanClick = canClick
|
|
end
|
|
|
|
return lastTargetCanClick
|
|
end
|
|
end
|
|
|
|
local function canRenderDisk(rendering)
|
|
if not TeleportService:GetTeleportSetting("ClickToMove") then
|
|
return false
|
|
end
|
|
|
|
if rendering and IS_TOUCH then
|
|
return false
|
|
end
|
|
|
|
if humanoid then
|
|
local movement = humanoid.MoveDirection
|
|
if movement.Magnitude == 0 then
|
|
local pos = mouse.Hit.p
|
|
local dist = player:DistanceFromCharacter(pos)
|
|
|
|
if dist < 32 then
|
|
local blockers = {hasTool, isFirstPerson, canClickTarget, isGuiFocused}
|
|
|
|
for _,blocker in pairs(blockers) do
|
|
if blocker() then
|
|
return false
|
|
end
|
|
end
|
|
|
|
return true
|
|
end
|
|
else
|
|
finishGoal()
|
|
end
|
|
end
|
|
|
|
return false
|
|
end
|
|
|
|
local function render3dAdorn()
|
|
disk.Visible = canRenderDisk(true)
|
|
|
|
if disk.Visible then
|
|
disk.CFrame = CFrame.new(mouse.Hit.p) * DISK_OFFSET
|
|
mouseIcon.Image = ICON_HOVER
|
|
elseif canClickTarget() then
|
|
mouseIcon.Image = ICON_CLICK
|
|
elseif not hasTool() then
|
|
mouseIcon.Image = ICON_IDLE
|
|
end
|
|
|
|
if currentGoal then
|
|
goalDisk.Visible = true
|
|
goalDisk.CFrame = CFrame.new(currentGoal) * DISK_OFFSET
|
|
rotateCameraTowardsGoal()
|
|
else
|
|
goalDisk.Visible = false
|
|
end
|
|
end
|
|
|
|
RunService.Heartbeat:Connect(render3dAdorn)
|
|
|
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
-- Click Action
|
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
local function onInputBegan(input,gameProcessed)
|
|
local goal = mouse.Hit.p
|
|
if not gameProcessed and canRenderDisk() and humanoid then
|
|
local name = input.UserInputType.Name
|
|
|
|
if name == "MouseButton1" then
|
|
clickToMove(goal)
|
|
elseif name == "Touch" then
|
|
wait(.1)
|
|
if input.UserInputState == Enum.UserInputState.End then
|
|
clickToMove(goal)
|
|
end
|
|
elseif name == "Gamepad1" then
|
|
if input.KeyCode == Enum.KeyCode.ButtonR2 then
|
|
clickToMove(goal)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
UserInputService.InputBegan:Connect(onInputBegan)
|
|
|
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
-- OBLITERATE the invasive click to move mode that Roblox provides
|
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
pcall(function ()
|
|
if IS_TOUCH then
|
|
local playerScripts = player:WaitForChild("PlayerScripts")
|
|
local no = function () end
|
|
|
|
spawn(function ()
|
|
local controlScript = playerScripts:WaitForChild("ControlScript", 86400)
|
|
if controlScript then
|
|
local masterControl = controlScript:WaitForChild("MasterControl")
|
|
|
|
local clickToMove = masterControl:WaitForChild("ClickToMoveController")
|
|
clickToMove = require(clickToMove)
|
|
|
|
clickToMove:Disable()
|
|
clickToMove.Enable = no
|
|
end
|
|
end)
|
|
|
|
spawn(function ()
|
|
local playerModule = playerScripts:WaitForChild("PlayerModule", 86400)
|
|
if playerModule then
|
|
local controlModule = playerModule:WaitForChild("ControlModule")
|
|
|
|
local clickToMove = controlModule:WaitForChild("ClickToMoveController")
|
|
clickToMove = require(clickToMove)
|
|
|
|
clickToMove:Stop()
|
|
clickToMove.Enable = no
|
|
end
|
|
end)
|
|
end
|
|
end)
|
|
|
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------</string>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="LocalScript" referent="161">
|
|
<Properties>
|
|
<string name="Name">ConsoleTweaks</string>
|
|
<string name="Source">local UserInputService = game:GetService("UserInputService")
|
|
local GuiService = game:GetService("GuiService")
|
|
|
|
local function addUIScale(obj,scale)
|
|
local uiScale = Instance.new("UIScale")
|
|
uiScale.Scale = scale
|
|
uiScale.Parent = obj
|
|
end
|
|
|
|
if GuiService:IsTenFootInterface() then
|
|
local gui = script.Parent
|
|
local zoomControls = gui:WaitForChild("ZoomControls")
|
|
zoomControls.Visible = false
|
|
|
|
local backpack = gui:WaitForChild("Backpack")
|
|
backpack.Position = UDim2.new(0, 0, 1, 0)
|
|
|
|
local chat = gui:WaitForChild("Chat")
|
|
addUIScale(chat, 1.5)
|
|
|
|
local chatPadding = gui:WaitForChild("ChatPadding", 1)
|
|
if chatPadding then
|
|
chatPadding:Destroy()
|
|
end
|
|
|
|
local safeChat = gui:WaitForChild("SafeChat")
|
|
addUIScale(safeChat, 1.5)
|
|
|
|
local health = gui:WaitForChild("Health")
|
|
addUIScale(health, 1.5)
|
|
end
|
|
|
|
wait()
|
|
script:Destroy()</string>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="LocalScript" referent="162">
|
|
<Properties>
|
|
<string name="Name">Explosions</string>
|
|
<string name="Source">local TeleportService = game:GetService("TeleportService")
|
|
|
|
local classicExp = script:WaitForChild("ClassicExp")
|
|
local c = workspace.CurrentCamera
|
|
|
|
local baseExpAdorn = Instance.new("UnionOperation")
|
|
baseExpAdorn.Name = "ExplosionAdorn"
|
|
baseExpAdorn.Anchored = true
|
|
baseExpAdorn.CanCollide = false
|
|
baseExpAdorn.Locked = true
|
|
baseExpAdorn.Transparency = 1
|
|
baseExpAdorn.Size = Vector3.new()
|
|
|
|
local function onDescendantAdded(exp)
|
|
if exp:IsA("Explosion") then
|
|
local cf = CFrame.new(exp.Position)
|
|
local expAdorn = baseExpAdorn:Clone()
|
|
local lifeTime = 1.5
|
|
exp.Visible = false
|
|
if TeleportService:GetTeleportSetting("RetroExplosions") then
|
|
local expObj = Instance.new("SphereHandleAdornment")
|
|
expObj.Adornee = expAdorn
|
|
expObj.Radius = exp.BlastRadius
|
|
expObj.Color3 = Color3.new(1,0,0)
|
|
expObj.CFrame = cf
|
|
expObj.Parent = expAdorn
|
|
lifeTime = 1
|
|
if exp.BlastRadius > 1 then
|
|
lifeTime = lifeTime - (1/exp.BlastRadius)
|
|
end
|
|
else
|
|
spawn(function ()
|
|
local e = classicExp:Clone()
|
|
e.Parent = expAdorn
|
|
expAdorn.CFrame = cf
|
|
local lessParticles = TeleportService:GetTeleportSetting("ReducedParticles")
|
|
local count = lessParticles and 25 or 100
|
|
for i = 1,8 do
|
|
e:Emit(count)
|
|
wait(0.125)
|
|
end
|
|
end)
|
|
end
|
|
expAdorn.Parent = c
|
|
wait(lifeTime)
|
|
expAdorn:Destroy()
|
|
end
|
|
end
|
|
|
|
workspace.DescendantAdded:Connect(onDescendantAdded)</string>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="LocalScript" referent="163">
|
|
<Properties>
|
|
<string name="Name">ForceFields</string>
|
|
<string name="Source">local RunService = game:GetService("RunService")
|
|
|
|
local ffAdorns = workspace:WaitForChild("_ForceFieldAdorns")
|
|
local registry = {}
|
|
local cycleStates = {}
|
|
local cycles = 60
|
|
|
|
local function onChildAdded(child)
|
|
if child:IsA("SelectionBox") then
|
|
spawn(function ()
|
|
while not child.Adornee do
|
|
child.Changed:Wait()
|
|
end
|
|
registry[child] = child.Adornee
|
|
end)
|
|
end
|
|
end
|
|
|
|
local function onChildRemoved(child)
|
|
if registry[child] then
|
|
registry[child] = nil
|
|
end
|
|
end
|
|
|
|
local function update()
|
|
local now = tick()
|
|
for adorn,adornee in pairs(registry) do
|
|
local model = adornee:FindFirstAncestorWhichIsA("Model")
|
|
local key
|
|
if model then
|
|
local key = model:GetFullName()
|
|
local startTime = cycleStates[key]
|
|
if not startTime then
|
|
startTime = tick()
|
|
cycleStates[key] = startTime
|
|
end
|
|
local cycle = math.floor(((now-startTime)*2) * cycles) % (cycles*2)
|
|
if cycle > cycles then
|
|
cycle = cycles - (cycle - cycles)
|
|
end
|
|
local invertCycle = cycles - cycle
|
|
adorn.Color3 = Color3.new(cycle/cycles, 0, invertCycle/cycles)
|
|
adorn.Transparency = 0
|
|
end
|
|
adorn.Visible = adornee:IsDescendantOf(workspace) and adornee.LocalTransparencyModifier < 1
|
|
end
|
|
end
|
|
|
|
for _,v in pairs(ffAdorns:GetChildren()) do
|
|
onChildAdded(v)
|
|
end
|
|
|
|
RunService.Heartbeat:Connect(update)
|
|
ffAdorns.ChildAdded:Connect(onChildAdded)
|
|
ffAdorns.ChildRemoved:Connect(onChildRemoved)</string>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="LocalScript" referent="164">
|
|
<Properties>
|
|
<string name="Name">GamepadPatch</string>
|
|
<string name="Source">-- Seriously Roblox?
|
|
|
|
local Players = game:GetService("Players")
|
|
local RunService = game:GetService("RunService")
|
|
local UserInputService = game:GetService("UserInputService")
|
|
|
|
local player = Players.LocalPlayer
|
|
local playerScripts = player:WaitForChild("PlayerScripts")
|
|
|
|
local playerModule = playerScripts:WaitForChild("PlayerModule")
|
|
local controlModule = playerModule:WaitForChild("ControlModule")
|
|
local gamepad = require(controlModule:WaitForChild("Gamepad"))
|
|
|
|
playerModule = require(playerModule)
|
|
controlModule = playerModule:GetControls()
|
|
|
|
local function fixGamepad()
|
|
local lastInputType = UserInputService:GetLastInputType()
|
|
|
|
if lastInputType.Name == "Gamepad1" then
|
|
local controllers = controlModule.controllers
|
|
|
|
if controlModule.activeController ~= controllers[gamepad] then
|
|
controlModule:SwitchToController(gamepad)
|
|
end
|
|
end
|
|
end
|
|
|
|
RunService:BindToRenderStep("GamepadPatch", 0, fixGamepad)</string>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="LocalScript" referent="165">
|
|
<Properties>
|
|
<string name="Name">HumanoidLabels</string>
|
|
<string name="Source">local humanoids = {}
|
|
local player = game.Players.LocalPlayer
|
|
local pgui = player:WaitForChild("PlayerGui")
|
|
local healthBase = script:WaitForChild("Health")
|
|
local rs = game:GetService("RunService")
|
|
|
|
local farStudsOffset = Vector3.new(0,2,0)
|
|
local closeStudsOffset = Vector3.new(0,1,0)
|
|
|
|
local farSize = UDim2.new(0,50,0,20)
|
|
local closeSize = UDim2.new(0,100,0,30)
|
|
|
|
local function isFinite(num)
|
|
return num == num and num ~= -1/0 and num ~= 1/0
|
|
end
|
|
|
|
local function setupHumanoid(h)
|
|
local updateCon = nil
|
|
local currentHealth = nil
|
|
|
|
local function onAncestryChanged()
|
|
if updateCon then
|
|
updateCon:disconnect()
|
|
updateCon = nil
|
|
end
|
|
|
|
if currentHealth then
|
|
currentHealth:Destroy()
|
|
currentHealth = nil
|
|
end
|
|
|
|
local char = h.Parent
|
|
|
|
if char then
|
|
while not char:FindFirstChild("Head") do
|
|
if h.Parent ~= char then break end
|
|
char.ChildAdded:wait()
|
|
end
|
|
|
|
local head = char:FindFirstChild("Head")
|
|
|
|
if head then
|
|
local health = healthBase:Clone()
|
|
local playerName = health:WaitForChild("PlayerName")
|
|
local redBar = health:WaitForChild("RedBar")
|
|
local greenBar = redBar:WaitForChild("GreenBar")
|
|
local inOverWrite = false
|
|
local overWriter = nil
|
|
|
|
local hPlayer = game.Players:GetPlayerFromCharacter(char)
|
|
playerName.Text = char.Name
|
|
health.Adornee = head
|
|
health.PlayerToHideFrom = hPlayer
|
|
health.Parent = head
|
|
|
|
local c = workspace.CurrentCamera
|
|
|
|
local function update()
|
|
local dist = (c.CFrame.p - head.Position).magnitude
|
|
local fontSize = 12
|
|
|
|
if dist < 20 then
|
|
fontSize = 24
|
|
elseif dist < 50 then
|
|
fontSize = 18
|
|
end
|
|
|
|
local ratio = h.Health / h.MaxHealth
|
|
redBar.Visible = isFinite(ratio)
|
|
redBar.BackgroundTransparency = math.floor(ratio)
|
|
redBar.Size = UDim2.new(0, fontSize * 4, 0, fontSize / 2)
|
|
greenBar.Size = UDim2.new(ratio, 0, 1, 0)
|
|
|
|
local width = fontSize * 4
|
|
health.Size = UDim2.new(0, width, 0, fontSize)
|
|
health.Enabled = (dist <= 100 and head.Transparency < 1)
|
|
health.StudsOffsetWorldSpace = Vector3.new(0, 1.5, 0)
|
|
|
|
if hPlayer and game:FindService("Teams") then
|
|
playerName.TextColor = hPlayer.TeamColor
|
|
else
|
|
playerName.TextColor3 = Color3.new(1, 1, 1)
|
|
end
|
|
|
|
local overWriter = char:FindFirstChild("NameOverwrite")
|
|
if overWriter and overWriter:IsA("StringValue") then
|
|
playerName.Text = overWriter.Value
|
|
else
|
|
playerName.Text = char.Name
|
|
end
|
|
end
|
|
|
|
updateCon = rs.RenderStepped:Connect(update)
|
|
currentHealth = health
|
|
h.DisplayDistanceType = "None"
|
|
end
|
|
end
|
|
end
|
|
onAncestryChanged()
|
|
h.AncestryChanged:Connect(onAncestryChanged)
|
|
end
|
|
|
|
local function recurse(obj)
|
|
for _,v in pairs(obj:GetChildren()) do
|
|
if v:IsA("Humanoid") then
|
|
humanoids[v] = true
|
|
else
|
|
recurse(v)
|
|
end
|
|
end
|
|
end
|
|
|
|
recurse(workspace)
|
|
|
|
for h in pairs(humanoids) do
|
|
humanoids[h] = true
|
|
|
|
spawn(function ()
|
|
setupHumanoid(h)
|
|
end)
|
|
end
|
|
|
|
local function onDescendantAdded(child)
|
|
if child:IsA("Humanoid") then
|
|
humanoids[child] = true
|
|
setupHumanoid(child)
|
|
end
|
|
end
|
|
|
|
local function onDescendantRemoved(child)
|
|
if humanoids[child] then
|
|
humanoids[child] = nil
|
|
end
|
|
end
|
|
|
|
recurse(workspace)
|
|
|
|
workspace.DescendantAdded:connect(onDescendantAdded)
|
|
workspace.DescendantRemoving:connect(onDescendantRemoved)</string>
|
|
</Properties>
|
|
<Item class="BillboardGui" referent="166">
|
|
<Properties>
|
|
<string name="Name">Health</string>
|
|
<bool name="Active">false</bool>
|
|
<Ref name="Adornee">null</Ref>
|
|
<bool name="AlwaysOnTop">true</bool>
|
|
<bool name="archivable">true</bool>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<float name="DistanceLowerLimit">0</float>
|
|
<float name="DistanceStep">0</float>
|
|
<float name="DistanceUpperLimit">-1</float>
|
|
<bool name="Enabled">true</bool>
|
|
<Vector3 name="ExtentsOffset">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
<Z>0</Z>
|
|
</Vector3>
|
|
<Vector3 name="ExtentsOffsetWorldSpace">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
<Z>0</Z>
|
|
</Vector3>
|
|
<float name="LightInfluence">0</float>
|
|
<float name="MaxDistance">INF</float>
|
|
<Ref name="PlayerToHideFrom">null</Ref>
|
|
<bool name="ResetOnSpawn">true</bool>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>96</XO>
|
|
<YS>0</YS>
|
|
<YO>24</YO>
|
|
</UDim2>
|
|
<Vector2 name="SizeOffset">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<Vector3 name="StudsOffset">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
<Z>0</Z>
|
|
</Vector3>
|
|
<Vector3 name="StudsOffsetWorldSpace">
|
|
<X>0</X>
|
|
<Y>1.5</Y>
|
|
<Z>0</Z>
|
|
</Vector3>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<token name="ZIndexBehavior">0</token>
|
|
</Properties>
|
|
<Item class="TextLabel" referent="167">
|
|
<Properties>
|
|
<string name="Name">PlayerName</string>
|
|
<bool name="Active">false</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>0.5</X>
|
|
<Y>0.75</Y>
|
|
</Vector2>
|
|
<bool name="archivable">true</bool>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">1</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">9</token>
|
|
<int name="LayoutOrder">0</int>
|
|
<float name="LineHeight">1</float>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0.5</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>10</XS>
|
|
<XO>0</XO>
|
|
<YS>1</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<string name="Text">CloneTrooper1019</string>
|
|
<Color3 name="TextColor3">
|
|
<R>1</R>
|
|
<G>1</G>
|
|
<B>1</B>
|
|
</Color3>
|
|
<bool name="TextScaled">true</bool>
|
|
<float name="TextSize">24</float>
|
|
<Color3 name="TextStrokeColor3">
|
|
<R>0</R>
|
|
<G>0</G>
|
|
<B>0</B>
|
|
</Color3>
|
|
<float name="TextStrokeTransparency">0</float>
|
|
<float name="TextTransparency">0</float>
|
|
<token name="TextTruncate">0</token>
|
|
<bool name="TextWrapped">true</bool>
|
|
<token name="TextXAlignment">2</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">1</int>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="Frame" referent="168">
|
|
<Properties>
|
|
<string name="Name">RedBar</string>
|
|
<bool name="Active">false</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>0.5</X>
|
|
<Y>0.5</Y>
|
|
</Vector2>
|
|
<bool name="archivable">true</bool>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>1</R>
|
|
<G>0</G>
|
|
<B>0</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">0</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<int name="LayoutOrder">0</int>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0.5</XS>
|
|
<XO>0</XO>
|
|
<YS>0.5</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0.6000000238418579</XS>
|
|
<XO>0</XO>
|
|
<YS>0.30000001192092896</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">1</int>
|
|
</Properties>
|
|
<Item class="Frame" referent="169">
|
|
<Properties>
|
|
<string name="Name">GreenBar</string>
|
|
<bool name="Active">false</bool>
|
|
<Vector2 name="AnchorPoint">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<bool name="archivable">true</bool>
|
|
<BinaryString name="AttributesSerialize"><![CDATA[]]></BinaryString>
|
|
<bool name="AutoLocalize">true</bool>
|
|
<Color3 name="BackgroundColor3">
|
|
<R>0.5058823823928833</R>
|
|
<G>0.7725490927696228</G>
|
|
<B>0.08627451211214066</B>
|
|
</Color3>
|
|
<float name="BackgroundTransparency">0</float>
|
|
<Color3 name="BorderColor3">
|
|
<R>0.10588239878416061</R>
|
|
<G>0.16470590233802795</G>
|
|
<B>0.20784319937229156</B>
|
|
</Color3>
|
|
<token name="BorderMode">0</token>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<int name="LayoutOrder">0</int>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<Ref name="RootLocalizationTable">null</Ref>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>0</XO>
|
|
<YS>1</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">0</token>
|
|
<BinaryString name="Tags"><![CDATA[]]></BinaryString>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">1</int>
|
|
</Properties>
|
|
</Item>
|
|
</Item>
|
|
</Item>
|
|
</Item>
|
|
<Item class="LocalScript" referent="170">
|
|
<Properties>
|
|
<string name="Name">InputGateway</string>
|
|
<string name="Source">local UserInputService = game:GetService("UserInputService")
|
|
local ContextActionService = game:GetService("ContextActionService")
|
|
local Debris = game:GetService("Debris")
|
|
|
|
local gateway = script.Parent
|
|
local tool = gateway.Parent
|
|
local remote = gateway:WaitForChild("Gateway")
|
|
local player = game.Players.LocalPlayer
|
|
local mouse = player:GetMouse()
|
|
local isActive = false
|
|
|
|
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
-- Standard Input
|
|
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
local function activate(active,cf)
|
|
isActive = active
|
|
remote:FireServer("SetActive",active,cf)
|
|
while isActive do
|
|
wait(.1)
|
|
remote:FireServer("SetTarget",mouse.Hit)
|
|
end
|
|
end
|
|
|
|
local function onKey(input)
|
|
local keyCode = input.KeyCode.Name
|
|
local down = (input.UserInputState.Name == "Begin")
|
|
remote:FireServer("KeyEvent",keyCode,down)
|
|
end
|
|
|
|
local function onInputBegan(input,gameProcessed)
|
|
if not gameProcessed then
|
|
local name = input.UserInputType.Name
|
|
if name == "MouseButton1" then
|
|
activate(true,mouse.Hit)
|
|
elseif name == "Touch" then
|
|
wait(.1)
|
|
local state = input.UserInputState.Name
|
|
if state == "End" or state == "Cancel" then
|
|
activate(true,mouse.Hit)
|
|
end
|
|
elseif name == "Gamepad1" then
|
|
local keyCode = input.KeyCode.Name
|
|
if keyCode == "ButtonR2" then
|
|
activate(true,mouse.Hit)
|
|
end
|
|
elseif name == "Keyboard" then
|
|
onKey(input)
|
|
end
|
|
end
|
|
end
|
|
|
|
local function onInputEnded(input,gameProcessed)
|
|
if not gameProcessed and isActive then
|
|
local name = input.UserInputType.Name
|
|
if name == "MouseButton1" or name == "Touch" or name == "Gamepad1" then
|
|
activate(false,mouse.Hit)
|
|
elseif name == "Keyboard" then
|
|
onKey(input)
|
|
end
|
|
end
|
|
end
|
|
|
|
UserInputService.InputBegan:Connect(onInputBegan)
|
|
UserInputService.InputEnded:Connect(onInputEnded)
|
|
|
|
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
-- Special case Input
|
|
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
local mControlScheme = tool:WaitForChild("ControlScheme",5)
|
|
|
|
if mControlScheme then
|
|
local controlSchemeData = require(mControlScheme)
|
|
local controlScheme = controlSchemeData.Buttons
|
|
local activateContext = controlSchemeData.ActivateContext
|
|
local keyEvent = tool:WaitForChild("KeyEvent")
|
|
local callbacks = {}
|
|
|
|
local hands = { L = "Left", R = "Right" }
|
|
local handTypes = {"Bumper","Trigger","Joystick (Press)"}
|
|
|
|
local schemeDocs =
|
|
{
|
|
Keyboard = {"Hold Left Mouse Button - " .. activateContext};
|
|
Gamepad = {"Hold Right Trigger - " .. activateContext};
|
|
}
|
|
|
|
for key,data in pairs(controlScheme) do
|
|
local down = false
|
|
callbacks[key] = function (actionName,inputState,inputObject)
|
|
if (inputState.Name == "Begin") and not down then
|
|
down = true
|
|
if data.Client then
|
|
keyEvent:Fire(key,true)
|
|
else
|
|
remote:FireServer("KeyEvent",key,true)
|
|
end
|
|
elseif (inputState.Name == "End") and down then
|
|
down = false
|
|
if data.Client then
|
|
keyEvent:Fire(key,false)
|
|
else
|
|
remote:FireServer("KeyEvent",key,false)
|
|
end
|
|
end
|
|
end
|
|
|
|
local xBtn = data.XboxButton:gsub("Button","")
|
|
if #xBtn == 2 then
|
|
local handId,hTypeId = xBtn:match("(%u)(%d)")
|
|
local hand = hands[handId]
|
|
local hType = handTypes[tonumber(hTypeId)]
|
|
xBtn = hand .. " " .. hType
|
|
else
|
|
xBtn = "(" .. xBtn .. ")"
|
|
end
|
|
table.insert(schemeDocs.Keyboard,key .. " - " .. data.Label)
|
|
table.insert(schemeDocs.Gamepad,xBtn .. " - " .. data.Label)
|
|
end
|
|
|
|
local currentSchemeDocMsg
|
|
|
|
local function onLastInputTypeChanged(inputType)
|
|
if currentSchemeDocMsg and not UserInputService.TouchEnabled and not controlSchemeData.HideControls then
|
|
local schemeDoc
|
|
if inputType.Name:find("Gamepad") then
|
|
schemeDoc = "Gamepad"
|
|
else
|
|
schemeDoc = "Keyboard"
|
|
end
|
|
currentSchemeDocMsg.Text = schemeDoc .. " Controls:\n\n" .. table.concat(schemeDocs[schemeDoc],"\n")
|
|
end
|
|
end
|
|
|
|
local diedCon
|
|
local equipped = false
|
|
|
|
local function onUnequipped()
|
|
if equipped then
|
|
equipped = false
|
|
for key,data in pairs(controlScheme) do
|
|
ContextActionService:UnbindAction(data.Label)
|
|
end
|
|
currentSchemeDocMsg:Destroy()
|
|
currentSchemeDocMsg = nil
|
|
end
|
|
end
|
|
|
|
local function onEquipped()
|
|
if not equipped then
|
|
equipped = true
|
|
for key,data in pairs(controlScheme) do
|
|
ContextActionService:BindAction(data.Label,callbacks[key],true,Enum.KeyCode[data.XboxButton])
|
|
ContextActionService:SetTitle(data.Label,data.Label)
|
|
end
|
|
if UserInputService.TouchEnabled then
|
|
spawn(function ()
|
|
local playerGui = player:WaitForChild("PlayerGui")
|
|
local contextActionGui = playerGui:WaitForChild("ContextActionGui")
|
|
local contextButtonFrame = contextActionGui:WaitForChild("ContextButtonFrame")
|
|
contextButtonFrame.Size = UDim2.new(3/8,0,3/8,0)
|
|
contextButtonFrame.AnchorPoint = Vector2.new(1,1)
|
|
contextButtonFrame.Position = UDim2.new(1,0,1,0)
|
|
end)
|
|
end
|
|
currentSchemeDocMsg = Instance.new("Message")
|
|
currentSchemeDocMsg.Parent = player
|
|
onLastInputTypeChanged(UserInputService:GetLastInputType())
|
|
if not diedCon then
|
|
local char = tool.Parent
|
|
if char then
|
|
local humanoid = char:FindFirstChildWhichIsA("Humanoid")
|
|
if humanoid then
|
|
diedCon = humanoid.Died:Connect(onUnequipped)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
tool.Equipped:Connect(onEquipped)
|
|
tool.Unequipped:Connect(onUnequipped)
|
|
UserInputService.LastInputTypeChanged:Connect(onLastInputTypeChanged)
|
|
end</string>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="LocalScript" referent="171">
|
|
<Properties>
|
|
<string name="Name">Music</string>
|
|
<string name="Source">local TeleportService = game:GetService("TeleportService")
|
|
local gameMusic = workspace:WaitForChild("GameMusic",10)
|
|
if gameMusic and TeleportService:GetTeleportSetting("AllowMusic") then
|
|
gameMusic:Play()
|
|
end</string>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="LocalScript" referent="172">
|
|
<Properties>
|
|
<string name="Name">Shared</string>
|
|
<string name="Source">local TARGET = script.Name
|
|
|
|
do
|
|
local ReplicatedStorage = game:GetService("ReplicatedStorage")
|
|
local client = ReplicatedStorage:WaitForChild("Client")
|
|
local targetScript = client:WaitForChild(TARGET)
|
|
local activation = require(targetScript)
|
|
activation(script)
|
|
end</string>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="LocalScript" referent="173">
|
|
<Properties>
|
|
<string name="Name">ToolSoundGlitch</string>
|
|
<string name="Source">local CollectionService = game:GetService("CollectionService")
|
|
local TeleportService = game:GetService("TeleportService")
|
|
|
|
local function onGlitchSoundAdded(glitchSound)
|
|
if TeleportService:GetTeleportSetting("SoundEquipBug") then
|
|
glitchSound.MaxDistance = 10000
|
|
glitchSound:Play()
|
|
end
|
|
end
|
|
|
|
local addSignal = CollectionService:GetInstanceAddedSignal("ToolSoundGlitch")
|
|
addSignal:Connect(onGlitchSoundAdded)</string>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="LocalScript" referent="174">
|
|
<Properties>
|
|
<string name="Name">ZoomControls</string>
|
|
<string name="Source">local UserInputService = game:GetService("UserInputService")
|
|
local GuiService = game:GetService("GuiService")
|
|
|
|
if GuiService:IsTenFootInterface() then
|
|
return
|
|
end
|
|
|
|
local IS_TOUCH = UserInputService.TouchEnabled
|
|
|
|
local player = game.Players.LocalPlayer
|
|
local playerScripts = player:WaitForChild("PlayerScripts")
|
|
local passCameraEvent = playerScripts:WaitForChild("PassCameraEvent")
|
|
|
|
local self = script.Parent
|
|
local zoomIn = self:WaitForChild("ZoomIn")
|
|
local zoomLock = zoomIn:WaitForChild("Lock")
|
|
local firstPersonIndicator = self:WaitForChild("FirstPersonIndicator")
|
|
|
|
local yellow = Color3.new(1,1,0)
|
|
local cyan = Color3.new(0,1,1)
|
|
local white = Color3.new(1,1,1)
|
|
|
|
local c = workspace.CurrentCamera
|
|
local currentlyDown
|
|
|
|
local function updateCameraStatus()
|
|
local dist = (c.Focus.p - c.CFrame.p).magnitude
|
|
firstPersonIndicator.Visible = (dist <= 1.5)
|
|
zoomLock.Visible = (dist <= 1)
|
|
end
|
|
|
|
local function setupButton(btn)
|
|
local isDown = false
|
|
local inBounds = false
|
|
local lock = btn:FindFirstChild("Lock")
|
|
local mouse = player:GetMouse()
|
|
btn.MouseEnter:connect(function ()
|
|
if (lock == nil or not lock.Visible) then
|
|
if (currentlyDown == nil or currentlyDown == btn) then
|
|
inBounds = true
|
|
if isDown then
|
|
btn.ImageColor3 = yellow
|
|
else
|
|
btn.ImageColor3 = cyan
|
|
end
|
|
end
|
|
end
|
|
end)
|
|
btn.MouseLeave:connect(function ()
|
|
if (lock == nil or not lock.Visible) then
|
|
inBounds = false
|
|
if isDown then
|
|
btn.ImageColor3 = cyan
|
|
else
|
|
btn.ImageColor3 = white
|
|
end
|
|
end
|
|
end)
|
|
btn.MouseButton1Down:connect(function ()
|
|
if (lock == nil or not lock.Visible) then
|
|
isDown = true
|
|
currentlyDown = btn
|
|
btn.ImageColor3 = yellow
|
|
end
|
|
end)
|
|
btn.MouseButton1Click:connect(function ()
|
|
if (lock == nil or not lock.Visible) then
|
|
isDown = false
|
|
currentlyDown = nil
|
|
inBounds = false
|
|
passCameraEvent:Fire(btn.Name)
|
|
if IS_TOUCH then
|
|
btn.ImageColor3 = white
|
|
end
|
|
end
|
|
end)
|
|
mouse.Button1Up:connect(function ()
|
|
if (lock == nil or not lock.Visible) then
|
|
if isDown then
|
|
isDown = false
|
|
currentlyDown = nil
|
|
if inBounds then
|
|
inBounds = false
|
|
passCameraEvent:Fire(btn.Name)
|
|
end
|
|
end
|
|
end
|
|
btn.ImageColor3 = white
|
|
end)
|
|
if lock then
|
|
lock.Changed:connect(function ()
|
|
if lock.Visible then
|
|
btn.ImageColor3 = white
|
|
isDown = false
|
|
if currentlyDown == btn then
|
|
currentlyDown = nil
|
|
end
|
|
end
|
|
end)
|
|
end
|
|
if IS_TOUCH then
|
|
btn.Modal = true
|
|
end
|
|
end
|
|
|
|
for _,v in pairs(script.Parent:GetChildren()) do
|
|
if v:IsA("ImageButton") then
|
|
setupButton(v)
|
|
end
|
|
end
|
|
|
|
c.Changed:connect(updateCameraStatus)</string>
|
|
</Properties>
|
|
</Item>
|
|
</Item>
|
|
</Item>
|
|
</roblox> |