Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local Players = game:GetService('Players')
- local ReplicatedStorage = game:GetService('ReplicatedStorage')
- local ServerStorage = game:GetService('ServerStorage')
- local ServerScriptServce = game:GetService('ServerScriptService')
- local Workspace = game:GetService('Workspace')
- local Gui = ServerScriptServce:WaitForChild('Core'):WaitForChild('Gui')
- local Remotes = ReplicatedStorage:WaitForChild('ClassroomRemotes')
- local RemoteHostSetup = Remotes:WaitForChild('HostSetup')
- local QuizSetup = Remotes:WaitForChild('QuizSetup')
- local RequestSeatInformation = Remotes:WaitForChild('RequestSeatInformation')
- local RequestSeatFix = Remotes:WaitForChild('RequestSeatFix')
- local _Settings = require(ServerScriptServce:WaitForChild('Core'):WaitForChild('Settings'))
- local _BackupData = require(ServerScriptServce:WaitForChild('Core'):WaitForChild('BackupData'))
- local HostQuiz = Gui:WaitForChild('HostQuiz')
- local PlayerQuiz = Gui:WaitForChild('PlayerQuiz')
- local c = {}
- local folder;
- c.ClassRooms = {}
- local function GetOccupiedSeats(class)
- local t = {}
- --warn('Array Occupied Seats')
- if folder:FindFirstChild(class) then
- --warn('Find Class')
- for i,v in pairs(folder[class]['Seats']:GetChildren())do
- --print('Check')
- if v.Occupant ~= nil then
- -- print(v.Occupant.Parent.Name)
- v.Occupant.JumpPower = 0
- c.ClassRooms[tonumber(class)]['Seats'][tonumber(v.Name)]['Occupant'] = Players:GetPlayerFromCharacter(v.Occupant.Parent).Name
- c.ClassRooms[tonumber(class)]['Seats'][tonumber(v.Name)]['Testing'] = 'Testing'
- table.insert(t, tonumber(v.Name), {player = v.Occupant.Parent.Name; seat = v.Name})
- else
- v.Disabled = true
- end
- end
- end
- return t
- end
- local function GetSeatList(class)
- local t = {}
- if folder:FindFirstChild(class)then
- for i,v in pairs(folder[class]['Seats']:GetChildren())do
- if v.Occupant ~= nil then
- table.insert(t, tonumber(v.Name), {player = v.Occupant.Parent.Name; seat = v.Name})
- end
- end
- end
- return t
- end
- local function CleanClassroom(class)
- -- print('Clean Classroom')
- for i,v in pairs(c.ClassRooms[tonumber(class)].Remotes)do
- v:Disconnect()
- end
- for i,v in pairs(folder[class]['Seats']:GetChildren())do
- v.Disabled = false
- end
- c.ClassRooms[tonumber(class)] = {Seats = {}, Test = nil, Host = nil, Status = "Free", Remotes = {}, Serial = 0}
- for i,v in pairs(folder[class].Seats:GetChildren())do
- c.ClassRooms[tonumber(class)]['Seats'][tonumber(v.Name)] = {Occupant = 'NIL', Status = 'NIL', Score = 0}
- --table.insert(c.ClassRooms[tonumber(class)]['Seats'], tonumber(v.Name), )
- end
- --warn('Classroom Cleaned')
- end
- local function SortClassrooms()
- if Workspace:WaitForChild('Classrooms') then
- folder = Workspace:FindFirstChild('Classrooms')
- else
- repeat wait() until Workspace:FindFirstChild('Classrooms')
- folder = Workspace:FindFirstChild('Classrooms')
- end
- for i,v in ipairs(folder:GetChildren())do
- table.insert(c.ClassRooms, tonumber(v.Name), {Seats = {}, Test = nil, Host = nil, Status = "Free", Remotes = {}, Serial = 0})
- for a,b in pairs(v.Seats:GetChildren())do
- c.ClassRooms[tonumber(v.Name)]['Seats'][tonumber(b.Name)] = {Occupant = 'NIL', Status = 'NIL', Score = 0}
- --table.insert(c.ClassRooms[tonumber(v.Name)]['Seats'], tonumber(b.Name), {Occupant = 'NIL'})
- end
- end
- end
- local function FindClassHost(player)
- for i,v in pairs(c.ClassRooms) do
- if v.Host == player then
- return true
- end
- end
- return false
- end
- local function ClearPotentialHost()
- for i,v in pairs(game.Players:GetPlayers())do
- if v.PlayerGui:FindFirstChild('HostQuiz') and not FindClassHost(v) then
- v.PlayerGui:FindFirstChild('HostQuiz'):Destroy()
- end
- end
- end
- local function GradeTest(player, Answers, Class, Seat)
- local test = _Settings.Tests[c.ClassRooms[tonumber(Class)].Test]
- local grade = 0
- if Answers ~= nil then
- for i,v in pairs(Answers)do
- grade += tonumber(v)
- end
- else
- grade = 0
- end
- local Final = (grade / #test)*100
- c.ClassRooms[tonumber(Class)]['Seats'][tonumber(Seat)].Status = 'Submitted'
- c.ClassRooms[tonumber(Class)]['Seats'][tonumber(Seat)].Score = Final
- game.Workspace:FindFirstChild('Classrooms'):FindFirstChild(Class):FindFirstChild('Remotes'):FindFirstChild('TestSubmitted'):FireClient(player, Final)
- game.Workspace:FindFirstChild('Classrooms'):FindFirstChild(Class):FindFirstChild('Remotes'):FindFirstChild('HostTestSubmitted'):FireAllClients(Seat)
- end
- local function EndTest(player, class)
- warn('End Test')
- if c.ClassRooms[tonumber(class)] then
- --warn('Check Classroom')
- local f = c.ClassRooms[tonumber(class)]
- if f.Status == 'Testing' then
- warn('Check Status')
- f.Status = 'Ending'
- Workspace:FindFirstChild('Classrooms'):FindFirstChild(class):FindFirstChild('Remotes'):FindFirstChild('TestEnded'):FireAllClients(c.ClassRooms[tonumber(class)].Serial)
- end
- end
- end
- local function RequestSeatInfo(player, Class, seat)
- if c.ClassRooms[tonumber(Class)]['Seats'][tonumber(seat)].Occupant ~= 'NIL' then
- return {c.ClassRooms[tonumber(Class)]['Seats'][tonumber(seat)].Occupant, c.ClassRooms[tonumber(Class)]['Seats'][tonumber(seat)].Status, c.ClassRooms[tonumber(Class)]['Seats'][tonumber(seat)].Score}
- end
- return nil
- end
- function c:GetScore(player, class)
- end
- local function PlayerLeaving(player, class, seat)
- c.ClassRooms[class]['Seats'][seat] = {Occupant = 'NIL', Status = 'NIL', Score = 0}
- Workspace:FindFirstChild('Classrooms'):FindFirstChild(tostring(class)):FindFirstChild('Remotes'):FindFirstChild('PlayerLeft'):FireAllClients(seat)
- end
- local function EndClassroom(player, class)
- --warn('End Classroom')
- local players = GetOccupiedSeats(class)
- if players then
- --warn('Players')
- for i,v in pairs(players)do
- -- print('For Players', v.player)
- Players:FindFirstChild(v.player).PlayerGui:FindFirstChild('PlayerQuiz'):Destroy()
- Players:FindFirstChild(v.player).Character.Humanoid.JumpPower = 50
- end
- end
- player.PlayerGui:FindFirstChild('HostQuiz'):Destroy()
- CleanClassroom(class)
- --warn('Classroom Ended')
- end
- local function SeatFixList(player, class)
- if class then
- if c.ClassRooms[tonumber(class)] then
- if c.ClassRooms[tonumber(class)].Status ~= 'Free' then
- return GetSeatList(class)
- end
- end
- end
- end
- function c:GetClassroomInformation(class)
- return c.ClassRooms[tonumber(class)]
- end
- function c:HostSetup(host, class)
- --warn(host, class, ' - Host Set up Check')
- local f = c.ClassRooms[tonumber(class.Name)]
- if f.Host == nil then
- --warn(host, class, ' - No Host Check')
- if host.PlayerGui:FindFirstChild('HostQuiz') then
- warn('Player currently holds a HostQuiz Gui, checking if currently Host.')
- if FindClassHost(host) then
- return warn('Player Currently hosting a Class, can not host two classes at one time!')
- else
- print('Player Does NOT Host a Class, sending new Class Information')
- RemoteHostSetup:FireClient(host, class)
- end
- else
- --warn(host, class, ' - No Host Gui Check')
- local c = HostQuiz:Clone()
- c.Parent = host.PlayerGui
- RemoteHostSetup:FireClient(host, class)
- end
- end
- end
- function c:StartClassroom(host, class, test)
- --warn(host, class, ' - Start Class Check')
- if host:IsA('Player') and c.ClassRooms[tonumber(class.Name)]['Host'] == nil then
- --warn(host, class, ' - No Host Check')
- c.ClassRooms[tonumber(class.Name)]['Host'] = host
- ClearPotentialHost()
- if _Settings.Tests[test] then
- --warn(host, class, ' - Test Exists Check')
- c.ClassRooms[tonumber(class.Name)]['Test'] = test
- c.ClassRooms[tonumber(class.Name)]['Status'] = 'Occupied'
- end
- end
- end
- function c:BeginTest(class, host)
- --warn('BEGIN TEST')
- if c.ClassRooms[tonumber(class.Name)]['Test'] ~= nil then
- --warn('TEST IS NOT NIL')
- c.ClassRooms[tonumber(class.Name)].Serial = math.random(100,999)
- local f = c.ClassRooms[tonumber(class.Name)]
- local players = GetOccupiedSeats(class.Name)
- if players then
- --warn('TEST PLAYERS EXIST')
- for i,v in pairs(players)do -- ["player"] = Player1
- --print('Handing Quiz Gui', v.player)
- local clone = PlayerQuiz:Clone()
- clone.Parent = Players:FindFirstChild(v.player).PlayerGui
- QuizSetup:FireClient(Players:FindFirstChild(v.player), c.ClassRooms[tonumber(class.Name)]['Host'], _Settings.Tests[c.ClassRooms[tonumber(class.Name)]['Test']], c.ClassRooms[tonumber(class.Name)]['Test'], class.Name, v.seat, c.ClassRooms[tonumber(class.Name)].Serial)
- end
- end
- c.ClassRooms[tonumber(class.Name)].Remotes['A'] = Workspace:FindFirstChild('Classrooms'):FindFirstChild(class.Name):FindFirstChild('Remotes'):FindFirstChild('TestSubmitted').OnServerEvent:Connect(GradeTest)
- c.ClassRooms[tonumber(class.Name)].Remotes['B'] = Workspace:FindFirstChild('Classrooms'):FindFirstChild(class.Name):FindFirstChild('Remotes'):FindFirstChild('TestEnded').OnServerEvent:Connect(EndTest)
- c.ClassRooms[tonumber(class.Name)].Remotes['C'] = Workspace:FindFirstChild('Classrooms'):FindFirstChild(class.Name):FindFirstChild('Remotes'):FindFirstChild('EndClass').OnServerEvent:Connect(EndClassroom)
- Workspace:FindFirstChild('Classrooms'):FindFirstChild(class.Name):FindFirstChild('Remotes'):FindFirstChild('ClassBoard'):FireClient(host, players) -- This is to get the list of players in the class, to the Host/Client
- --
- f.Status = 'Testing'
- end
- end
- function c:OnModeSwitched()
- for i,v in pairs(c.ClassRooms)do
- if v.Status ~= 'Free' then
- EndClassroom(v.Host, tonumber(tostring(i)))
- end
- end
- end
- function c:CheckPlayer(player)
- for i,v in pairs(c.ClassRooms)do
- if v.Status == 'Testing' then
- for a,b in pairs(v.Seats)do
- if b.Occupant == player then
- PlayerLeaving(player, tonumber(tostring(i)), tonumber(tostring(a)))
- end
- end
- end
- end
- end
- SortClassrooms()
- RequestSeatInformation.OnServerInvoke = RequestSeatInfo
- RequestSeatFix.OnServerInvoke = SeatFixList
- return c
Advertisement
Add Comment
Please, Sign In to add comment