Loading gui work, needs finished

This commit is contained in:
2023-12-28 02:40:00 -05:00
parent e55b8763f3
commit c3069d11f9
9 changed files with 273 additions and 20 deletions

View File

@@ -9,6 +9,9 @@
"ServerScriptService": { "ServerScriptService": {
"$path": "src/server" "$path": "src/server"
}, },
"ReplicatedFirst": {
"$path": "src/load"
},
"StarterPlayer": { "StarterPlayer": {
"StarterPlayerScripts": { "StarterPlayerScripts": {

View File

@@ -1,6 +1,8 @@
local CrouchModule = { local CrouchModule = {
StandHeight = 2.1, StandHeight = 2.1,
CrouchHeight = .6 CrouchHeight = .6,
WalkSpeedMultiplier = 6,
CrouchSpeed = .2
} }
CrouchModule.__index = CrouchModule CrouchModule.__index = CrouchModule
@@ -15,17 +17,21 @@ end
local CrouchTween = Tween.constructor() local CrouchTween = Tween.constructor()
function CrouchModule:Crouch(StandingWalkSpeed: number) function CrouchModule:Crouch(StandingWalkSpeed: number)
local Easing = TweenInfo.new(CrouchModule.CrouchSpeed, Enum.EasingStyle.Linear)
CrouchTween:Start(self.Humanoid, { CrouchTween:Start(self.Humanoid, {
HipHeight = CrouchModule.CrouchHeight, HipHeight = CrouchModule.CrouchHeight,
WalkSpeed = StandingWalkSpeed-6 WalkSpeed = math.max(1, StandingWalkSpeed-CrouchModule.WalkSpeedMultiplier)
}, TweenInfo.new(.4)) }, Easing)
end end
function CrouchModule:Stand(CrouchingWalkSpeed: number) function CrouchModule:Stand(CrouchingWalkSpeed: number)
local Easing = TweenInfo.new(CrouchModule.CrouchSpeed, Enum.EasingStyle.Linear)
CrouchTween:Start(self.Humanoid, { CrouchTween:Start(self.Humanoid, {
HipHeight = CrouchModule.StandHeight, HipHeight = CrouchModule.StandHeight,
WalkSpeed = CrouchingWalkSpeed+6 WalkSpeed = math.max(1, CrouchingWalkSpeed+CrouchModule.WalkSpeedMultiplier)
}, TweenInfo.new(.2)) }, Easing)
end end
return CrouchModule return CrouchModule

View File

@@ -13,7 +13,7 @@ function HumanoidRPSettings:DisableRobloxSounds()
local Object = HRP_objects[i] local Object = HRP_objects[i]
if Object:IsA("Sound") then if Object:IsA("Sound") then
Object.SoundId = "rbxassetid://0" Object.Volume = 0
end end
end end
end end

View File

@@ -1,6 +1,14 @@
local Storage = game:GetService("ReplicatedStorage") local Storage = game:GetService("ReplicatedStorage")
local ClientStorage = Storage:WaitForChild("Client") local ClientStorage = Storage:WaitForChild("Client")
local LoadCompleted = ClientStorage:WaitForChild("LoadingComplete")
--We need to wait for the game to load before spamming functionality
repeat
local GameIsLoaded = LoadCompleted:Invoke()
task.wait()
until GameIsLoaded
local HumanoidRPSettings = require(script:WaitForChild("HumanoidRootPart")) local HumanoidRPSettings = require(script:WaitForChild("HumanoidRootPart"))
local CameraModule = require(script:WaitForChild("Camera")) local CameraModule = require(script:WaitForChild("Camera"))
local CrouchModule = require(script:WaitForChild("Crouch")) local CrouchModule = require(script:WaitForChild("Crouch"))

View File

@@ -1,11 +1,29 @@
local CoreGuis = { local CoreGuis = {
IncludeReset = true --disable the reset button? AllowReset = false,
AllowEmotes = false, --controversial
AllowBackpack = false
} }
CoreGuis.__index = CoreGuis CoreGuis.__index = CoreGuis
local SG = game:GetService("StarterGui") local SG = game:GetService("StarterGui")
local Players = game:GetService("Players")
local function DisableReset(enabled: boolean) type CustomCoreGuiEnums = {Enum.CoreGuiType}
local function CustomCoreGuiEnums(): CustomCoreGuiEnums
local CoreElements = Enum.CoreGuiType:GetEnumItems()
table.remove(CoreElements, table.find(CoreElements, Enum.CoreGuiType.All))
if CoreGuis.AllowBackpack then
table.remove(CoreElements, table.find(CoreElements, Enum.CoreGuiType.Backpack))
end
if CoreGuis.AllowEmotes then
table.remove(CoreElements, table.find(CoreElements, Enum.CoreGuiType.EmotesMenu))
end
return CoreElements
end
local function ResetEnabled(enabled: boolean)
--Roblox actually doesn't register this fast enough so we gotta resort to cringe tactics --Roblox actually doesn't register this fast enough so we gotta resort to cringe tactics
repeat repeat
local PossibleMemoryLeak = pcall(SG.SetCore, SG, "ResetButtonCallback", enabled) local PossibleMemoryLeak = pcall(SG.SetCore, SG, "ResetButtonCallback", enabled)
@@ -13,18 +31,46 @@ local function DisableReset(enabled: boolean)
until PossibleMemoryLeak until PossibleMemoryLeak
end end
function CoreGuis:on() function CoreGuis:On()
SG:SetCoreGuiEnabled(Enum.CoreGuiType.All, true) local Elements = CustomCoreGuiEnums()
if CoreGuis.IncludeReset then for i = 1, #Elements do
DisableReset(true) SG:SetCoreGuiEnabled(Elements[i], true)
end end
ResetEnabled(CoreGuis.AllowReset)
end end
function CoreGuis:off() function CoreGuis:Off()
SG:SetCoreGuiEnabled(Enum.CoreGuiType.All, false) if #Players:GetPlayers()>1 then
if CoreGuis.IncludeReset then --Enable multiplayer features
DisableReset(false) self:On()
local PlayerAdded --So weird...
PlayerAdded = Players.PlayerAdded:Connect(function(_)
if #Players:GetPlayers()>1 then
self:On()
--We dont need to listen for players anymore
PlayerAdded:Disconnect()
end
end)
else
local Elements = CustomCoreGuiEnums()
for i = 1, #Elements do
SG:SetCoreGuiEnabled(Elements[i], false)
end
end end
ResetEnabled(CoreGuis.AllowReset)
end
function CoreGuis:ForceOff()
SG:SetCoreGuiEnabled(Enum.CoreGuiType.All, false)
ResetEnabled(false)
end
function CoreGuis:ForceOn()
SG:SetCoreGuiEnabled(Enum.CoreGuiType.All, true)
ResetEnabled(true)
end end
return CoreGuis return CoreGuis

View File

@@ -9,11 +9,20 @@ local Players = game:GetService("Players")
local Storage = game:GetService("ReplicatedStorage") local Storage = game:GetService("ReplicatedStorage")
local ClientStorage = Storage:WaitForChild("Client") local ClientStorage = Storage:WaitForChild("Client")
local LoadCompleted = ClientStorage:WaitForChild("LoadingComplete")
local KeyBindsModule = require(ClientStorage:WaitForChild("KeyBinds")) local KeyBindsModule = require(ClientStorage:WaitForChild("KeyBinds"))
local Player = Players.LocalPlayer local Player = Players.LocalPlayer
local PlayerGui = Player:WaitForChild("PlayerGui") local PlayerGui = Player:WaitForChild("PlayerGui")
CoreGuis:Off()
--We need to wait for the game to load before spamming functionality
repeat
local GameIsLoaded = LoadCompleted:Invoke()
task.wait()
until GameIsLoaded
local CurrentCamera = nil local CurrentCamera = nil
repeat repeat
task.wait() task.wait()
@@ -28,17 +37,16 @@ local Crosshair = CrosshairSettings.constructor(PlayerGui)
local function CameraBinds() local function CameraBinds()
local CameraBindMap = KeyBindsModule.constructor() local CameraBindMap = KeyBindsModule.constructor()
CameraBindMap:AddInputBegan(Enum.KeyCode.C, function() CameraBindMap:AddInputBegan({Enum.KeyCode.C, Enum.KeyCode.Z}, function()
Camera:ZoomIn(Vignette, Crosshair) Camera:ZoomIn(Vignette, Crosshair)
end) end)
CameraBindMap:AddInputEnded(Enum.KeyCode.C, function() CameraBindMap:AddInputEnded({Enum.KeyCode.C, Enum.KeyCode.Z}, function()
Camera:ZoomOut(Vignette, Crosshair) Camera:ZoomOut(Vignette, Crosshair)
end) end)
end end
CoreGuis:off()
Mouse:DisablePointer()
Camera:FirstPerson() Camera:FirstPerson()
Mouse:DisablePointer()
Crosshair:Enable() Crosshair:Enable()
CameraBinds() CameraBinds()

144
src/load/intro/IntroGui.lua Normal file
View File

@@ -0,0 +1,144 @@
--Not a good idea to call modules from other services here
--Who said UI on here cant look like a web design lole,
local RS = game:GetService("RunService")
local Storage = game:GetService("ReplicatedStorage")
local function GuiDependencies(IntroGui: ScreenGui): typeof(GuiDependencies)
IntroGui.Enabled = true
local Frame = IntroGui:WaitForChild("Frame")
local Viewport = Frame:WaitForChild("ViewportFrame")
local FrameGradient = Frame:WaitForChild("UIGradient")
local TextShadow = Frame:WaitForChild("TextShadow")
local FrameworkText = Frame:WaitForChild("Framework")
local SandboxText = Frame:WaitForChild("Sandbox")
local DeveloperText = Frame:WaitForChild("Developer")
local ShadowGradient = TextShadow:WaitForChild("UIGradient")
local ViewportCamera = Instance.new("Camera")
ViewportCamera.FieldOfView = 50
ViewportCamera.Parent = Viewport
Viewport.CurrentCamera = ViewportCamera
local GL_Cube = Viewport:WaitForChild("GL_Cube")
return {
IntroGui = IntroGui,
Frame = Frame,
Viewport = Viewport,
ViewportCamera = ViewportCamera,
GL_Cube = GL_Cube,
FrameGradient = FrameGradient,
ShadowGradient = ShadowGradient,
FrameworkText = FrameworkText,
SandboxText = SandboxText,
DeveloperText = DeveloperText
}
end
type GUIs = typeof(GuiDependencies)
type GL_Cube = BasePart
type GL_Side = BasePart
local function GL_Sides(GL_Cube: GL_Cube): {GL_Side}
local Sides = {}
local Cube_Sides = GL_Cube:GetChildren()
for i = 1, #Cube_Sides do
local Side = Cube_Sides[i]
Sides[Side.Name] = {
Part = Side,
CF = Side.CFrame
}
end
return Sides
end
type Stepped = RBXScriptConnection
local function GUI_LoadFinish(Stepped: Stepped, Gui: GUIs)
--We can now access the framework!
--Image if we had HTML and CSS...
local Tween = require(Storage:WaitForChild("Tween"))
local Bind_Completed = Instance.new("BindableFunction")
Bind_Completed.Name = "LoadingComplete"
Bind_Completed.Parent = Storage:WaitForChild("Client")
Bind_Completed.OnInvoke = function()
return game:IsLoaded() --or just returning a static true
end
local EaseStyle = Enum.EasingStyle.Linear
local FrameTween_Constructor = Tween.constructor(TweenInfo.new(1, EaseStyle), Gui.Frame, {
BackgroundTransparency = 1
})
local DeveloperTween_Constructor = Tween.constructor(TweenInfo.new(1, EaseStyle), Gui.DeveloperText, {
TextTransparency = 1
})
local ViewportFrame_Constructor = Tween.constructor(TweenInfo.new(3, EaseStyle), Gui.Viewport, {
Position = UDim2.fromScale(0.5, 2) --Guaranteed off screen
})
FrameTween_Constructor:Start()
DeveloperTween_Constructor:Start()
local ViewportTween = ViewportFrame_Constructor:Start() --The longest tween
task.spawn(function()
local Promise_60 = 1/60
local rhpid_text_len = #Gui.FrameworkText
local sandbox_text_len = #Gui.SandboxText.Text
for i = 1, sandbox_text_len do --"A sandbox experience" has the longest text
Gui.SandboxText.Text = Gui.SandboxText.Text:sub(rhpid_text_len)
task.wait(Promise_60)
end
end)
ViewportTween.Completed:Wait()
Stepped:Disconnect()
Gui.IntroGui:Destroy() --We dont need the intro gui anymore
end
return function(IntroGui: ScreenGui, load_elapse_start: number)
local Gui = GuiDependencies(IntroGui)
local CubeSides = GL_Sides(Gui.GL_Cube)
local Red = CubeSides.Red
local Green = CubeSides.Green
local Blue = CubeSides.Blue
local Purple = CubeSides.Purple
local Yellow = CubeSides.Yellow
local Pink = CubeSides.Pink
Gui.ViewportCamera.CFrame = CFrame.lookAt(Gui.GL_Cube.Position-Vector3.new(3,-2.5,3), Gui.GL_Cube.Position)
local Cube_CF = Gui.GL_Cube.CFrame
local Stepped = RS.Stepped:Connect(function(delta, dt)
--Magic number heaven
local ROT = CFrame.Angles(math.rad(100*math.cos(delta/8)), 0, delta/2)
local d2 = delta*10
Gui.FrameGradient.Rotation=d2
Gui.ShadowGradient.Rotation=d2*4
Gui.GL_Cube.CFrame = Cube_CF*ROT
Yellow.Part.CFrame = Gui.GL_Cube.CFrame*CFrame.new(-1,0,0)*CFrame.fromEulerAnglesYXZ(0,math.rad(90),0)
Green.Part.CFrame = Gui.GL_Cube.CFrame*CFrame.new(1,0,0)*CFrame.fromEulerAnglesYXZ(0,math.rad(90),0)
Pink.Part.CFrame = Gui.GL_Cube.CFrame*CFrame.new(0,-1,0)*CFrame.fromEulerAnglesYXZ(math.rad(-90),0,0)
Blue.Part.CFrame = Gui.GL_Cube.CFrame*CFrame.new(0,1,0)*CFrame.fromEulerAnglesYXZ(math.rad(-90),0,0)
Red.Part.CFrame = Gui.GL_Cube.CFrame*CFrame.new(0,0,1)
Purple.Part.CFrame = Gui.GL_Cube.CFrame*CFrame.new(0,0,-1)
end)
task.spawn(function()
if not game:IsLoaded() then
game.Loaded:Wait()
end
local load_elapse = os.clock()-load_elapse_start
--artifical wait but only if you dont take longer than 3 seconds to load the actual game (let me have my fun),
task.wait(math.max(0, 3-load_elapse))
GUI_LoadFinish(Stepped, Gui)
end)
end

View File

@@ -0,0 +1,34 @@
local load_elapse_start = os.clock()
local ReplicatedFirst = game:GetService("ReplicatedFirst")
local Players = game:GetService("Players")
local Storage = game:GetService("ReplicatedStorage")
local RunIntroGui = require(script:WaitForChild("IntroGui"))
local Player = Players.LocalPlayer
if not Player then
repeat
Player = Players.LocalPlayer
task.wait()
until Player
end
local PlayerGui = Player:WaitForChild("PlayerGui")
local IntroGui = PlayerGui:WaitForChild("rhpidframework_intro", 10)
if IntroGui then
--Let the magic begin
RunIntroGui(IntroGui, load_elapse_start)
else
warn("Waited 10 seconds for the intro gui without success")
local Bind_Completed = Instance.new("BindableFunction")
Bind_Completed.Name = "LoadingComplete"
Bind_Completed.Parent = Storage:WaitForChild("Client")
Bind_Completed.OnInvoke = function()
return game:IsLoaded() --or just returning a static true
end
end
ReplicatedFirst:RemoveDefaultLoadingScreen()

View File

@@ -3,6 +3,10 @@ local Lighting = require(script:WaitForChild("Lighting"))
local RS = game:GetService("RunService") local RS = game:GetService("RunService")
local Storage = game:GetService("ReplicatedStorage") local Storage = game:GetService("ReplicatedStorage")
local StarterPlayer = game:GetService("StarterPlayer")
StarterPlayer.CharacterWalkSpeed = 0
StarterPlayer.CharacterJumpHeight = 0
local ServerStorage = Storage:WaitForChild("Server") local ServerStorage = Storage:WaitForChild("Server")