diff --git a/Character/DropHats/DropHat.model.json b/Character/DropHats/DropHat.model.json new file mode 100644 index 0000000..01c01cc --- /dev/null +++ b/Character/DropHats/DropHat.model.json @@ -0,0 +1,3 @@ +{ + "ClassName": "RemoteEvent" +} \ No newline at end of file diff --git a/Character/DropHats/HatPickup/init.meta.json b/Character/DropHats/HatPickup/init.meta.json new file mode 100644 index 0000000..21cf1e8 --- /dev/null +++ b/Character/DropHats/HatPickup/init.meta.json @@ -0,0 +1,6 @@ +{ + "properties": + { + "Disabled": true + } +} \ No newline at end of file diff --git a/Character/DropHats/HatPickup.server.lua b/Character/DropHats/HatPickup/init.server.lua similarity index 100% rename from Character/DropHats/HatPickup.server.lua rename to Character/DropHats/HatPickup/init.server.lua diff --git a/DataModel/ReplicatedStorage/ChatRemote.rbxmx b/Resources/DataModel/ReplicatedStorage/ChatRemote.rbxmx similarity index 100% rename from DataModel/ReplicatedStorage/ChatRemote.rbxmx rename to Resources/DataModel/ReplicatedStorage/ChatRemote.rbxmx diff --git a/DataModel/ReplicatedStorage/RequestCharacter.rbxmx b/Resources/DataModel/ReplicatedStorage/RequestCharacter.rbxmx similarity index 100% rename from DataModel/ReplicatedStorage/RequestCharacter.rbxmx rename to Resources/DataModel/ReplicatedStorage/RequestCharacter.rbxmx diff --git a/DataModel/ReplicatedStorage/ScriptRef[SafeChatTree].txt b/Resources/DataModel/ReplicatedStorage/ScriptRef[SafeChatTree].txt similarity index 100% rename from DataModel/ReplicatedStorage/ScriptRef[SafeChatTree].txt rename to Resources/DataModel/ReplicatedStorage/ScriptRef[SafeChatTree].txt diff --git a/DataModel/ServerScriptService/ScriptRef[Badges].txt b/Resources/DataModel/ServerScriptService/ScriptRef[Badges].txt similarity index 100% rename from DataModel/ServerScriptService/ScriptRef[Badges].txt rename to Resources/DataModel/ServerScriptService/ScriptRef[Badges].txt diff --git a/DataModel/ServerScriptService/ScriptRef[Bevels].txt b/Resources/DataModel/ServerScriptService/ScriptRef[Bevels].txt similarity index 100% rename from DataModel/ServerScriptService/ScriptRef[Bevels].txt rename to Resources/DataModel/ServerScriptService/ScriptRef[Bevels].txt diff --git a/DataModel/ServerScriptService/ScriptRef[BuildTools].txt b/Resources/DataModel/ServerScriptService/ScriptRef[BuildTools].txt similarity index 100% rename from DataModel/ServerScriptService/ScriptRef[BuildTools].txt rename to Resources/DataModel/ServerScriptService/ScriptRef[BuildTools].txt diff --git a/DataModel/ServerScriptService/ScriptRef[CaptureTheFlag].txt b/Resources/DataModel/ServerScriptService/ScriptRef[CaptureTheFlag].txt similarity index 100% rename from DataModel/ServerScriptService/ScriptRef[CaptureTheFlag].txt rename to Resources/DataModel/ServerScriptService/ScriptRef[CaptureTheFlag].txt diff --git a/DataModel/ServerScriptService/ScriptRef[Characters].txt b/Resources/DataModel/ServerScriptService/ScriptRef[Characters].txt similarity index 100% rename from DataModel/ServerScriptService/ScriptRef[Characters].txt rename to Resources/DataModel/ServerScriptService/ScriptRef[Characters].txt diff --git a/DataModel/ServerScriptService/ScriptRef[Chat].txt b/Resources/DataModel/ServerScriptService/ScriptRef[Chat].txt similarity index 100% rename from DataModel/ServerScriptService/ScriptRef[Chat].txt rename to Resources/DataModel/ServerScriptService/ScriptRef[Chat].txt diff --git a/DataModel/ServerScriptService/ScriptRef[Cylinders].txt b/Resources/DataModel/ServerScriptService/ScriptRef[Cylinders].txt similarity index 100% rename from DataModel/ServerScriptService/ScriptRef[Cylinders].txt rename to Resources/DataModel/ServerScriptService/ScriptRef[Cylinders].txt diff --git a/DataModel/ServerScriptService/ScriptRef[Explosions].txt b/Resources/DataModel/ServerScriptService/ScriptRef[Explosions].txt similarity index 100% rename from DataModel/ServerScriptService/ScriptRef[Explosions].txt rename to Resources/DataModel/ServerScriptService/ScriptRef[Explosions].txt diff --git a/DataModel/ServerScriptService/ScriptRef[ForceFields].txt b/Resources/DataModel/ServerScriptService/ScriptRef[ForceFields].txt similarity index 100% rename from DataModel/ServerScriptService/ScriptRef[ForceFields].txt rename to Resources/DataModel/ServerScriptService/ScriptRef[ForceFields].txt diff --git a/DataModel/ServerScriptService/ScriptRef[HatGranter].txt b/Resources/DataModel/ServerScriptService/ScriptRef[HatGranter].txt similarity index 100% rename from DataModel/ServerScriptService/ScriptRef[HatGranter].txt rename to Resources/DataModel/ServerScriptService/ScriptRef[HatGranter].txt diff --git a/DataModel/ServerScriptService/ScriptRef[Heads].txt b/Resources/DataModel/ServerScriptService/ScriptRef[Heads].txt similarity index 100% rename from DataModel/ServerScriptService/ScriptRef[Heads].txt rename to Resources/DataModel/ServerScriptService/ScriptRef[Heads].txt diff --git a/DataModel/ServerScriptService/ScriptRef[Leaderboard].txt b/Resources/DataModel/ServerScriptService/ScriptRef[Leaderboard].txt similarity index 100% rename from DataModel/ServerScriptService/ScriptRef[Leaderboard].txt rename to Resources/DataModel/ServerScriptService/ScriptRef[Leaderboard].txt diff --git a/DataModel/ServerScriptService/ScriptRef[LoadTools].txt b/Resources/DataModel/ServerScriptService/ScriptRef[LoadTools].txt similarity index 100% rename from DataModel/ServerScriptService/ScriptRef[LoadTools].txt rename to Resources/DataModel/ServerScriptService/ScriptRef[LoadTools].txt diff --git a/DataModel/ServerScriptService/ScriptRef[Parts].txt b/Resources/DataModel/ServerScriptService/ScriptRef[Parts].txt similarity index 100% rename from DataModel/ServerScriptService/ScriptRef[Parts].txt rename to Resources/DataModel/ServerScriptService/ScriptRef[Parts].txt diff --git a/DataModel/ServerScriptService/ScriptRef[Regeneration].txt b/Resources/DataModel/ServerScriptService/ScriptRef[Regeneration].txt similarity index 100% rename from DataModel/ServerScriptService/ScriptRef[Regeneration].txt rename to Resources/DataModel/ServerScriptService/ScriptRef[Regeneration].txt diff --git a/DataModel/ServerScriptService/ScriptRef[SessionTracker].txt b/Resources/DataModel/ServerScriptService/ScriptRef[SessionTracker].txt similarity index 100% rename from DataModel/ServerScriptService/ScriptRef[SessionTracker].txt rename to Resources/DataModel/ServerScriptService/ScriptRef[SessionTracker].txt diff --git a/DataModel/ServerScriptService/ScriptRef[Time].txt b/Resources/DataModel/ServerScriptService/ScriptRef[Time].txt similarity index 100% rename from DataModel/ServerScriptService/ScriptRef[Time].txt rename to Resources/DataModel/ServerScriptService/ScriptRef[Time].txt diff --git a/DataModel/ServerStorage/CoreBevelCache/1.00 ~ 0.40 ~ 1.00.rbxmx b/Resources/DataModel/ServerStorage/CoreBevelCache/1.00 ~ 0.40 ~ 1.00.rbxmx similarity index 100% rename from DataModel/ServerStorage/CoreBevelCache/1.00 ~ 0.40 ~ 1.00.rbxmx rename to Resources/DataModel/ServerStorage/CoreBevelCache/1.00 ~ 0.40 ~ 1.00.rbxmx diff --git a/DataModel/ServerStorage/CoreBevelCache/1.00 ~ 1.00 ~ 4.00.rbxmx b/Resources/DataModel/ServerStorage/CoreBevelCache/1.00 ~ 1.00 ~ 4.00.rbxmx similarity index 100% rename from DataModel/ServerStorage/CoreBevelCache/1.00 ~ 1.00 ~ 4.00.rbxmx rename to Resources/DataModel/ServerStorage/CoreBevelCache/1.00 ~ 1.00 ~ 4.00.rbxmx diff --git a/DataModel/ServerStorage/CoreBevelCache/2.00 ~ 1.20 ~ 4.00.rbxmx b/Resources/DataModel/ServerStorage/CoreBevelCache/2.00 ~ 1.20 ~ 4.00.rbxmx similarity index 100% rename from DataModel/ServerStorage/CoreBevelCache/2.00 ~ 1.20 ~ 4.00.rbxmx rename to Resources/DataModel/ServerStorage/CoreBevelCache/2.00 ~ 1.20 ~ 4.00.rbxmx diff --git a/DataModel/ServerStorage/GrantHatToUser.rbxmx b/Resources/DataModel/ServerStorage/GrantHatToUser.rbxmx similarity index 100% rename from DataModel/ServerStorage/GrantHatToUser.rbxmx rename to Resources/DataModel/ServerStorage/GrantHatToUser.rbxmx diff --git a/DataModel/ServerStorage/InputGateway/Gateway.rbxmx b/Resources/DataModel/ServerStorage/InputGateway/Gateway.rbxmx similarity index 100% rename from DataModel/ServerStorage/InputGateway/Gateway.rbxmx rename to Resources/DataModel/ServerStorage/InputGateway/Gateway.rbxmx diff --git a/DataModel/ServerStorage/InputGateway/ScriptRef[Client].txt b/Resources/DataModel/ServerStorage/InputGateway/ScriptRef[Client].txt similarity index 100% rename from DataModel/ServerStorage/InputGateway/ScriptRef[Client].txt rename to Resources/DataModel/ServerStorage/InputGateway/ScriptRef[Client].txt diff --git a/DataModel/ServerStorage/InputGateway/ScriptRef[Server].txt b/Resources/DataModel/ServerStorage/InputGateway/ScriptRef[Server].txt similarity index 100% rename from DataModel/ServerStorage/InputGateway/ScriptRef[Server].txt rename to Resources/DataModel/ServerStorage/InputGateway/ScriptRef[Server].txt diff --git a/DataModel/StarterCharacterScripts/ScriptRef[Animate].txt b/Resources/DataModel/StarterCharacterScripts/ScriptRef[Animate].txt similarity index 100% rename from DataModel/StarterCharacterScripts/ScriptRef[Animate].txt rename to Resources/DataModel/StarterCharacterScripts/ScriptRef[Animate].txt diff --git a/DataModel/StarterCharacterScripts/ScriptRef[BouncinessReplica].txt b/Resources/DataModel/StarterCharacterScripts/ScriptRef[BouncinessReplica].txt similarity index 100% rename from DataModel/StarterCharacterScripts/ScriptRef[BouncinessReplica].txt rename to Resources/DataModel/StarterCharacterScripts/ScriptRef[BouncinessReplica].txt diff --git a/DataModel/StarterCharacterScripts/ScriptRef[DropHats].txt b/Resources/DataModel/StarterCharacterScripts/ScriptRef[DropHats].txt similarity index 100% rename from DataModel/StarterCharacterScripts/ScriptRef[DropHats].txt rename to Resources/DataModel/StarterCharacterScripts/ScriptRef[DropHats].txt diff --git a/DataModel/StarterCharacterScripts/ScriptRef[EdgeWalking].txt b/Resources/DataModel/StarterCharacterScripts/ScriptRef[EdgeWalking].txt similarity index 100% rename from DataModel/StarterCharacterScripts/ScriptRef[EdgeWalking].txt rename to Resources/DataModel/StarterCharacterScripts/ScriptRef[EdgeWalking].txt diff --git a/DataModel/StarterCharacterScripts/ScriptRef[FloorDrag].txt b/Resources/DataModel/StarterCharacterScripts/ScriptRef[FloorDrag].txt similarity index 100% rename from DataModel/StarterCharacterScripts/ScriptRef[FloorDrag].txt rename to Resources/DataModel/StarterCharacterScripts/ScriptRef[FloorDrag].txt diff --git a/DataModel/StarterCharacterScripts/ScriptRef[GoofyBalance].txt b/Resources/DataModel/StarterCharacterScripts/ScriptRef[GoofyBalance].txt similarity index 100% rename from DataModel/StarterCharacterScripts/ScriptRef[GoofyBalance].txt rename to Resources/DataModel/StarterCharacterScripts/ScriptRef[GoofyBalance].txt diff --git a/DataModel/StarterCharacterScripts/ScriptRef[GoofyMotion].txt b/Resources/DataModel/StarterCharacterScripts/ScriptRef[GoofyMotion].txt similarity index 100% rename from DataModel/StarterCharacterScripts/ScriptRef[GoofyMotion].txt rename to Resources/DataModel/StarterCharacterScripts/ScriptRef[GoofyMotion].txt diff --git a/DataModel/StarterCharacterScripts/ScriptRef[InputGateway].txt b/Resources/DataModel/StarterCharacterScripts/ScriptRef[InputGateway].txt similarity index 100% rename from DataModel/StarterCharacterScripts/ScriptRef[InputGateway].txt rename to Resources/DataModel/StarterCharacterScripts/ScriptRef[InputGateway].txt diff --git a/DataModel/StarterCharacterScripts/ScriptRef[JumpLimiter].txt b/Resources/DataModel/StarterCharacterScripts/ScriptRef[JumpLimiter].txt similarity index 100% rename from DataModel/StarterCharacterScripts/ScriptRef[JumpLimiter].txt rename to Resources/DataModel/StarterCharacterScripts/ScriptRef[JumpLimiter].txt diff --git a/DataModel/StarterCharacterScripts/ScriptRef[RetroClimbing].txt b/Resources/DataModel/StarterCharacterScripts/ScriptRef[RetroClimbing].txt similarity index 100% rename from DataModel/StarterCharacterScripts/ScriptRef[RetroClimbing].txt rename to Resources/DataModel/StarterCharacterScripts/ScriptRef[RetroClimbing].txt diff --git a/DataModel/StarterCharacterScripts/ScriptRef[Sound].txt b/Resources/DataModel/StarterCharacterScripts/ScriptRef[Sound].txt similarity index 100% rename from DataModel/StarterCharacterScripts/ScriptRef[Sound].txt rename to Resources/DataModel/StarterCharacterScripts/ScriptRef[Sound].txt diff --git a/DataModel/StarterCharacterScripts/ScriptRef[TeamColorScript].txt b/Resources/DataModel/StarterCharacterScripts/ScriptRef[TeamColorScript].txt similarity index 100% rename from DataModel/StarterCharacterScripts/ScriptRef[TeamColorScript].txt rename to Resources/DataModel/StarterCharacterScripts/ScriptRef[TeamColorScript].txt diff --git a/DataModel/StarterCharacterScripts/ScriptRef[ToolSoundGlitch].txt b/Resources/DataModel/StarterCharacterScripts/ScriptRef[ToolSoundGlitch].txt similarity index 100% rename from DataModel/StarterCharacterScripts/ScriptRef[ToolSoundGlitch].txt rename to Resources/DataModel/StarterCharacterScripts/ScriptRef[ToolSoundGlitch].txt diff --git a/DataModel/StarterGui/UI/RootFrame/Backpack/ScriptRef[BackpackScript].txt b/Resources/DataModel/StarterGui/UI/RootFrame/Backpack/ScriptRef[BackpackScript].txt similarity index 100% rename from DataModel/StarterGui/UI/RootFrame/Backpack/ScriptRef[BackpackScript].txt rename to Resources/DataModel/StarterGui/UI/RootFrame/Backpack/ScriptRef[BackpackScript].txt diff --git a/DataModel/StarterGui/UI/RootFrame/Chat/ScriptRef[ChatScript].txt b/Resources/DataModel/StarterGui/UI/RootFrame/Chat/ScriptRef[ChatScript].txt similarity index 100% rename from DataModel/StarterGui/UI/RootFrame/Chat/ScriptRef[ChatScript].txt rename to Resources/DataModel/StarterGui/UI/RootFrame/Chat/ScriptRef[ChatScript].txt diff --git a/DataModel/StarterGui/UI/RootFrame/ClassicMouse/ScriptRef[ClickToMove].txt b/Resources/DataModel/StarterGui/UI/RootFrame/ClassicMouse/ScriptRef[ClickToMove].txt similarity index 100% rename from DataModel/StarterGui/UI/RootFrame/ClassicMouse/ScriptRef[ClickToMove].txt rename to Resources/DataModel/StarterGui/UI/RootFrame/ClassicMouse/ScriptRef[ClickToMove].txt diff --git a/DataModel/StarterGui/UI/RootFrame/ClassicMouse/ScriptRef[Mouse].txt b/Resources/DataModel/StarterGui/UI/RootFrame/ClassicMouse/ScriptRef[Mouse].txt similarity index 100% rename from DataModel/StarterGui/UI/RootFrame/ClassicMouse/ScriptRef[Mouse].txt rename to Resources/DataModel/StarterGui/UI/RootFrame/ClassicMouse/ScriptRef[Mouse].txt diff --git a/DataModel/StarterGui/UI/RootFrame/Health/ScriptRef[HealthScript].txt b/Resources/DataModel/StarterGui/UI/RootFrame/Health/ScriptRef[HealthScript].txt similarity index 100% rename from DataModel/StarterGui/UI/RootFrame/Health/ScriptRef[HealthScript].txt rename to Resources/DataModel/StarterGui/UI/RootFrame/Health/ScriptRef[HealthScript].txt diff --git a/DataModel/StarterGui/UI/RootFrame/PlayerList/ScriptRef[PlayerList].txt b/Resources/DataModel/StarterGui/UI/RootFrame/PlayerList/ScriptRef[PlayerList].txt similarity index 100% rename from DataModel/StarterGui/UI/RootFrame/PlayerList/ScriptRef[PlayerList].txt rename to Resources/DataModel/StarterGui/UI/RootFrame/PlayerList/ScriptRef[PlayerList].txt diff --git a/DataModel/StarterGui/UI/RootFrame/SafeChat/ScriptRef[SafeChatScript].txt b/Resources/DataModel/StarterGui/UI/RootFrame/SafeChat/ScriptRef[SafeChatScript].txt similarity index 100% rename from DataModel/StarterGui/UI/RootFrame/SafeChat/ScriptRef[SafeChatScript].txt rename to Resources/DataModel/StarterGui/UI/RootFrame/SafeChat/ScriptRef[SafeChatScript].txt diff --git a/DataModel/StarterGui/UI/RootFrame/ScriptRef[ConsoleTweaks].txt b/Resources/DataModel/StarterGui/UI/RootFrame/ScriptRef[ConsoleTweaks].txt similarity index 100% rename from DataModel/StarterGui/UI/RootFrame/ScriptRef[ConsoleTweaks].txt rename to Resources/DataModel/StarterGui/UI/RootFrame/ScriptRef[ConsoleTweaks].txt diff --git a/DataModel/StarterGui/UI/RootFrame/ScriptRef[MessageScript].txt b/Resources/DataModel/StarterGui/UI/RootFrame/ScriptRef[MessageScript].txt similarity index 100% rename from DataModel/StarterGui/UI/RootFrame/ScriptRef[MessageScript].txt rename to Resources/DataModel/StarterGui/UI/RootFrame/ScriptRef[MessageScript].txt diff --git a/DataModel/StarterGui/UI/RootFrame/ZoomControls/ScriptRef[ZoomControls].txt b/Resources/DataModel/StarterGui/UI/RootFrame/ZoomControls/ScriptRef[ZoomControls].txt similarity index 100% rename from DataModel/StarterGui/UI/RootFrame/ZoomControls/ScriptRef[ZoomControls].txt rename to Resources/DataModel/StarterGui/UI/RootFrame/ZoomControls/ScriptRef[ZoomControls].txt diff --git a/DataModel/StarterPlayerScripts/PassCameraEvent.rbxmx b/Resources/DataModel/StarterPlayerScripts/PassCameraEvent.rbxmx similarity index 100% rename from DataModel/StarterPlayerScripts/PassCameraEvent.rbxmx rename to Resources/DataModel/StarterPlayerScripts/PassCameraEvent.rbxmx diff --git a/DataModel/StarterPlayerScripts/ScriptRef[Animator].txt b/Resources/DataModel/StarterPlayerScripts/ScriptRef[Animator].txt similarity index 100% rename from DataModel/StarterPlayerScripts/ScriptRef[Animator].txt rename to Resources/DataModel/StarterPlayerScripts/ScriptRef[Animator].txt diff --git a/DataModel/StarterPlayerScripts/ScriptRef[CharacterBevels].txt b/Resources/DataModel/StarterPlayerScripts/ScriptRef[CharacterBevels].txt similarity index 100% rename from DataModel/StarterPlayerScripts/ScriptRef[CharacterBevels].txt rename to Resources/DataModel/StarterPlayerScripts/ScriptRef[CharacterBevels].txt diff --git a/DataModel/StarterPlayerScripts/ScriptRef[Explosions].txt b/Resources/DataModel/StarterPlayerScripts/ScriptRef[Explosions].txt similarity index 100% rename from DataModel/StarterPlayerScripts/ScriptRef[Explosions].txt rename to Resources/DataModel/StarterPlayerScripts/ScriptRef[Explosions].txt diff --git a/DataModel/StarterPlayerScripts/ScriptRef[ForceFields].txt b/Resources/DataModel/StarterPlayerScripts/ScriptRef[ForceFields].txt similarity index 100% rename from DataModel/StarterPlayerScripts/ScriptRef[ForceFields].txt rename to Resources/DataModel/StarterPlayerScripts/ScriptRef[ForceFields].txt diff --git a/DataModel/StarterPlayerScripts/ScriptRef[FpsCap].txt b/Resources/DataModel/StarterPlayerScripts/ScriptRef[FpsCap].txt similarity index 100% rename from DataModel/StarterPlayerScripts/ScriptRef[FpsCap].txt rename to Resources/DataModel/StarterPlayerScripts/ScriptRef[FpsCap].txt diff --git a/DataModel/StarterPlayerScripts/ScriptRef[GamepadPatch].txt b/Resources/DataModel/StarterPlayerScripts/ScriptRef[GamepadPatch].txt similarity index 100% rename from DataModel/StarterPlayerScripts/ScriptRef[GamepadPatch].txt rename to Resources/DataModel/StarterPlayerScripts/ScriptRef[GamepadPatch].txt diff --git a/DataModel/StarterPlayerScripts/ScriptRef[HumanoidLabels].txt b/Resources/DataModel/StarterPlayerScripts/ScriptRef[HumanoidLabels].txt similarity index 100% rename from DataModel/StarterPlayerScripts/ScriptRef[HumanoidLabels].txt rename to Resources/DataModel/StarterPlayerScripts/ScriptRef[HumanoidLabels].txt diff --git a/DataModel/StarterPlayerScripts/ScriptRef[LensFlare].txt b/Resources/DataModel/StarterPlayerScripts/ScriptRef[LensFlare].txt similarity index 100% rename from DataModel/StarterPlayerScripts/ScriptRef[LensFlare].txt rename to Resources/DataModel/StarterPlayerScripts/ScriptRef[LensFlare].txt diff --git a/DataModel/StarterPlayerScripts/ScriptRef[LensFlare]/Moon.rbxmx b/Resources/DataModel/StarterPlayerScripts/ScriptRef[LensFlare]/Moon.rbxmx similarity index 100% rename from DataModel/StarterPlayerScripts/ScriptRef[LensFlare]/Moon.rbxmx rename to Resources/DataModel/StarterPlayerScripts/ScriptRef[LensFlare]/Moon.rbxmx diff --git a/DataModel/StarterPlayerScripts/ScriptRef[Moon].txt b/Resources/DataModel/StarterPlayerScripts/ScriptRef[Moon].txt similarity index 100% rename from DataModel/StarterPlayerScripts/ScriptRef[Moon].txt rename to Resources/DataModel/StarterPlayerScripts/ScriptRef[Moon].txt diff --git a/DataModel/StarterPlayerScripts/ScriptRef[Moon]/Moon.rbxmx b/Resources/DataModel/StarterPlayerScripts/ScriptRef[Moon]/Moon.rbxmx similarity index 100% rename from DataModel/StarterPlayerScripts/ScriptRef[Moon]/Moon.rbxmx rename to Resources/DataModel/StarterPlayerScripts/ScriptRef[Moon]/Moon.rbxmx diff --git a/DataModel/StarterPlayerScripts/ScriptRef[Music].txt b/Resources/DataModel/StarterPlayerScripts/ScriptRef[Music].txt similarity index 100% rename from DataModel/StarterPlayerScripts/ScriptRef[Music].txt rename to Resources/DataModel/StarterPlayerScripts/ScriptRef[Music].txt diff --git a/DataModel/StarterPlayerScripts/ScriptRef[RetroCam].txt b/Resources/DataModel/StarterPlayerScripts/ScriptRef[RetroCam].txt similarity index 100% rename from DataModel/StarterPlayerScripts/ScriptRef[RetroCam].txt rename to Resources/DataModel/StarterPlayerScripts/ScriptRef[RetroCam].txt diff --git a/DataModel/StarterPlayerScripts/ScriptRef[Sky].txt b/Resources/DataModel/StarterPlayerScripts/ScriptRef[Sky].txt similarity index 100% rename from DataModel/StarterPlayerScripts/ScriptRef[Sky].txt rename to Resources/DataModel/StarterPlayerScripts/ScriptRef[Sky].txt diff --git a/DataModel/StarterPlayerScripts/ScriptRef[Sky]/SkyAdorn.rbxmx b/Resources/DataModel/StarterPlayerScripts/ScriptRef[Sky]/SkyAdorn.rbxmx similarity index 100% rename from DataModel/StarterPlayerScripts/ScriptRef[Sky]/SkyAdorn.rbxmx rename to Resources/DataModel/StarterPlayerScripts/ScriptRef[Sky]/SkyAdorn.rbxmx diff --git a/DataModel/StarterPlayerScripts/ScriptRef[Sky]/Star.rbxmx b/Resources/DataModel/StarterPlayerScripts/ScriptRef[Sky]/Star.rbxmx similarity index 100% rename from DataModel/StarterPlayerScripts/ScriptRef[Sky]/Star.rbxmx rename to Resources/DataModel/StarterPlayerScripts/ScriptRef[Sky]/Star.rbxmx diff --git a/DataModel/StarterPlayerScripts/ScriptRef[SunRays].txt b/Resources/DataModel/StarterPlayerScripts/ScriptRef[SunRays].txt similarity index 100% rename from DataModel/StarterPlayerScripts/ScriptRef[SunRays].txt rename to Resources/DataModel/StarterPlayerScripts/ScriptRef[SunRays].txt diff --git a/DataModel/StarterPlayerScripts/ScriptRef[SunRays]/Moon.rbxmx b/Resources/DataModel/StarterPlayerScripts/ScriptRef[SunRays]/Moon.rbxmx similarity index 100% rename from DataModel/StarterPlayerScripts/ScriptRef[SunRays]/Moon.rbxmx rename to Resources/DataModel/StarterPlayerScripts/ScriptRef[SunRays]/Moon.rbxmx diff --git a/DataModel/StarterPlayerScripts/ScriptRef[ToolSoundGlitch].txt b/Resources/DataModel/StarterPlayerScripts/ScriptRef[ToolSoundGlitch].txt similarity index 100% rename from DataModel/StarterPlayerScripts/ScriptRef[ToolSoundGlitch].txt rename to Resources/DataModel/StarterPlayerScripts/ScriptRef[ToolSoundGlitch].txt diff --git a/Server/BuildTools/Dragger.client.lua b/Server/BuildTools/Dragger/init.client.lua similarity index 100% rename from Server/BuildTools/Dragger.client.lua rename to Server/BuildTools/Dragger/init.client.lua diff --git a/Server/BuildTools/Dragger/init.meta.json b/Server/BuildTools/Dragger/init.meta.json new file mode 100644 index 0000000..21cf1e8 --- /dev/null +++ b/Server/BuildTools/Dragger/init.meta.json @@ -0,0 +1,6 @@ +{ + "properties": + { + "Disabled": true + } +} \ No newline at end of file diff --git a/Test.rbxmx b/Test.rbxmx deleted file mode 100644 index e7851f3..0000000 --- a/Test.rbxmx +++ /dev/null @@ -1,14732 +0,0 @@ - - - - MainModule - 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 - - - - ReplicatedFirst - - - - JoinScript - 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" - - - - GuiRoot - - - - Topbar - - - - Buttons - 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) - - - - - Exit - - - - Exit - 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) - - - - - - Fullscreen - - - - Fullscreen - 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) - - - - - - Help - - - - Help - 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) - - - - - - - - GuiRoot - true - - true - 0 - true - false - false - null - - 0 - - - - Topbar - false - - 0 - 0 - - true - - true - - 0.698039174079895 - 0.698039174079895 - 0.698039174079895 - - 1 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 0 - false - false - 0 - null - null - null - null - - 0 - 80 - 0 - -36 - - null - 0 - false - null - - 0 - 660 - 0 - 27 - - 0 - 0 - - true - 1 - - - - Exit - true - - 0 - 0 - - true - - false - true - - 0.698039174079895 - 0.698039174079895 - 0.698039174079895 - - 0.5 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 0 - false - false - 9 - 0 - 1 - false - null - null - null - null - - 0 - 528 - 0 - 0 - - null - 0 - false - false - null - - 0 - 132 - 1 - 0 - - 0 - 0 - - - - 0.40392160415649414 - 0.40392160415649414 - 0.40392160415649414 - - true - 14 - - 0.40392160415649414 - 0.40392160415649414 - 0.40392160415649414 - - 0.8999999761581421 - 0.30000001192092896 - 0 - true - 0 - 1 - true - 1 - - - - UITextSizeConstraint - true - - 20 - 1 - - - - - - - Help - true - - 0 - 0 - - true - - false - true - - 0.698039174079895 - 0.698039174079895 - 0.698039174079895 - - 0.5 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 0 - false - false - 9 - 0 - 1 - false - null - null - null - null - - 0 - 396 - 0 - 0 - - null - 0 - false - false - null - - 0 - 132 - 1 - 0 - - 0 - 0 - - - - 0.40392160415649414 - 0.40392160415649414 - 0.40392160415649414 - - true - 14 - - 0.40392160415649414 - 0.40392160415649414 - 0.40392160415649414 - - 0.8999999761581421 - 0.30000001192092896 - 0 - true - 0 - 1 - true - 1 - - - - UITextSizeConstraint - true - - 20 - 1 - - - - - - - Fullscreen - true - - 0 - 0 - - true - - false - true - - 0.698039174079895 - 0.698039174079895 - 0.698039174079895 - - 0.5 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 0 - false - false - 9 - 0 - 1 - false - null - null - null - null - - 0 - 264 - 0 - 0 - - null - 0 - false - false - null - - 0 - 132 - 1 - 0 - - 0 - 0 - - - - 0.40392160415649414 - 0.40392160415649414 - 0.40392160415649414 - - true - 14 - - 0.40392160415649414 - 0.40392160415649414 - 0.40392160415649414 - - 0.8999999761581421 - 0.30000001192092896 - 0 - true - 0 - 1 - true - 1 - - - - UITextSizeConstraint - true - - 20 - 1 - - - - - - - Insert - false - - 0 - 0 - - true - - false - true - - 0.698039174079895 - 0.698039174079895 - 0.698039174079895 - - 0.5 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 0 - false - false - 9 - 0 - 1 - false - null - null - null - null - - 0 - 132 - 0 - 0 - - null - 0 - true - false - null - - 0 - 132 - 1 - 0 - - 0 - 0 - - - - 0.6274510025978088 - 0.6274510025978088 - 0.6274510025978088 - - true - 14 - - 0.6274510025978088 - 0.6274510025978088 - 0.6274510025978088 - - 0.8999999761581421 - 0.30000001192092896 - 0 - true - 0 - 1 - true - 1 - - - - UITextSizeConstraint - true - - 20 - 1 - - - - - - - Tools - false - - 0 - 0 - - true - - false - true - - 0.698039174079895 - 0.698039174079895 - 0.698039174079895 - - 0.5 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 0 - false - false - 9 - 0 - 1 - false - null - null - null - null - - 0 - 0 - 0 - 0 - - null - 0 - true - false - null - - 0 - 132 - 1 - 0 - - 0 - 0 - - - - 0.6274510025978088 - 0.6274510025978088 - 0.6274510025978088 - - true - 14 - - 0.6274510025978088 - 0.6274510025978088 - 0.6274510025978088 - - 0.8999999761581421 - 0.30000001192092896 - 0 - true - 0 - 1 - true - 1 - - - - UITextSizeConstraint - true - - 20 - 1 - - - - - - - - MessageGui - false - - 0.5 - 0.5 - - true - - true - - 0.7058823704719543 - 0.7058823704719543 - 0.7058823704719543 - - 0.5 - - 1 - 1 - 1 - - 0 - 3 - false - false - 0 - null - null - null - null - - 0.5 - 0 - 0.5 - 0 - - null - 0 - false - null - - 0.6000000238418579 - 0 - 1 - 0 - - 0 - 0 - - false - 1 - - - - Message - false - - 0 - 0.5 - - true - - true - - 1 - 1 - 1 - - 1 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 1 - false - false - 9 - 0 - 1 - null - null - null - null - - 0 - 0 - 0.5 - 0 - - null - 0 - false - null - - 1 - 0 - 0.125 - 0 - - 0 - - Connecting to server... - - 1 - 1 - 1 - - true - 14 - - 1 - 1 - 1 - - 0.75 - 0 - 0 - true - 2 - 1 - true - 1 - - - - - UIAspectRatioConstraint - true - 3 - 0 - - 1 - - - - - - ExitOverride - false - - 0 - 0.5 - - true - - true - - 1 - 1 - 1 - - 1 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 1 - false - false - 9 - 0 - 1 - null - null - null - null - - 0 - 0 - 0.5 - 0 - - null - 0 - false - null - - 1 - 0 - 0.25 - 0 - - 0 - - You are now being returned to the main menu. -Please hold... - - 1 - 1 - 1 - - true - 14 - - 1 - 1 - 1 - - 0.75 - 0 - 0 - true - 2 - 1 - false - 1 - - - - - - HelpWindow - true - - 0.5 - 0.5 - - true - - true - - 1 - 1 - 1 - - 1 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 1 - false - true - - rbxassetid://1041546985 - - - 1 - 1 - 1 - - - 0 - 0 - - - 0 - 0 - - 0 - 0 - null - null - null - null - - 0.5 - 0 - 0.5 - 0 - - null - 0 - 1 - false - null - - 0.800000011920929 - 0 - 0.699999988079071 - 0 - - 0 - - - 4 - 30 - - - 304 - 130 - - - 1 - - - 1 - 0 - 1 - 0 - - false - 1 - - - - Help - false - - 0 - 0 - - true - - true - - 1 - 1 - 1 - - 0 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 0 - false - false - - rbxassetid://1041647615 - - - 1 - 1 - 1 - - - 0 - 0 - - - 0 - 0 - - 0 - 0 - null - null - null - null - - 0 - 4 - 0 - 31 - - null - 0 - 0 - false - null - - 1 - -8 - 1 - -36 - - 0 - - - 0 - 0 - - - 0 - 0 - - - 1 - - - 1 - 0 - 1 - 0 - - true - 1 - - - - UIAspectRatioConstraint - true - 2.75 - 0 - - 0 - - - - - - - Title - false - - 0 - 0 - - true - - true - - 1 - 1 - 1 - - 1 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 1 - false - false - 2 - 0 - 1 - null - null - null - null - - 0 - 5 - 0 - 0 - - null - 0 - false - null - - 0.8999999761581421 - -10 - 0 - 30 - - 0 - - ROBLOX Help - - 1 - 1 - 1 - - false - 14 - - 0.498039186000824 - 0.498039186000824 - 0.498039186000824 - - 0.6000000238418579 - 0 - 0 - false - 0 - 1 - true - 2 - - - - Stroke - false - - 0 - 0 - - true - - true - - 1 - 1 - 1 - - 1 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 1 - false - false - 2 - 0 - 1 - null - null - null - null - - 0 - 1 - 0 - 1 - - null - 0 - false - null - - 1 - 0 - 1 - 0 - - 0 - - ROBLOX Help - - 0 - 0 - 0 - - false - 14 - - 1 - 1 - 1 - - 1 - 0 - 0 - false - 0 - 1 - true - 1 - - - - - - Close - true - - 1 - 0 - - true - - true - true - - 1 - 1 - 1 - - 1 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 1 - false - false - - - - - - rbxassetid://1041651899 - - - 1 - 1 - 1 - - - 0 - 0 - - - 0 - 0 - - 0 - 0 - true - null - null - null - null - - 1 - -5 - 0 - 5 - - - - - - null - 0 - 0 - true - false - null - - 0 - 22 - 0 - 22 - - 1 - - - 0 - 0 - - - 0 - 0 - - - 1 - 0 - - - 1 - 0 - 1 - 0 - - true - 1 - - - - - UIAspectRatioConstraint - true - 2.5 - 0 - - 0 - - - - - - - - - - ReplicatedStorage - - - - SafeChatTree - 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 - - - - RawTreeData - 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 -]==] - - - - - - - ServerScriptService - - - - Badges - 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) - -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - - - - - Bevels - ------------------------------------------------------------------------------------------------ --- 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 - ------------------------------------------------------------------------------------------------- - - - - - BuildTools - 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 - - - - Dragger - 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) - ----------------------------------------------------------------------------------------------------------------------------------------------------------------- - - - - - - CaptureTheFlag - 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) - ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - - - - - Characters - 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) - - - - - Chat - 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) - - - - - Cylinders - - - - - CylinderSurface - true - null - false - true - - true - - 100 - 100 - - false - true - 1 - 0 - 50 - true - null - 0 - - 0 - 0 - 0 - - - - Frame - false - - 0.5 - 0.5 - - true - - true - - 0.32549020648002625 - 0.32549020648002625 - 0.32549020648002625 - - 0 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 0 - false - false - 0 - null - null - null - null - - 0.5 - 0 - 0.5 - 0 - - null - 0 - false - null - - 0 - 20 - 0.699999988079071 - 0 - - 0 - 0 - - true - 1 - - - - - Frame - false - - 0.5 - 0.5 - - true - - true - - 0.32549020648002625 - 0.32549020648002625 - 0.32549020648002625 - - 0 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 0 - false - false - 0 - null - null - null - null - - 0.5 - 0 - 0.5 - 0 - - null - 0 - false - null - - 0.699999988079071 - 0 - 0 - 20 - - 0 - 0 - - true - 1 - - - - - - - Explosions - 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) - - - - - ForceFields - 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) - - - - - HatGranter - 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) - - - - - Heads - 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) - - - - - InputGateway - 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) - - - - - Leaderboard - 0) then CTF_mode = true end - -for _,v in pairs(game.Players:GetPlayers()) do - onPlayerEntered(v) -end - -game.Players.ChildAdded:connect(onPlayerEntered) - - -]]> - - - - - LoadTools - 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 - - - - - Part - - - - - - Regeneration - 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 - - - - - SessionTracker - 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 - ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - - - - - Time - - - - - - - StarterCharacterScripts - - - - Animate - 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) - - - - - Bounciness - 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) - - - - - DropHats - 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) - - - - HatPickup - - - - - - LocalDropHat - 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) - - - - - - EdgeWalking - 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 - - - - - FloorDrag - 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) - - - - - GoofyBalance - 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) - - - - - GoofyMotion - 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 - - - - - InputGateway - 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) - - - - - JumpLimiter - - - - - - RetroClimbing - -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --- 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 - --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - - - - - Sound - 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) -]]> - - - - - TeamColors - 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) - - - - - ToolSoundGlitch - -- 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) - - - - - - StarterGui - - - - UI - - - - Backpack - ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --- @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 - - - - SlotTemp - true - - 0 - 0 - - true - - false - true - - 0.7058823704719543 - 0.7058823704719543 - 0.7058823704719543 - - 1 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 0 - false - false - 3 - 0 - 1 - false - null - null - null - null - - 0 - 0 - 0 - 0 - - null - 0 - false - false - null - - 1 - 0 - 1 - 0 - - 0 - 0 - - - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - false - 14 - - 0 - 0 - 0 - - 1 - 0 - 0 - false - 2 - 1 - false - 1 - - - - Index - true - - 0 - 1 - - true - - true - - 0.6666666865348816 - 0.6666666865348816 - 0.6666666865348816 - - 0 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 0 - false - false - 9 - 0 - 1 - null - null - null - null - - 0.029999999329447746 - 2 - 0.9700000286102295 - -2 - - null - 0 - false - null - - 0.20000000298023224 - 0 - 0.20000000298023224 - 0 - - 2 - - 1 - - 1 - 1 - 1 - - true - 14 - - 1 - 1 - 1 - - 0.800000011920929 - 0 - 0 - true - 2 - 1 - true - 3 - - - - UITextSizeConstraint - true - - 20 - 1 - - - - - - - SelectionOutline - false - - 0 - 0 - - true - - true - - 0 - 1 - 0 - - 1 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 0 - false - false - 0 - null - null - null - null - - 0 - -1 - 0 - -1 - - null - 0 - false - null - - 1 - 2 - 1 - 2 - - 0 - 0 - - false - 1 - - - - Outline - false - - 0 - 0 - - true - - true - - 0 - 1 - 0 - - 0 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 0 - false - false - 0 - null - null - null - null - - 0 - 0 - 0.9700000286102295 - 0 - - null - 0 - false - null - - 1 - 0 - 0.029999999329447746 - 0 - - 0 - 0 - - true - 3 - - - - - Outline - false - - 0 - 0 - - true - - true - - 0 - 1 - 0 - - 0 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 0 - false - false - 0 - null - null - null - null - - 0.9700000286102295 - 0 - 0 - 0 - - null - 0 - false - null - - 0.029999999329447746 - 0 - 1 - 0 - - 0 - 0 - - true - 3 - - - - - Outline - false - - 0 - 0 - - true - - true - - 0 - 1 - 0 - - 0 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 0 - false - false - 0 - null - null - null - null - - 0 - 0 - 0 - 0 - - null - 0 - false - null - - 0.029999999329447746 - 0 - 1 - 0 - - 0 - 0 - - true - 3 - - - - - Outline - false - - 0 - 0 - - true - - true - - 0 - 1 - 0 - - 0 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 0 - false - false - 0 - null - null - null - null - - 0 - 0 - 0 - 0 - - null - 0 - false - null - - 1 - 0 - 0.029999999329447746 - 0 - - 0 - 0 - - true - 3 - - - - - - TextHover - false - - 0 - 0 - - true - - true - - 0.7058823704719543 - 0.7058823704719543 - 0.7058823704719543 - - 1 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 0 - false - false - 0 - null - null - null - null - - 0 - 0 - 0 - 0 - - null - 0 - false - null - - 1 - 0 - 1 - 0 - - 0 - 0 - - false - 3 - - - - - ToolIcon - false - - 0 - 0 - - true - - true - - 1 - 1 - 1 - - 1 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 0 - false - false - - - - - - 1 - 1 - 1 - - - 0 - 0 - - - 0 - 0 - - 0 - 0 - null - null - null - null - - 0.15000000596046448 - 0 - 0.15000000596046448 - 0 - - null - 0 - 0 - false - null - - 0.699999988079071 - 0 - 0.699999988079071 - 0 - - 0 - - - 0 - 0 - - - 0 - 0 - - - 1 - - - 1 - 0 - 1 - 0 - - true - 4 - - - - - ToolName - true - - 0 - 0.5 - - true - - true - - 1 - 1 - 1 - - 1 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 0 - false - false - 9 - 0 - 1 - null - null - null - null - - 0.10000000149011612 - 0 - 0.4749999940395355 - 0 - - null - 0 - false - null - - 2 - 0 - 0.17000000178813934 - 0 - - 0 - - Tool - - 1 - 1 - 1 - - true - 100 - - 0.498039186000824 - 0.498039186000824 - 0.498039186000824 - - 0.5 - 0.20000000298023224 - 0 - true - 0 - 1 - true - 4 - - - - - - - Chat - -------------------------------------------------------------------------------------------- --- 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) - --------------------------------------------------------------------------------------------- - - - - GetCoreGateway - 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 - - - - - LinkedList - 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 - - - - - MessageTemplate - false - - 0 - 0 - - true - - true - - 0.6000000238418579 - 0.6000000238418579 - 0.6000000238418579 - - 0.6000000238418579 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 0 - false - false - 0 - null - null - null - null - - 0 - 0 - 0 - 0 - - null - 0 - false - null - - 0 - 0 - 0 - 16 - - 0 - 0 - - true - 1 - - - - Message - false - - 0 - 0 - - true - - true - - 1 - 1 - 1 - - 1 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 0 - false - false - 9 - 1 - 1 - null - null - null - null - - 0 - 0 - 0 - 0 - - null - 0 - false - null - - 0 - 0 - 1 - 0 - - 0 - - - - 1 - 1 - 1 - - false - 16 - - 1 - 1 - 1 - - 0.8999999761581421 - 0 - 0 - false - 0 - 1 - true - 1 - - - - - PlayerName - false - - 0 - 0 - - true - - true - - 1 - 1 - 1 - - 1 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 0 - false - false - 9 - 0 - 1 - null - null - null - null - - 0 - 0 - 0 - 0 - - null - 0 - false - null - - 0 - 0 - 1 - 0 - - 0 - - - - 0 - 0 - 0 - - false - 16 - - 0 - 0 - 0 - - 0.8999999761581421 - 0 - 0 - false - 0 - 1 - true - 1 - - - - - AutoLayout - true - - 0 - 1 - - 0 - 0 - - 2 - - 1 - - - - - - - Health - 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) - - - - - Messages - 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) - - - - Hint - false - - 0 - 1 - - true - - true - - 0 - 0 - 0 - - 0 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 1 - false - false - 9 - 0 - 1 - null - null - null - null - - 0 - 0 - 1 - 0 - - null - 0 - false - null - - 1 - 0 - 0 - 20 - - 0 - - - - 0.8823530077934265 - 0.8823530077934265 - 0.8823530077934265 - - false - 16 - - 0.7843137979507446 - 0.7843137979507446 - 0.7843137979507446 - - 0.8999999761581421 - 0 - 0 - false - 2 - 2 - true - 1 - - - - - Message - false - - 0 - 0 - - true - - true - - 0.498039186000824 - 0.498039186000824 - 0.498039186000824 - - 0.5 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 0 - false - false - 9 - 0 - 1 - null - null - null - null - - 0 - 0 - 0 - -36 - - null - 0 - false - null - - 1 - 0 - 1 - 36 - - 0 - - - - 1 - 1 - 1 - - false - 18 - - 0 - 0 - 0 - - 0.10000000149011612 - 0.10000000149011612 - 0 - true - 2 - 1 - false - 1 - - - - - Player - false - - 0 - 0 - - true - - true - - 0.5882353186607361 - 0.5882353186607361 - 0.5882353186607361 - - 0.5 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 0 - false - false - 9 - 0 - 1 - null - null - null - null - - 0 - 32 - 0 - 5 - - null - 0 - false - null - - 0.25 - 0 - 0.25 - 0 - - 0 - - Test - - 1 - 1 - 1 - - false - 18 - - 0 - 0 - 0 - - 0.10000000149011612 - 0.10000000149011612 - 0 - true - 2 - 1 - true - 10 - - - - - - PlayerList - 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) - --------------------------------------------------------------------------------------------------------------------------------------- - - - - BaseGroup - false - - 0 - 0 - - true - - true - - 1 - 1 - 1 - - 1 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 1 - false - false - -9999 - null - null - null - null - - 0 - 0 - 0 - 0 - - null - 0 - false - null - - 1 - 0 - 1 - 0 - - 0 - 0 - - true - 1 - - - - Footer - false - - 0 - 0 - - true - - true - - 0 - 1 - 0 - - 1 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 1 - false - false - 999999999 - null - null - null - null - - 0 - 0 - 0 - 0 - - null - 0 - false - null - - 1 - 0 - 0.16500000655651093 - 0 - - 0 - 0 - - false - 1 - - - - - Header - false - - 0 - 0 - - true - - true - - 0 - 0 - 0 - - 1 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 1 - false - false - -9999999 - null - null - null - null - - 0 - 0 - 0 - 0 - - null - 0 - false - null - - 1 - 0 - 0.3330000042915344 - 0 - - 0 - 0 - - true - 1 - - - - Title - false - - 1 - 0 - - true - - true - - 0 - 0 - 0 - - 1 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 1 - false - false - 9 - 0 - 1 - null - null - null - null - - 0 - 0 - 0 - 0 - - null - 0 - false - null - - 1 - 0 - 1 - 0 - - 0 - - Player List - - 1 - 1 - 1 - - true - 14 - - 0 - 0 - 0 - - 1 - 0 - 0 - true - 0 - 1 - true - 2 - - - - - Stats - false - - 0 - 0 - - true - - true - - 0 - 0 - 0 - - 1 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 1 - false - false - 0 - null - null - null - null - - 0 - 0 - 0 - 0 - - null - 0 - false - null - - 0.75 - 0 - 1 - 0 - - 0 - 0 - - true - 1 - - - - - TeamUnderline - false - - 0 - 0 - - true - - true - - 1 - 1 - 1 - - 0 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 0 - false - false - 0 - null - null - null - null - - -1 - 2 - 0.875 - 0 - - null - 0 - false - null - - 1 - -4 - 0 - 1 - - 0 - 0 - - false - 2 - - - - - - ListLayout - true - - 1 - 1 - - 0 - 0 - - 2 - - 1 - - - - - - BasePlayerLbl - false - - 0 - 0 - - true - - true - - 0 - 1 - 0 - - 1 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 1 - false - false - 0 - null - null - null - null - - 0 - 0 - 0 - 0 - - null - 0 - false - null - - 1 - 0 - 0.33329999446868896 - 0 - - 0 - 0 - - true - 1 - - - - PlayerName - false - - 1 - 0 - - true - - true - - 0 - 0 - 0 - - 1 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 1 - false - false - 9 - 0 - 1 - null - null - null - null - - 0 - 0 - 0 - 0 - - null - 0 - false - null - - 1 - 0 - 1 - 0 - - 0 - - OnlyTwentyCharacters - - 1 - 1 - 1 - - true - 14 - - 0 - 0 - 0 - - 1 - 0 - 0 - true - 0 - 1 - true - 2 - - - - - Stats - false - - 0 - 0 - - true - - true - - 0 - 0 - 0 - - 1 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 1 - false - false - 0 - null - null - null - null - - 0 - 0 - 0 - 0 - - null - 0 - false - null - - 0.75 - 0 - 1 - 0 - - 0 - 0 - - true - 1 - - - - - - BaseStat - false - - 0 - 0 - - true - - true - - 0 - 0 - 0 - - 1 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 1 - false - false - 9 - 0 - 1 - null - null - null - null - - 0 - 0 - 0 - 0 - - null - 0 - false - null - - 1 - 0 - 1 - 0 - - 0 - - 0 - - 1 - 1 - 1 - - true - 14 - - 0 - 0 - 0 - - 1 - 0 - 0 - true - 0 - 1 - true - 2 - - - - - - RootFrame - false - - 0 - 0 - - - true - - 1 - 1 - 1 - - 1 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 1 - false - false - 0 - null - null - null - null - - 0 - 0 - 0 - 0 - - null - 0 - false - null - - 1 - 0 - 1 - 0 - - 0 - 0 - - true - 1 - - - - ChatPadding - - - 0 - 20 - - - 0 - 0 - - - 0 - 0 - - - 0 - 0 - - - - - - - ClassicMouse - false - - 0.5 - 0.5 - - - true - - 1 - 1 - 1 - - 1 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 1 - false - false - - rbxassetid://334630296 - - - 1 - 1 - 1 - - - 0 - 0 - - - 0 - 0 - - 0 - 0 - null - null - null - null - - 0.5 - 0 - 0.5 - 0 - - null - 0 - 0 - false - null - - 0 - 80 - 0 - 80 - - 0 - - - 0 - 0 - - - 0 - 0 - - - 1 - - - 1 - 0 - 1 - 0 - - true - 10 - - - - - SafeChat - true - - 0 - 1 - - - true - true - - 1 - 1 - 1 - - 1 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 0 - false - false - - - - - - rbxassetid://991182833 - - - 1 - 1 - 1 - - - 0 - 0 - - - 0 - 0 - - 0 - 0 - false - null - null - null - null - - 0 - 22 - 0.75 - 0 - - - - - - null - 0 - 0 - true - false - null - - 0 - 32 - 0 - 30 - - 0 - - - 0 - 0 - - - 0 - 0 - - - 1 - 0 - - - 1 - 0 - 1 - 0 - - true - 2 - - - - GamepadHint - false - - 0.5 - 0.75 - - - true - - 1 - 1 - 1 - - 1 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 1 - false - false - - rbxasset://textures/ui/Settings/Help/XButtonDark@2x.png - - - 1 - 1 - 1 - - - 0 - 0 - - - 0 - 0 - - 0 - 0 - null - null - null - null - - 1 - 5 - 0 - 0 - - null - 0 - 0 - false - null - - 0.75 - 0 - 0.75 - 0 - - 2 - - - 0 - 0 - - - 0 - 0 - - - 1 - - - 1 - 0 - 1 - 0 - - false - 1 - - - - - - ZoomControls - false - - 1 - 1 - - - true - - 1 - 1 - 1 - - 1 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 1 - false - false - 0 - null - null - null - null - - 1 - 0 - 1 - 0 - - null - 0 - false - null - - 0 - 70 - 0 - 70 - - 0 - 0 - - true - 1 - - - - RotateUp - true - - 0 - 0 - - - true - true - - 1 - 1 - 1 - - 1 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 0 - false - false - - - - - - rbxassetid://598662248 - - - 1 - 1 - 1 - - - 0 - 0 - - - 0 - 0 - - 0 - 0 - false - null - null - null - null - - 0 - 0 - 0 - 0 - - - - - - null - 0 - 0 - true - false - null - - 0 - 35 - 0 - 35 - - 0 - - - 0 - 0 - - - 0 - 0 - - - 1 - 0 - - - 1 - 0 - 1 - 0 - - true - 2 - - - - - RotateDown - true - - 0 - 0 - - - true - true - - 1 - 1 - 1 - - 1 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 0 - false - false - - - - - - rbxassetid://598662248 - - - 1 - 1 - 1 - - - 0 - 0 - - - 0 - 0 - - 0 - 0 - false - null - null - null - null - - 0 - 0 - 0 - 35 - - - - - - null - -180 - 0 - true - false - null - - 0 - 35 - 0 - 35 - - 0 - - - 0 - 0 - - - 0 - 0 - - - 1 - 0 - - - 1 - 0 - 1 - 0 - - true - 2 - - - - - ZoomIn - true - - 0 - 0 - - - true - true - - 1 - 1 - 1 - - 1 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 0 - false - false - - - - - - rbxassetid://598663795 - - - 1 - 1 - 1 - - - 0 - 0 - - - 0 - 0 - - 0 - 0 - false - null - null - null - null - - 0 - 35 - 0 - 0 - - - - - - null - 0 - 0 - true - false - null - - 0 - 35 - 0 - 35 - - 0 - - - 0 - 0 - - - 0 - 0 - - - 1 - 0 - - - 1 - 0 - 1 - 0 - - true - 2 - - - - Lock - false - - 0 - 0 - - - true - - 1 - 1 - 1 - - 0.5 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 0 - false - false - 0 - null - null - null - null - - 0 - 0 - 0 - 0 - - null - 0 - false - null - - 0 - 35 - 0 - 35 - - 0 - 0 - - false - 3 - - - - - - ZoomOut - true - - 0 - 0 - - - true - true - - 1 - 1 - 1 - - 1 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 0 - false - false - - - - - - rbxassetid://598665130 - - - 1 - 1 - 1 - - - 0 - 0 - - - 0 - 0 - - 0 - 0 - false - null - null - null - null - - 0 - 35 - 0 - 35 - - - - - - null - 0 - 0 - true - false - null - - 0 - 35 - 0 - 35 - - 0 - - - 0 - 0 - - - 0 - 0 - - - 1 - 0 - - - 1 - 0 - 1 - 0 - - true - 2 - - - - - FirstPersonIndicator - false - - 1 - 0 - - - true - - 1 - 1 - 1 - - 1 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 1 - false - false - - rbxassetid://598702035 - - - 1 - 1 - 1 - - - 0 - 0 - - - 0 - 0 - - 0 - 0 - null - null - null - null - - 1 - 0 - 0 - -97 - - null - 0 - 0 - false - null - - 0 - 168 - 0 - 42 - - 0 - - - 0 - 0 - - - 0 - 0 - - - 1 - - - 1 - 0 - 1 - 0 - - false - 2 - - - - - - Health - false - - 1 - 0.5 - - - true - - 1 - 1 - 1 - - 1 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 0 - false - false - 0 - null - null - null - null - - 1 - -31 - 0.5 - 0 - - null - 0 - false - null - - 0 - 66 - 0 - 137 - - 0 - 0 - - true - 1 - - - - RedBar - false - - 0.5 - 0 - - - true - - 1 - 0 - 0 - - 0 - - 1 - 0 - 0 - - 0 - 0 - false - false - 0 - null - null - null - null - - 0.5 - 0 - 0 - 0 - - null - 0 - false - null - - 0 - 12 - 0 - 112 - - 0 - 0 - - true - 2 - - - - GreenBar - false - - 0.5 - 1 - - - true - - 0.5058823823928833 - 0.7725490927696228 - 0.08627451211214066 - - 0 - - 0.5058823823928833 - 0.7725490927696228 - 0.08627451211214066 - - 0 - 0 - false - false - 0 - null - null - null - null - - 0.5 - 0 - 1 - 0 - - null - 0 - false - null - - 1 - 0 - 1 - 0 - - 0 - 0 - - true - 3 - - - - - - HealthLbl - false - - 0 - 0 - - - true - - 1 - 1 - 1 - - 1 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 1 - false - false - 9 - 0 - 1 - null - null - null - null - - 0 - 0 - 1 - -24 - - null - 0 - false - null - - 1 - 0 - 0 - 24 - - 0 - - Health - - 0 - 0 - 1 - - true - 18 - - 0 - 0 - 1 - - 0.8999999761581421 - 0 - 0 - true - 2 - 1 - true - 2 - - - - - - Chat - false - - 0 - 0 - - - true - - 1 - 1 - 1 - - 1 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 1 - false - false - 0 - null - null - null - null - - 0 - 0 - 0 - 0 - - null - 0 - false - null - - 1 - 0 - 1 - 0 - - 0 - 0 - - true - 1 - - - - ChatBar - true - - 1 - 0 - - - true - - 1 - 1 - 1 - - 1 - - 0.16862750053405762 - 0.16862750053405762 - 0.16862750053405762 - - 0 - 0 - true - false - false - 4 - 0 - 1 - false - null - null - null - null - - 1 - 1 - 0.7843137979507446 - - To chat click here or press the "/" key - - 1 - 0 - 1 - 0 - - null - 0 - true - null - true - - 1 - -3 - 0 - 15 - - 0 - - - - 0 - 0 - 0 - - true - false - 15 - - 0 - 0 - 0 - - 1 - 0 - 0 - false - 0 - 1 - true - 3 - - - - FocusBackdrop - false - - 1 - 0 - - - true - - 1 - 1 - 1 - - 0 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 0 - false - false - 0 - null - null - null - null - - 1 - 0 - 0 - 0 - - null - 0 - false - null - - 1 - 3 - 1 - 0 - - 0 - 0 - - false - 2 - - - - - - MainBackdrop - false - - 0 - 0 - - - true - - 0.250980406999588 - 0.250980406999588 - 0.250980406999588 - - 0 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 0 - false - false - 0 - null - null - null - null - - 0 - 0 - 1 - 0 - - null - 0 - false - null - - 1 - 0 - 0 - 20 - - 0 - 0 - - true - 1 - - - - - ChatOutput - false - - 0 - 0 - - - true - - 1 - 1 - 1 - - 1 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 1 - true - false - 0 - null - null - null - null - - 0 - 23 - 0 - 29 - - null - 0 - false - null - - 1 - 0 - 0 - 96 - - 0 - 0 - - true - 1 - - - - Stream - - 1 - 1 - - 0 - 0 - - 2 - - 2 - - - - - - - Backpack - true - - 0 - 1 - - - true - - 0.498039186000824 - 0.498039186000824 - 0.498039186000824 - - 1 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 0 - false - false - 0 - null - null - null - null - - 0 - 0 - 1 - 0 - - null - 0 - false - null - - 1 - 0 - 1 - 0 - - 2 - 0 - - true - 1 - - - - UIScale - - 0.13300000131130219 - - - - - - Backdrop - false - - 0 - 0 - - - true - - 0.7058823704719543 - 0.7058823704719543 - 0.7058823704719543 - - 0.5 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 0 - false - false - 0 - null - null - null - null - - 0 - 0 - 0 - 0 - - null - 0 - false - null - - 0 - 0 - 1 - 0 - - 0 - 0 - - true - 2 - - - - - Slots - false - - 0 - 0 - - - true - - 1 - 1 - 1 - - 1 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 1 - false - false - 0 - null - null - null - null - - 0 - 0 - 0 - 0 - - null - 0 - false - null - - 1 - 0 - 1 - 0 - - 0 - 0 - - true - 1 - - - - UIListLayout - - 0 - 1 - - 0 - 0 - - 2 - - 1 - - - - - - - PlayerList - false - - 0 - 0 - - - true - - 1 - 1 - 1 - - 1 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 1 - false - false - 0 - null - null - null - null - - 0 - 0 - 0 - -36 - - null - 0 - false - null - - 1 - 0 - 1 - 36 - - 0 - 0 - - true - 1 - - - - Backdrop - false - - 1 - 0 - - - true - - 0.6000000238418579 - 0.6000000238418579 - 0.6000000238418579 - - 0.4000000059604645 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 0 - false - false - 0 - null - null - null - null - - 1 - -10 - 0 - 10 - - null - 0 - false - null - - 0 - 10 - 0 - 10 - - 0 - 0 - - true - 1 - - - - - Container - false - - 0 - 0 - - - true - - 0 - 0 - 0 - - 1 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 0 - false - false - 0 - null - null - null - null - - 1 - -10 - 0 - 10 - - null - 0 - false - null - - 0.16500000655651093 - 0 - 1 - 0 - - 0 - 0 - - true - 1 - - - - AspectRatio - 3 - 0 - - 0 - - - - - - - - - SafeChat - 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) - - - - Click - true - - 10 - false - 10000 - false - 1 - false - 0 - null - - rbxasset://sounds/switch.mp3 - - - 0 - 0.5 - 10 - - - - - NullSelectionImageObject - false - - 0 - 0 - - true - - true - - 1 - 1 - 1 - - 0 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 0 - false - false - 0 - null - null - null - null - - 0 - 0 - 0 - 0 - - null - 0 - false - null - - 0 - 0 - 0 - 0 - - 0 - 0 - - true - 1 - - - - - TempBranch - false - - 0 - 0.5 - - true - - true - - 1 - 1 - 1 - - 1 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 1 - false - false - 0 - null - null - null - null - - 1 - 5 - 0.5 - 0 - - null - 0 - false - null - - 0 - 140 - 0 - 24 - - 0 - 0 - - false - 2 - - - - UIListLayout - true - - 1 - 1 - - 0 - 5 - - 2 - - 0 - - - - - - TempButton - true - - 0 - 0 - - true - - false - true - - 1 - 1 - 1 - - 0 - - 0.24705879390239716 - 0.24705879390239716 - 0.24705879390239716 - - 0 - 1 - false - false - 9 - 0 - 1 - false - null - null - null - null - - 0 - 0 - 0 - 0 - - null - 0 - true - false - null - - 0 - 140 - 0 - 24 - - 0 - 0 - - ROOT - - 0 - 0 - 0 - - false - 12 - - 0 - 0 - 0 - - 0.949999988079071 - 0.25 - 0 - false - 2 - 1 - true - 2 - - - - - - - - StarterPlayerScripts - - - - Animator - ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --- 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) - ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ - - - - - Camera - - - - Main - 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 - - - - - Opacity - -- 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 - - - - - Popper - -- 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 - - - - - - Camera - 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) - - - - - CharacterBevels - - - - - - ClickToMove - ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --- @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) - -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - - - - - ConsoleTweaks - 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() - - - - - Explosions - 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) - - - - - ForceFields - 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) - - - - - GamepadPatch - -- 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) - - - - - HumanoidLabels - 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) - - - - Health - false - null - true - true - - true - false - 0 - 0 - -1 - true - - 0 - 0 - 0 - - - 0 - 0 - 0 - - 0 - INF - null - true - null - - 0 - 96 - 0 - 24 - - - 0 - 0 - - - 0 - 0 - 0 - - - 0 - 1.5 - 0 - - - 0 - - - - PlayerName - false - - 0.5 - 0.75 - - true - - true - - 1 - 1 - 1 - - 1 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 1 - false - false - 9 - 0 - 1 - null - null - null - null - - 0.5 - 0 - 0 - 0 - - null - 0 - false - null - - 10 - 0 - 1 - 0 - - 0 - - CloneTrooper1019 - - 1 - 1 - 1 - - true - 24 - - 0 - 0 - 0 - - 0 - 0 - 0 - true - 2 - 1 - true - 1 - - - - - RedBar - false - - 0.5 - 0.5 - - true - - true - - 1 - 0 - 0 - - 0 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 0 - false - false - 0 - null - null - null - null - - 0.5 - 0 - 0.5 - 0 - - null - 0 - false - null - - 0.6000000238418579 - 0 - 0.30000001192092896 - 0 - - 0 - 0 - - true - 1 - - - - GreenBar - false - - 0 - 0 - - true - - true - - 0.5058823823928833 - 0.7725490927696228 - 0.08627451211214066 - - 0 - - 0.10588239878416061 - 0.16470590233802795 - 0.20784319937229156 - - 0 - 0 - false - false - 0 - null - null - null - null - - 0 - 0 - 0 - 0 - - null - 0 - false - null - - 1 - 0 - 1 - 0 - - 0 - 0 - - true - 1 - - - - - - - - InputGateway - 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 - - - - - Music - local TeleportService = game:GetService("TeleportService") -local gameMusic = workspace:WaitForChild("GameMusic",10) -if gameMusic and TeleportService:GetTeleportSetting("AllowMusic") then - gameMusic:Play() -end - - - - - Shared - 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 - - - - - ToolSoundGlitch - 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) - - - - - ZoomControls - 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) - - - - - \ No newline at end of file diff --git a/Tools/GravityHammer/Handle.model.json b/Tools/GravityHammer/Handle.model.json new file mode 100644 index 0000000..4401411 --- /dev/null +++ b/Tools/GravityHammer/Handle.model.json @@ -0,0 +1,45 @@ +{ + "ClassName": "Part", + + "Properties": + { + "Size": [1, 0.8, 10], + + "TopSurface": + { + "Type": "Enum", + "Value": 0 + }, + + "BottomSurface": + { + "Type": "Enum", + "Value": 0 + } + }, + + "Children": + [ + { + "Name": "Mesh", + "ClassName": "SpecialMesh", + + "Properties": + { + "Scale": [0.05, 0.05, 0.05], + "MeshId": "rbxassetid://1256290", + "TextureId": "rbxassetid://1256283" + } + }, + { + "Name": "Sound", + "ClassName": "Sound", + + "Properties": + { + "SoundId": "rbxassetid://1255794", + "Volume": 1 + } + } + ] +} \ No newline at end of file diff --git a/Tools/Scripts/GravityHammer/SwordScript.server.lua b/Tools/GravityHammer/SwordScript.server.lua similarity index 100% rename from Tools/Scripts/GravityHammer/SwordScript.server.lua rename to Tools/GravityHammer/SwordScript.server.lua diff --git a/Tools/GravityHammer/init.meta.json b/Tools/GravityHammer/init.meta.json new file mode 100644 index 0000000..0b8e1f3 --- /dev/null +++ b/Tools/GravityHammer/init.meta.json @@ -0,0 +1,10 @@ +{ + "className": "Tool", + + "properties": + { + "CanBeDropped": false, + "GripPos": [0, 0, -3.25], + "TextureId": "rbxassetid://1256305" + } +} \ No newline at end of file diff --git a/Tools/Scripts/JetBoots/Jetboots.server.lua b/Tools/JetBoots/Jetboots.server.lua similarity index 100% rename from Tools/Scripts/JetBoots/Jetboots.server.lua rename to Tools/JetBoots/Jetboots.server.lua diff --git a/Tools/JetBoots/init.meta.json b/Tools/JetBoots/init.meta.json new file mode 100644 index 0000000..a2bb3dd --- /dev/null +++ b/Tools/JetBoots/init.meta.json @@ -0,0 +1,9 @@ +{ + "className": "Tool", + + "properties": + { + "RequiresHandle": false, + "TextureId": "rbxasset://Textures/Rocketboots.png" + } +} \ No newline at end of file diff --git a/Tools/Models/JetBoots.rbxmx b/Tools/Models/JetBoots.rbxmx deleted file mode 100644 index 1596d01..0000000 --- a/Tools/Models/JetBoots.rbxmx +++ /dev/null @@ -1,32 +0,0 @@ - - - - - true - true - - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - - false - JetBoots - false - - - rbxasset://Textures/Rocketboots.png - - - true - - - \ No newline at end of file diff --git a/Tools/Models/Multirocket.rbxmx b/Tools/Models/Multirocket.rbxmx deleted file mode 100644 index 51a4867..0000000 --- a/Tools/Models/Multirocket.rbxmx +++ /dev/null @@ -1,76 +0,0 @@ - - - - - true - true - - 0.7 - 0 - -0.5 - 0 - 0 - -1 - -1 - 0 - 0 - 0 - 1 - 0 - - false - Multirocket - false - - - rbxasset://Textures/Multirocket.png - - - true - - - - - 10 - true - Swoosh - false - 1 - false - 0 - null - - rbxasset://sounds/Rocket whoosh 01.wav - - - 0 - 0.7 - 10000 - 10 - true - - - - - - 10 - false - Explosion - false - 1 - false - 0 - null - - rbxasset://sounds/collide.wav - - - 0 - 1 - 10000 - 10 - true - - - - \ No newline at end of file diff --git a/Tools/Models/PaintballGun.rbxmx b/Tools/Models/PaintballGun.rbxmx deleted file mode 100644 index 3bf9e28..0000000 --- a/Tools/Models/PaintballGun.rbxmx +++ /dev/null @@ -1,163 +0,0 @@ - - - - - true - true - - -0.4 - -0.5 - -0.07 - 0 - 0 - -1 - 0 - 1 - 0 - 1 - 0 - 0 - - false - PaintballGun - true - - - rbxasset://Textures/PaintballIcon.png - - - true - - - - false - - -0.5 - 0.5 - 0 - 0 - -0.5 - 0.5 - 0 - 0 - - 488.7946 - 3.313973 - 438.8193 - -0.3090168 - 0.9510567 - 0 - 0 - 0 - -1 - -0.9510566 - -0.3090168 - 0 - - true - true - 0 - 4288914085 - - false - - -0.5 - 0.5 - 0 - 0 - -0.5 - 0.5 - 0 - 0 - false - false - 256 - Handle - 0 - -0.5 - 0.5 - 0 - 0 - 0 - - 0 - 0 - 0 - - - -0.5 - 0.5 - 0 - 0 - 0 - - 0 - 0 - 0 - - 0 - 1 - - 3 - 2 - 1 - - true - - - - - 10 - false - Fire - false - 1 - false - 0 - null - - rbxasset://sounds//paintball.wav - - - 0 - 1 - 10000 - 10 - true - - - - - - 2 - 2 - - rbxassetid://998137795 - - 5 - Mesh - - 0 - 0 - 0 - - - 1 - 1 - 1 - - - - rbxasset://textures/PaintballGunTex128.png - - - 1 - 1 - 1 - - true - - - - - \ No newline at end of file diff --git a/Tools/Models/Plane.rbxmx b/Tools/Models/Plane.rbxmx deleted file mode 100644 index 4d9dbad..0000000 --- a/Tools/Models/Plane.rbxmx +++ /dev/null @@ -1,171 +0,0 @@ - - - - - true - false - - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - - false - Plane - false - - - - - - true - - - - - IconOverride - - rbxassetid://1067894989 - true - - - - - true - - -0.5 - 0.5 - 0 - 0 - -0.5 - 0.5 - 0 - 0 - - -561.6701 - 6.200422 - -528.76 - 0 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - -1 - - true - true - 0 - 4279970357 - - false - - -0.5 - 0.5 - 0 - 0 - -0.5 - 0.5 - 0 - 0 - true - false - 256 - Rocket - 0.2 - -0.5 - 0.5 - 0 - 0 - 0 - - 0 - 0 - 0 - - - -0.5 - 0.5 - 0 - 0 - 0 - - 0 - 0 - 0 - - 0 - 1 - - 1 - 1 - 2 - - true - - - - - Owner - - null - true - - - - - - 10 - false - Explosion - true - 1 - false - 0 - null - - rbxasset://sounds/collide.wav - - - 0 - 1 - 10000 - 10 - true - - - - - - 10 - true - Swoosh - false - 1 - false - 0 - null - - rbxasset://sounds/Rocket whoosh 01.wav - - - 0 - 0.7 - 10000 - 10 - true - - - - - \ No newline at end of file diff --git a/Tools/Models/Reset.rbxmx b/Tools/Models/Reset.rbxmx deleted file mode 100644 index 17c6083..0000000 --- a/Tools/Models/Reset.rbxmx +++ /dev/null @@ -1,41 +0,0 @@ - - - - - true - true - - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - - false - Reset - false - - - - - - true - - - - - IconOverride - - rbxassetid://1000000 - true - - - - \ No newline at end of file diff --git a/Tools/Models/RocketLauncher.rbxmx b/Tools/Models/RocketLauncher.rbxmx deleted file mode 100644 index 97dacf4..0000000 --- a/Tools/Models/RocketLauncher.rbxmx +++ /dev/null @@ -1,185 +0,0 @@ - - - - - true - true - - 0.7 - 0 - -0.5 - 0 - 0 - -1 - -1 - 0 - 0 - 0 - 1 - 0 - - false - RocketLauncher - true - - - rbxasset://Textures/Rocket.png - - - true - - - - false - - -0.5 - 0.5 - 0 - 0 - -0.5 - 0.5 - 0 - 0 - - 416.4301 - 1.621786 - 446.26 - 1 - 0 - 0 - 0 - 6.301701E-05 - 1 - 0 - -1 - 6.301701E-05 - - false - true - 0 - 4288914085 - - false - - -0.5 - 0.5 - 0 - 0 - -0.5 - 0.5 - 0 - 0 - false - false - 256 - Handle - 0 - -0.5 - 0.5 - 0 - 0 - 0 - - 0 - 0 - 0 - - - -0.5 - 0.5 - 0 - 0 - 0 - - 0 - 0 - 0 - - 3 - 1 - - 4.920006 - 0.7400005 - 0.8399998 - - true - - - - - 2 - 2 - - rbxasset://fonts/rocketlauncher.mesh - - 5 - Mesh - - 0 - 0 - 0 - - - 0.75 - 0.75 - 0.75 - - - - rbxasset://textures/rocketlaunchertex.png - - - 1 - 1 - 1 - - true - - - - - - - 10 - false - Explosion - false - 1 - false - 0 - null - - rbxasset://sounds/collide.wav - - - 0 - 1 - 10000 - 10 - true - - - - - - 10 - true - Swoosh - false - 1 - false - 0 - null - - rbxasset://sounds/Rocket whoosh 01.wav - - - 0 - 0.7 - 10000 - 10 - true - - - - \ No newline at end of file diff --git a/Tools/Models/Slingshot.rbxmx b/Tools/Models/Slingshot.rbxmx deleted file mode 100644 index c9528ce..0000000 --- a/Tools/Models/Slingshot.rbxmx +++ /dev/null @@ -1,163 +0,0 @@ - - - - - true - true - - 0 - -0.7 - 0 - 1 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - - false - Slingshot - true - - - rbxasset://Textures/Slingshot.png - - - true - - - - false - - -0.5 - 0.5 - 0 - 0 - -0.5 - 0.5 - 4 - 0 - - 421.4299 - 3.221793 - 416.7602 - 1 - 0 - -5.545024E-06 - 0 - 1 - 0 - 5.545024E-06 - 0 - 1 - - true - true - 0 - 4288914085 - - false - - -0.5 - 0.5 - 0 - 0 - -0.5 - 0.5 - 0 - 0 - false - false - 256 - Handle - 0 - -0.5 - 0.5 - 0 - 0 - 0 - - 0 - 0 - 0 - - - -0.5 - 0.5 - 3 - 0 - 0 - - 0 - 0 - 0 - - 1 - 1 - - 2 - 2.4 - 1 - - true - - - - - 10 - false - SlingshotSound - false - 1 - false - 0 - null - - rbxasset://sounds//Rubber band sling shot.mp3 - - - 0 - 1 - 10000 - 10 - true - - - - - - 2 - 2 - - rbxasset://fonts/slingshot.mesh - - 5 - Mesh - - 0 - 0 - 0 - - - 0.5 - 0.5 - 0.5 - - - - rbxasset://textures/SlingshotTexture.png - - - 1 - 1 - 1 - - true - - - - - \ No newline at end of file diff --git a/Tools/Models/Superball.rbxmx b/Tools/Models/Superball.rbxmx deleted file mode 100644 index f4cca0f..0000000 --- a/Tools/Models/Superball.rbxmx +++ /dev/null @@ -1,136 +0,0 @@ - - - - - true - true - - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - - false - Superball - true - - - rbxasset://Textures/Superball.png - - - true - - - - false - - -0.5 - 0.5 - 0 - 0 - -0.5 - 0.5 - 0 - 0 - - 393.3251 - 6.242048 - 433.0556 - -0.3313951 - 0.000743661 - -0.9434918 - -1.846121E-06 - 0.9999996 - 0.000788849 - 0.943492 - 0.0002631625 - -0.331395 - - true - true - 0 - 4291045404 - - true - 0.7 - 0 - 1 - 1 - 1 - - -0.5 - 0.5 - 0 - 0 - -0.5 - 0.5 - 0 - 0 - false - false - 256 - Handle - 0.2 - -0.5 - 0.5 - 0 - 0 - 0 - - 0 - 0 - 0 - - - -0.5 - 0.5 - 0 - 0 - 0 - - 0 - 0 - 0 - - 0 - 0 - - 2 - 2 - 2 - - true - - - - - 10 - false - Boing - false - 1 - false - 0 - null - - rbxasset://sounds//short spring sound.wav - - - 0 - 1 - 10000 - 10 - true - - - - - \ No newline at end of file diff --git a/Tools/Models/Sword.rbxmx b/Tools/Models/Sword.rbxmx deleted file mode 100644 index f4181f0..0000000 --- a/Tools/Models/Sword.rbxmx +++ /dev/null @@ -1,207 +0,0 @@ - - - - - true - true - - 0 - 0 - -1.5 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 1 - 0 - - false - Sword - true - - - rbxasset://Textures/Sword128.png - - - true - - - - false - - -0.5 - 0.5 - 0 - 0 - -0.5 - 0.5 - 0 - 0 - - 355.9418 - 59.54162 - 392.76 - 5.960464E-08 - -8.921718E-19 - -0.9999999 - -5.904603E-18 - 1 - -8.921718E-19 - 0.9999999 - 5.904603E-18 - 5.960464E-08 - - true - true - 0 - 4284702562 - - false - - -0.5 - 0.5 - 0 - 0 - -0.5 - 0.5 - 0 - 0 - false - false - 256 - Handle - 0.4 - -0.5 - 0.5 - 0 - 0 - 0 - - 0 - 0 - 0 - - - -0.5 - 0.5 - 0 - 0 - 0 - - 0 - 0 - 0 - - 2 - 1 - - 1 - 0.8 - 4 - - true - - - - - 10 - false - Sound - false - 1 - false - 0 - null - - rbxasset://sounds/unsheath.wav - - - 0 - 1 - 10000 - 10 - true - - - - - - 10 - false - Sound - false - 1 - false - 0 - null - - rbxasset://sounds/swordlunge.wav - - - 0 - 0.6 - 10000 - 10 - true - - - - - - 10 - false - Sound - false - 1 - false - 0 - null - - rbxasset://sounds/swordslash.wav - - - 0 - 0.7 - 10000 - 10 - true - - - - - - 2 - 2 - - rbxasset://fonts/sword.mesh - - 5 - Mesh - - 0 - 0 - 0 - - - 1 - 1 - 1 - - - - rbxasset://textures/SwordTexture.png - - - 1 - 1 - 1 - - true - - - - - \ No newline at end of file diff --git a/Tools/Models/Timebomb.rbxmx b/Tools/Models/Timebomb.rbxmx deleted file mode 100644 index 58ac51c..0000000 --- a/Tools/Models/Timebomb.rbxmx +++ /dev/null @@ -1,141 +0,0 @@ - - - - - true - true - - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - -1 - 0 - 1 - 0 - - false - Timebomb - true - - - rbxasset://Textures/Bomb.png - - - true - - - - false - - -0.5 - 0.5 - 0 - 0 - -0.5 - 0.5 - 0 - 0 - - 400.0722 - 6.221753 - 383.565 - -0.9999679 - -0.007971467 - -6.34748E-06 - -3.721468E-12 - -0.0007962743 - 0.9999996 - -0.007971469 - 0.9999677 - 0.0007962488 - - true - true - 0 - 4288914085 - - false - - -0.5 - 0.5 - 0 - 0 - -0.5 - 0.5 - 0 - 0 - false - false - 256 - Handle - 0 - -0.5 - 0.5 - 0 - 0 - 0 - - 0 - 0 - 0 - - - -0.5 - 0.5 - 0 - 0 - 0 - - 0 - 0 - 0 - - 0 - 0 - - 2 - 2 - 2 - - true - - - - - 2 - 2 - - rbxasset://fonts/timebomb.mesh - - 5 - Mesh - - 0 - 0 - 0 - - - 1 - 1 - 1 - - - - rbxasset://textures/bombtex.png - - - 1 - 1 - 1 - - true - - - - - \ No newline at end of file diff --git a/Tools/Models/Trowel.rbxmx b/Tools/Models/Trowel.rbxmx deleted file mode 100644 index 4a24a36..0000000 --- a/Tools/Models/Trowel.rbxmx +++ /dev/null @@ -1,163 +0,0 @@ - - - - - true - true - - 0 - -1.3 - 0 - 1 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - - false - Trowel - true - - - rbxasset://Textures/Wall.png - - - true - - - - false - - -0.5 - 0.5 - 0 - 0 - -0.5 - 0.5 - 0 - 0 - - 452.9303 - 2.522889 - 429.0599 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - -1 - 0 - - true - true - 0 - 4292330906 - - false - - -0.5 - 0.5 - 0 - 0 - -0.5 - 0.5 - 0 - 0 - false - false - 256 - Handle - 0 - -0.5 - 0.5 - 0 - 0 - 0 - - 0 - 0 - 0 - - - -0.5 - 0.5 - 0 - 0 - 0 - - 0 - 0 - 0 - - 2 - 1 - - 1 - 4.4 - 1 - - true - - - - - 10 - false - BuildSound - false - 1 - false - 0 - null - - rbxasset://sounds//bass.wav - - - 0 - 1 - 10000 - 10 - true - - - - - - 2 - 2 - - rbxasset://fonts/trowel.mesh - - 5 - Mesh - - 0 - 0 - 0 - - - 1 - 1 - 1 - - - - rbxasset://textures/TrowelTexture.png - - - 1 - 1 - 1 - - true - - - - - \ No newline at end of file diff --git a/Tools/Multirocket/RocketScript/init.meta.json b/Tools/Multirocket/RocketScript/init.meta.json new file mode 100644 index 0000000..21cf1e8 --- /dev/null +++ b/Tools/Multirocket/RocketScript/init.meta.json @@ -0,0 +1,6 @@ +{ + "properties": + { + "Disabled": true + } +} \ No newline at end of file diff --git a/Tools/Scripts/Multirocket/RocketScript.server.lua b/Tools/Multirocket/RocketScript/init.server.lua similarity index 100% rename from Tools/Scripts/Multirocket/RocketScript.server.lua rename to Tools/Multirocket/RocketScript/init.server.lua diff --git a/Tools/Scripts/Multirocket/ServerLauncher.server.lua b/Tools/Multirocket/ServerLauncher.server.lua similarity index 94% rename from Tools/Scripts/Multirocket/ServerLauncher.server.lua rename to Tools/Multirocket/ServerLauncher.server.lua index d01eb1c..3345827 100644 --- a/Tools/Scripts/Multirocket/ServerLauncher.server.lua +++ b/Tools/Multirocket/ServerLauncher.server.lua @@ -1,6 +1,7 @@ -local Rocket = Instance.new("Part") local Tool = script.Parent +local Sounds = Tool.Sounds +local Rocket = Instance.new("Part") Rocket.Locked = true Rocket.BackSurface = 3 Rocket.BottomSurface = 3 @@ -12,8 +13,8 @@ Rocket.Size = Vector3.new(1,1,4) Rocket.BrickColor = BrickColor.Red() Tool.RocketScript:clone().Parent = Rocket -Tool.Explosion:clone().Parent = Rocket -Tool.Swoosh:clone().Parent = Rocket +Sounds.Explosion:clone().Parent = Rocket +Sounds.Swoosh:clone().Parent = Rocket function fire(vTarget) diff --git a/Tools/Multirocket/Sounds/Explosion.model.json b/Tools/Multirocket/Sounds/Explosion.model.json new file mode 100644 index 0000000..e8b840a --- /dev/null +++ b/Tools/Multirocket/Sounds/Explosion.model.json @@ -0,0 +1,9 @@ +{ + "ClassName": "Sound", + + "Properties": + { + "SoundId": "rbxasset://sounds/collide.wav", + "Volume": 1 + } +} \ No newline at end of file diff --git a/Tools/Multirocket/Sounds/Swoosh.model.json b/Tools/Multirocket/Sounds/Swoosh.model.json new file mode 100644 index 0000000..571f435 --- /dev/null +++ b/Tools/Multirocket/Sounds/Swoosh.model.json @@ -0,0 +1,9 @@ +{ + "ClassName": "Sound", + + "Properties": + { + "SoundId": "rbxasset://sounds/Rocket whoosh 01.wav", + "Volume": 0.7 + } +} \ No newline at end of file diff --git a/Tools/Multirocket/init.meta.json b/Tools/Multirocket/init.meta.json new file mode 100644 index 0000000..278f7ee --- /dev/null +++ b/Tools/Multirocket/init.meta.json @@ -0,0 +1,9 @@ +{ + "className": "Tool", + + "properties": + { + "RequiresHandle": false, + "TextureId": "rbxasset://Textures/Multirocket.png" + } +} \ No newline at end of file diff --git a/Tools/PaintballGun/Handle.model.json b/Tools/PaintballGun/Handle.model.json new file mode 100644 index 0000000..db563b9 --- /dev/null +++ b/Tools/PaintballGun/Handle.model.json @@ -0,0 +1,34 @@ +{ + "ClassName": "Part", + + "Properties": + { + "Size": [3, 2, 1], + + "TopSurface": + { + "Type": "Enum", + "Value": 0 + }, + + "BottomSurface": + { + "Type": "Enum", + "Value": 0 + } + }, + + "Children": + [ + { + "Name": "Mesh", + "ClassName": "SpecialMesh", + + "Properties": + { + "MeshId": "rbxassetid://998137795", + "TextureId": "rbxasset://textures/PaintballGunTex128.png" + } + } + ] +} \ No newline at end of file diff --git a/Tools/PaintballGun/Paintball/init.meta.json b/Tools/PaintballGun/Paintball/init.meta.json new file mode 100644 index 0000000..21cf1e8 --- /dev/null +++ b/Tools/PaintballGun/Paintball/init.meta.json @@ -0,0 +1,6 @@ +{ + "properties": + { + "Disabled": true + } +} \ No newline at end of file diff --git a/Tools/Scripts/PaintballGun/Paintball.server.lua b/Tools/PaintballGun/Paintball/init.server.lua similarity index 100% rename from Tools/Scripts/PaintballGun/Paintball.server.lua rename to Tools/PaintballGun/Paintball/init.server.lua diff --git a/Tools/Scripts/PaintballGun/PaintballShooter.server.lua b/Tools/PaintballGun/PaintballShooter.server.lua similarity index 85% rename from Tools/Scripts/PaintballGun/PaintballShooter.server.lua rename to Tools/PaintballGun/PaintballShooter.server.lua index 4f6a199..dd96bb6 100644 --- a/Tools/Scripts/PaintballGun/PaintballShooter.server.lua +++ b/Tools/PaintballGun/PaintballShooter.server.lua @@ -1,10 +1,17 @@ -Tool = script.Parent +local Tool = script.Parent + +local fireSound = Instance.new("Sound") +fireSound.SoundId = "rbxasset://sounds//paintball.wav" +fireSound.Name = "Fire" +fireSound.Volume = 1 +fireSound.Parent = Tool.Handle + +local colors = {45, 119, 21, 24, 23, 105, 104} -colors = {45, 119, 21, 24, 23, 105, 104} function fire(v) - Tool.Handle.Fire:play() + fireSound:play() local vCharacter = Tool.Parent diff --git a/Tools/PaintballGun/init.meta.json b/Tools/PaintballGun/init.meta.json new file mode 100644 index 0000000..44626ea --- /dev/null +++ b/Tools/PaintballGun/init.meta.json @@ -0,0 +1,17 @@ +{ + "className": "Tool", + + "properties": + { + "Grip": + [ + -0.4, -0.5, -0.07, + + 0, 0, -1, + 0, 1, 0, + 1, 0, 0 + ], + + "TextureId": "rbxasset://Textures/PaintballIcon.png" + } +} \ No newline at end of file diff --git a/Tools/Scripts/Plane/ControlScheme.lua b/Tools/Plane/ControlScheme.lua similarity index 87% rename from Tools/Scripts/Plane/ControlScheme.lua rename to Tools/Plane/ControlScheme.lua index 327c155..ef25083 100644 --- a/Tools/Scripts/Plane/ControlScheme.lua +++ b/Tools/Plane/ControlScheme.lua @@ -1,29 +1,34 @@ return { ActivateContext = "Steer Plane"; + Buttons = { - ["Y"] = + Y = { Label = "Start Engine"; XboxButton = "ButtonY"; }; - ["X"] = + + X = { Label = "Stop Engine"; XboxButton = "ButtonB"; }; - ["F"] = + + F = { Label = "Fire Weapon"; XboxButton = "ButtonL2"; }; - ["G"] = + + G = { Label = "Barrel Roll"; XboxButton = "ButtonL1"; }; - ["T"] = + + T = { Label = "Stunt Roll"; XboxButton = "ButtonR1"; diff --git a/Tools/Scripts/Plane/IconOverride.txt b/Tools/Plane/IconOverride.txt similarity index 100% rename from Tools/Scripts/Plane/IconOverride.txt rename to Tools/Plane/IconOverride.txt diff --git a/Tools/Plane/PlaneTool/FlyScript/init.meta.json b/Tools/Plane/PlaneTool/FlyScript/init.meta.json new file mode 100644 index 0000000..21cf1e8 --- /dev/null +++ b/Tools/Plane/PlaneTool/FlyScript/init.meta.json @@ -0,0 +1,6 @@ +{ + "properties": + { + "Disabled": true + } +} \ No newline at end of file diff --git a/Tools/Scripts/Plane/PlaneTool/FlyScript.server.lua b/Tools/Plane/PlaneTool/FlyScript/init.server.lua similarity index 100% rename from Tools/Scripts/Plane/PlaneTool/FlyScript.server.lua rename to Tools/Plane/PlaneTool/FlyScript/init.server.lua diff --git a/Tools/Scripts/Plane/PlaneTool/init.server.lua b/Tools/Plane/PlaneTool/init.server.lua similarity index 100% rename from Tools/Scripts/Plane/PlaneTool/init.server.lua rename to Tools/Plane/PlaneTool/init.server.lua diff --git a/Tools/Plane/Rocket/Explosion.model.json b/Tools/Plane/Rocket/Explosion.model.json new file mode 100644 index 0000000..e8b840a --- /dev/null +++ b/Tools/Plane/Rocket/Explosion.model.json @@ -0,0 +1,9 @@ +{ + "ClassName": "Sound", + + "Properties": + { + "SoundId": "rbxasset://sounds/collide.wav", + "Volume": 1 + } +} \ No newline at end of file diff --git a/Tools/Plane/Rocket/Owner.model.json b/Tools/Plane/Rocket/Owner.model.json new file mode 100644 index 0000000..2a473f6 --- /dev/null +++ b/Tools/Plane/Rocket/Owner.model.json @@ -0,0 +1,3 @@ +{ + "ClassName": "ObjectValue" +} \ No newline at end of file diff --git a/Tools/Plane/Rocket/RocketScript/init.meta.json b/Tools/Plane/Rocket/RocketScript/init.meta.json new file mode 100644 index 0000000..21cf1e8 --- /dev/null +++ b/Tools/Plane/Rocket/RocketScript/init.meta.json @@ -0,0 +1,6 @@ +{ + "properties": + { + "Disabled": true + } +} \ No newline at end of file diff --git a/Tools/Scripts/Plane/Rocket/RocketScript.server.lua b/Tools/Plane/Rocket/RocketScript/init.server.lua similarity index 100% rename from Tools/Scripts/Plane/Rocket/RocketScript.server.lua rename to Tools/Plane/Rocket/RocketScript/init.server.lua diff --git a/Tools/Plane/Rocket/Swoosh.model.json b/Tools/Plane/Rocket/Swoosh.model.json new file mode 100644 index 0000000..571f435 --- /dev/null +++ b/Tools/Plane/Rocket/Swoosh.model.json @@ -0,0 +1,9 @@ +{ + "ClassName": "Sound", + + "Properties": + { + "SoundId": "rbxasset://sounds/Rocket whoosh 01.wav", + "Volume": 0.7 + } +} \ No newline at end of file diff --git a/Tools/Plane/Rocket/init.meta.json b/Tools/Plane/Rocket/init.meta.json new file mode 100644 index 0000000..902a92d --- /dev/null +++ b/Tools/Plane/Rocket/init.meta.json @@ -0,0 +1,21 @@ +{ + "className": "Part", + + "properties": + { + "Color": [0.105882, 0.164706, 0.207843], + "Size": [1, 1, 2], + + "TopSurface": + { + "Type": "Enum", + "Value": 0 + }, + + "BottomSurface": + { + "Type": "Enum", + "Value": 0 + } + } +} \ No newline at end of file diff --git a/Tools/Plane/init.meta.json b/Tools/Plane/init.meta.json new file mode 100644 index 0000000..1017b2c --- /dev/null +++ b/Tools/Plane/init.meta.json @@ -0,0 +1,8 @@ +{ + "className": "Tool", + + "properties": + { + "RequiresHandle": false + } +} \ No newline at end of file diff --git a/Tools/Scripts/Reset/IconOverride.txt b/Tools/Reset/IconOverride.txt similarity index 100% rename from Tools/Scripts/Reset/IconOverride.txt rename to Tools/Reset/IconOverride.txt diff --git a/Tools/Scripts/Reset/Reset.server.lua b/Tools/Reset/Reset.server.lua similarity index 100% rename from Tools/Scripts/Reset/Reset.server.lua rename to Tools/Reset/Reset.server.lua diff --git a/Tools/Reset/init.meta.json b/Tools/Reset/init.meta.json new file mode 100644 index 0000000..1017b2c --- /dev/null +++ b/Tools/Reset/init.meta.json @@ -0,0 +1,8 @@ +{ + "className": "Tool", + + "properties": + { + "RequiresHandle": false + } +} \ No newline at end of file diff --git a/Tools/RocketLauncher/Handle.model.json b/Tools/RocketLauncher/Handle.model.json new file mode 100644 index 0000000..caf5b74 --- /dev/null +++ b/Tools/RocketLauncher/Handle.model.json @@ -0,0 +1,35 @@ +{ + "ClassName": "Part", + + "Properties": + { + "Size": [4.92, 0.74, 0.84], + + "TopSurface": + { + "Type": "Enum", + "Value": 0 + }, + + "BottomSurface": + { + "Type": "Enum", + "Value": 0 + } + }, + + "Children": + [ + { + "Name": "Mesh", + "ClassName": "SpecialMesh", + + "Properties": + { + "Scale": [0.75, 0.75, 0.75], + "MeshId": "rbxasset://fonts/rocketlauncher.mesh", + "TextureId": "rbxasset://textures/rocketlaunchertex.png" + } + } + ] +} \ No newline at end of file diff --git a/Tools/RocketLauncher/RocketScript/init.meta.json b/Tools/RocketLauncher/RocketScript/init.meta.json new file mode 100644 index 0000000..21cf1e8 --- /dev/null +++ b/Tools/RocketLauncher/RocketScript/init.meta.json @@ -0,0 +1,6 @@ +{ + "properties": + { + "Disabled": true + } +} \ No newline at end of file diff --git a/Tools/Scripts/RocketLauncher/RocketScript.server.lua b/Tools/RocketLauncher/RocketScript/init.server.lua similarity index 100% rename from Tools/Scripts/RocketLauncher/RocketScript.server.lua rename to Tools/RocketLauncher/RocketScript/init.server.lua diff --git a/Tools/Scripts/RocketLauncher/ServerLauncher.server.lua b/Tools/RocketLauncher/ServerLauncher.server.lua similarity index 94% rename from Tools/Scripts/RocketLauncher/ServerLauncher.server.lua rename to Tools/RocketLauncher/ServerLauncher.server.lua index 9999d8a..7240835 100644 --- a/Tools/Scripts/RocketLauncher/ServerLauncher.server.lua +++ b/Tools/RocketLauncher/ServerLauncher.server.lua @@ -1,6 +1,7 @@ -local Rocket = Instance.new("Part") local Tool = script.Parent +local Sound = Tool.Sound +local Rocket = Instance.new("Part") Rocket.Locked = true Rocket.BackSurface = 3 Rocket.BottomSurface = 3 @@ -12,8 +13,8 @@ Rocket.Size = Vector3.new(1,1,4) Rocket.BrickColor = BrickColor.new(23) Tool.RocketScript:clone().Parent = Rocket -Tool.Explosion:clone().Parent = Rocket -Tool.Swoosh:clone().Parent = Rocket +Sound.Explosion:clone().Parent = Rocket +Sound.Swoosh:clone().Parent = Rocket function fire(vTarget) diff --git a/Tools/RocketLauncher/Sounds/Explosion.model.json b/Tools/RocketLauncher/Sounds/Explosion.model.json new file mode 100644 index 0000000..e8b840a --- /dev/null +++ b/Tools/RocketLauncher/Sounds/Explosion.model.json @@ -0,0 +1,9 @@ +{ + "ClassName": "Sound", + + "Properties": + { + "SoundId": "rbxasset://sounds/collide.wav", + "Volume": 1 + } +} \ No newline at end of file diff --git a/Tools/RocketLauncher/Sounds/Swoosh.model.json b/Tools/RocketLauncher/Sounds/Swoosh.model.json new file mode 100644 index 0000000..571f435 --- /dev/null +++ b/Tools/RocketLauncher/Sounds/Swoosh.model.json @@ -0,0 +1,9 @@ +{ + "ClassName": "Sound", + + "Properties": + { + "SoundId": "rbxasset://sounds/Rocket whoosh 01.wav", + "Volume": 0.7 + } +} \ No newline at end of file diff --git a/Tools/RocketLauncher/init.meta.json b/Tools/RocketLauncher/init.meta.json new file mode 100644 index 0000000..ee63478 --- /dev/null +++ b/Tools/RocketLauncher/init.meta.json @@ -0,0 +1,17 @@ +{ + "className": "Tool", + + "properties": + { + "Grip": + [ + 0.7, 0, -0.5, + + 0, 0, -1, + -1, 0, 0, + 0, 1, 0 + ], + + "TextureId": "rbxasset://Textures/Rocket.png" + } +} \ No newline at end of file diff --git a/Tools/Scripts/GravityHammer/GravityHammer.rbxmx b/Tools/Scripts/GravityHammer/GravityHammer.rbxmx deleted file mode 100644 index 7de8632..0000000 --- a/Tools/Scripts/GravityHammer/GravityHammer.rbxmx +++ /dev/null @@ -1,163 +0,0 @@ - - - - - false - true - - 0 - 0 - -3.25 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 1 - 0 - - false - GravityHammer - true - - - http://www.roblox.com/asset/?id=1256305 - - - true - - - - false - - -0.5 - 0.5 - 0 - 0 - -0.5 - 0.5 - 0 - 0 - - 433.6435 - 11.72512 - 424.1967 - -0.9932989 - 0.114088 - 0.01847253 - 0.01858202 - -0.0001038264 - 0.9998273 - 0.1140701 - 0.9934707 - -0.002016852 - - true - true - 0 - 4284702562 - - false - - -0.5 - 0.5 - 0 - 0 - -0.5 - 0.5 - 0 - 0 - false - false - 256 - Handle - 0.4 - -0.5 - 0.5 - 0 - 0 - 0 - - 0 - 0 - 0 - - - -0.5 - 0.5 - 0 - 0 - 0 - - 0 - 0 - 0 - - 2 - 1 - - 1 - 0.8 - 10 - - true - - - - - 10 - false - Sound - false - 1 - false - 0 - null - - http://www.roblox.com/asset/?id=1255794 - - - 0 - 1 - 10000 - 10 - true - - - - - - 2 - 2 - - http://www.roblox.com/asset/?id=1256290 - - 5 - Mesh - - 0 - 0 - 0 - - - 0.05 - 0.05 - 0.05 - - - - http://www.roblox.com/asset/?id=1256283 - - - 1 - 1 - 1 - - true - - - - - \ No newline at end of file diff --git a/Tools/Scripts/PaintballGun/BrickCleanup.server.lua b/Tools/Scripts/PaintballGun/BrickCleanup.server.lua deleted file mode 100644 index 5bec096..0000000 --- a/Tools/Scripts/PaintballGun/BrickCleanup.server.lua +++ /dev/null @@ -1,4 +0,0 @@ --- this script removes its parent from the workspace after 120 seconds - -wait(120) -script.Parent.Parent = nil diff --git a/Tools/Scripts/Trowel/BrickCleanup.server.lua b/Tools/Scripts/Trowel/BrickCleanup.server.lua deleted file mode 100644 index 5f2dd3e..0000000 --- a/Tools/Scripts/Trowel/BrickCleanup.server.lua +++ /dev/null @@ -1,4 +0,0 @@ --- this script removes its parent from the workspace after 24 seconds - -wait(24) -script.Parent.Parent = nil diff --git a/Tools/Slingshot/Handle.model.json b/Tools/Slingshot/Handle.model.json new file mode 100644 index 0000000..f7714cb --- /dev/null +++ b/Tools/Slingshot/Handle.model.json @@ -0,0 +1,34 @@ +{ + "ClassName": "Part", + + "Properties": + { + "Size": [2, 2.4, 1] + }, + + "Children": + [ + { + "Name": "Mesh", + "ClassName": "SpecialMesh", + + "Properties": + { + "Scale": [0.5, 0.5, 0.5], + "MeshId": "rbxasset://fonts/slingshot.mesh", + "TextureId": "rbxasset://textures/SlingshotTexture.png" + } + }, + + { + "Name": "SlingshotSound", + "ClassName": "Sound", + + "Properties": + { + "SoundId": "rbxasset://sounds//Rubber band sling shot.mp3", + "Volume": 1 + } + } + ] +} \ No newline at end of file diff --git a/Tools/Slingshot/PelletScript/init.meta.json b/Tools/Slingshot/PelletScript/init.meta.json new file mode 100644 index 0000000..21cf1e8 --- /dev/null +++ b/Tools/Slingshot/PelletScript/init.meta.json @@ -0,0 +1,6 @@ +{ + "properties": + { + "Disabled": true + } +} \ No newline at end of file diff --git a/Tools/Scripts/Slingshot/PelletScript.server.lua b/Tools/Slingshot/PelletScript/init.server.lua similarity index 100% rename from Tools/Scripts/Slingshot/PelletScript.server.lua rename to Tools/Slingshot/PelletScript/init.server.lua diff --git a/Tools/Scripts/Slingshot/Slingshot.server.lua b/Tools/Slingshot/Slingshot.server.lua similarity index 100% rename from Tools/Scripts/Slingshot/Slingshot.server.lua rename to Tools/Slingshot/Slingshot.server.lua diff --git a/Tools/Slingshot/init.meta.json b/Tools/Slingshot/init.meta.json new file mode 100644 index 0000000..0e79921 --- /dev/null +++ b/Tools/Slingshot/init.meta.json @@ -0,0 +1,17 @@ +{ + "className": "Tool", + + "properties": + { + "Grip": + [ + 0, -0.7, 0, + + 1, 0, 0, + 0, 1, 0, + 0, 0, 1 + ], + + "TextureId": "rbxasset://Textures/Slingshot.png" + } +} \ No newline at end of file diff --git a/Tools/Superball/CannonBall/init.meta.json b/Tools/Superball/CannonBall/init.meta.json new file mode 100644 index 0000000..21cf1e8 --- /dev/null +++ b/Tools/Superball/CannonBall/init.meta.json @@ -0,0 +1,6 @@ +{ + "properties": + { + "Disabled": true + } +} \ No newline at end of file diff --git a/Tools/Scripts/Superball/CannonBall.server.lua b/Tools/Superball/CannonBall/init.server.lua similarity index 100% rename from Tools/Scripts/Superball/CannonBall.server.lua rename to Tools/Superball/CannonBall/init.server.lua diff --git a/Tools/Scripts/Superball/CannonScript.server.lua b/Tools/Superball/CannonScript.server.lua similarity index 100% rename from Tools/Scripts/Superball/CannonScript.server.lua rename to Tools/Superball/CannonScript.server.lua diff --git a/Tools/Superball/Handle.model.json b/Tools/Superball/Handle.model.json new file mode 100644 index 0000000..45902c2 --- /dev/null +++ b/Tools/Superball/Handle.model.json @@ -0,0 +1,37 @@ +{ + "ClassName": "Part", + + "Properties": + { + "Color": [0.768628, 0.156863, 0.109804], + "Reflectance": 0.2, + + "Material": + { + "Type": "Enum", + "Value": 272 + }, + + "Shape": + { + "Type": "Enum", + "Value": 0 + }, + + "Size": [2, 2, 2] + }, + + "Children": + [ + { + "Name": "Boing", + "ClassName": "Sound", + + "Properties": + { + "SoundId": "rbxasset://sounds//short spring sound.wav", + "Volume": 1 + } + } + ] +} \ No newline at end of file diff --git a/Tools/Superball/init.meta.json b/Tools/Superball/init.meta.json new file mode 100644 index 0000000..4eb75d2 --- /dev/null +++ b/Tools/Superball/init.meta.json @@ -0,0 +1,8 @@ +{ + "className": "Tool", + + "properties": + { + "TextureId": "rbxasset://Textures/Superball.png" + } +} \ No newline at end of file diff --git a/Tools/Sword/Handle.model.json b/Tools/Sword/Handle.model.json new file mode 100644 index 0000000..5317ea2 --- /dev/null +++ b/Tools/Sword/Handle.model.json @@ -0,0 +1,34 @@ +{ + "ClassName": "Part", + + "Properties": + { + "Size": [1, 0.8, 4], + + "TopSurface": + { + "Type": "Enum", + "Value": 0 + }, + + "BottomSurface": + { + "Type": "Enum", + "Value": 0 + } + }, + + "Children": + [ + { + "Name": "Mesh", + "ClassName": "SpecialMesh", + + "Properties": + { + "MeshId": "rbxasset://fonts/sword.mesh", + "TextureId": "rbxasset://textures/SwordTexture.png" + } + } + ] +} \ No newline at end of file diff --git a/Tools/Scripts/Sword/SwordScript.server.lua b/Tools/Sword/SwordScript.server.lua similarity index 100% rename from Tools/Scripts/Sword/SwordScript.server.lua rename to Tools/Sword/SwordScript.server.lua diff --git a/Tools/Sword/init.meta.json b/Tools/Sword/init.meta.json new file mode 100644 index 0000000..58eb9d5 --- /dev/null +++ b/Tools/Sword/init.meta.json @@ -0,0 +1,17 @@ +{ + "className": "Tool", + + "properties": + { + "Grip": + [ + 0, 0, -1.5, + + 0, 0, 1, + 1, 0, 0, + 0, 1, 0 + ], + + "TextureId": "rbxasset://Textures/Sword128.png" + } +} \ No newline at end of file diff --git a/Tools/Timebomb/Bomb/init.meta.json b/Tools/Timebomb/Bomb/init.meta.json new file mode 100644 index 0000000..21cf1e8 --- /dev/null +++ b/Tools/Timebomb/Bomb/init.meta.json @@ -0,0 +1,6 @@ +{ + "properties": + { + "Disabled": true + } +} \ No newline at end of file diff --git a/Tools/Scripts/Timebomb/Bomb.server.lua b/Tools/Timebomb/Bomb/init.server.lua similarity index 100% rename from Tools/Scripts/Timebomb/Bomb.server.lua rename to Tools/Timebomb/Bomb/init.server.lua diff --git a/Tools/Timebomb/Handle.model.json b/Tools/Timebomb/Handle.model.json new file mode 100644 index 0000000..27c39ef --- /dev/null +++ b/Tools/Timebomb/Handle.model.json @@ -0,0 +1,28 @@ +{ + "ClassName": "Part", + + "Properties": + { + "Shape": + { + "Type": "Enum", + "Value": 0 + }, + + "Size": [2, 2, 2] + }, + + "Children": + [ + { + "Name": "Mesh", + "ClassName": "SpecialMesh", + + "Properties": + { + "MeshId": "rbxasset://fonts/timebomb.mesh", + "TextureId": "rbxasset://textures/bombtex.png" + } + } + ] +} \ No newline at end of file diff --git a/Tools/Scripts/Timebomb/PlantBomb.server.lua b/Tools/Timebomb/PlantBomb.server.lua similarity index 100% rename from Tools/Scripts/Timebomb/PlantBomb.server.lua rename to Tools/Timebomb/PlantBomb.server.lua diff --git a/Tools/Timebomb/init.meta.json b/Tools/Timebomb/init.meta.json new file mode 100644 index 0000000..e97aecd --- /dev/null +++ b/Tools/Timebomb/init.meta.json @@ -0,0 +1,8 @@ +{ + "className": "Tool", + + "properties": + { + "TextureId": "rbxasset://Textures/Bomb.png" + } +} \ No newline at end of file diff --git a/Tools/Trowel/Handle.model.json b/Tools/Trowel/Handle.model.json new file mode 100644 index 0000000..ab4cb15 --- /dev/null +++ b/Tools/Trowel/Handle.model.json @@ -0,0 +1,33 @@ +{ + "ClassName": "Part", + + "Properties": + { + "Size": [1, 4.4, 1] + }, + + "Children": + [ + { + "Name": "Mesh", + "ClassName": "SpecialMesh", + + "Properties": + { + "MeshId": "rbxasset://fonts/trowel.mesh", + "TextureId": "rbxasset://textures/TrowelTexture.png" + } + }, + + { + "Name": "BuildSound", + "ClassName": "Sound", + + "Properties": + { + "SoundId": "rbxasset://sounds//bass.wav", + "Volume": 1 + } + } + ] +} \ No newline at end of file diff --git a/Tools/Scripts/Trowel/WallMaker.server.lua b/Tools/Trowel/WallMaker.server.lua similarity index 100% rename from Tools/Scripts/Trowel/WallMaker.server.lua rename to Tools/Trowel/WallMaker.server.lua diff --git a/Tools/Trowel/init.meta.json b/Tools/Trowel/init.meta.json new file mode 100644 index 0000000..9a05ee0 --- /dev/null +++ b/Tools/Trowel/init.meta.json @@ -0,0 +1,9 @@ +{ + "className": "Tool", + + "properties": + { + "GripPos": [0, -1.3, 0], + "TextureId": "rbxasset://Textures/Wall.png" + } +} \ No newline at end of file diff --git a/UI/Backpack/init.client.lua b/UI/Backpack/Backpack.client.lua similarity index 100% rename from UI/Backpack/init.client.lua rename to UI/Backpack/Backpack.client.lua diff --git a/UI/Backpack/init.meta.json b/UI/Backpack/init.meta.json new file mode 100644 index 0000000..c7ba9a1 --- /dev/null +++ b/UI/Backpack/init.meta.json @@ -0,0 +1,3 @@ +{ + "className": "Frame" +} \ No newline at end of file diff --git a/Client/ConsoleTweaks.client.lua b/UI/ConsoleTweaks.client.lua similarity index 84% rename from Client/ConsoleTweaks.client.lua rename to UI/ConsoleTweaks.client.lua index dcfee95..be07b52 100644 --- a/Client/ConsoleTweaks.client.lua +++ b/UI/ConsoleTweaks.client.lua @@ -8,7 +8,9 @@ local function addUIScale(obj,scale) end if GuiService:IsTenFootInterface() then - local gui = script.Parent + local ui = script.Parent + local rootFrame = ui:WaitForChild("RootFrame") + local zoomControls = gui:WaitForChild("ZoomControls") zoomControls.Visible = false @@ -16,7 +18,7 @@ if GuiService:IsTenFootInterface() then backpack.Position = UDim2.new(0, 0, 1, 0) local chat = gui:WaitForChild("Chat") - addUIScale(chat, 1.5) + chat.Visible = false local chatPadding = gui:WaitForChild("ChatPadding", 1) if chatPadding then @@ -24,7 +26,7 @@ if GuiService:IsTenFootInterface() then end local safeChat = gui:WaitForChild("SafeChat") - addUIScale(safeChat, 1.5) + safeChat.Visible = false local health = gui:WaitForChild("Health") addUIScale(health, 1.5) diff --git a/UI/RootFrame.rbxmx b/UI/OldRootFrame.rbxmx similarity index 100% rename from UI/RootFrame.rbxmx rename to UI/OldRootFrame.rbxmx diff --git a/UI/init.meta.json b/UI/init.meta.json new file mode 100644 index 0000000..b703205 --- /dev/null +++ b/UI/init.meta.json @@ -0,0 +1,9 @@ +{ + "className": "Frame", + + "properties": + { + "BackgroundTransparency": 1, + "Size": [1, 0, 1, 0] + } +} \ No newline at end of file diff --git a/default.project.json b/default.project.json index b4629f7..525ef9e 100644 --- a/default.project.json +++ b/default.project.json @@ -3,7 +3,7 @@ "tree": { - "$path": "main.lua", + "$path": "init.lua", "ReplicatedFirst": { @@ -25,6 +25,21 @@ } }, + "ServerStorage": + { + "$className": "Folder", + + "CoreBevelCache": + { + "$path": "Resources/BevelCache" + }, + + "StandardTools": + { + "$path": "Tools" + } + }, + "StarterGui": { "$className": "Folder", diff --git a/main.lua b/init.lua similarity index 100% rename from main.lua rename to init.lua diff --git a/place.project.json b/place.project.json index aaab7bb..99bf692 100644 --- a/place.project.json +++ b/place.project.json @@ -1,36 +1,76 @@ { - "name": "Roblox-PNG-Library", + "name": "Super Nostalgia Zone", "tree": { "$className": "DataModel", - "ReplicatedStorage": + "ServerStorage": { - "$className": "ReplicatedStorage", + "$className": "ServerStorage", - "PNG": + "MainModule": { "$path": "init.lua", - "Chunks": + "ReplicatedFirst": { - "$path": "Chunks" + "$className": "Folder", + + "JoinScript": + { + "$path": "Resources/GameJoin" + } }, - "BinaryReader": + "ReplicatedStorage": { - "$path": "Modules/BinaryReader.lua" + "$className": "Folder", + + "SafeChatTree": + { + "$path": "Resources/SafeChat" + } }, - "Deflate": + "ServerStorage": { - "$path": "Modules/Deflate.lua" + "$className": "Folder", + + "StandardTools": + { + "$path": "Tools" + } }, - "Unfilter": + "StarterGui": { - "$path": "Modules/Unfilter.lua" + "$className": "Folder", + + "UI": + { + "$className": "ScreenGui", + + "RootFrame": + { + "$path": "UI" + } + } + }, + + "ServerScriptService": + { + "$path": "Server" + }, + + "StarterPlayerScripts": + { + "$path": "Client" + }, + + "StarterCharacterScripts": + { + "$path": "Character" } } } diff --git a/rojo-build.sh b/rojo-build.sh deleted file mode 100644 index 16c7e99..0000000 --- a/rojo-build.sh +++ /dev/null @@ -1 +0,0 @@ -rojo build -o PNG.rbxm diff --git a/rojo-serve.bat b/rojo-serve.bat index 4cb5052..7bb4b43 100644 --- a/rojo-serve.bat +++ b/rojo-serve.bat @@ -1,4 +1,4 @@ @echo off -rojo serve place.project.json +rojo serve place.project.json pause \ No newline at end of file diff --git a/rojo-serve.sh b/rojo-serve.sh deleted file mode 100644 index 75bc9c9..0000000 --- a/rojo-serve.sh +++ /dev/null @@ -1 +0,0 @@ -rojo serve place.project.json