Plates of Doom (rework)

Run Settings
LanguageLua
Language Version
Run Command
local __DARKLUA_BUNDLE_MODULES __DARKLUA_BUNDLE_MODULES = { cache = {}, load = function(m) if not __DARKLUA_BUNDLE_MODULES.cache[m] then __DARKLUA_BUNDLE_MODULES.cache[m] = { c = __DARKLUA_BUNDLE_MODULES[m](), } end return __DARKLUA_BUNDLE_MODULES.cache[m].c end, } do function __DARKLUA_BUNDLE_MODULES.a() local Maid = {} Maid.ClassName = 'Maid' function Maid.new() return setmetatable({_tasks = {}}, Maid) end function Maid.isMaid(value) return type(value) == 'table' and value.ClassName == 'Maid' end function Maid:__index(index) if Maid[index] then return Maid[index] else return self._tasks[index] end end function Maid:__newindex(index, newTask) if Maid[index] ~= nil then error(string.format("Cannot use '%s' as a Maid key", tostring(index)), 2) end local tasks = self._tasks local job = tasks[index] if job == newTask then return end tasks[index] = newTask if job then local jobType = typeof(job) if jobType == 'function' then job() elseif jobType == 'table' then if type(job.Destroy) == 'function' then job:Destroy() end elseif jobType == 'Instance' then job:Destroy() elseif jobType == 'thread' then local cancelled if coroutine.running() ~= job then cancelled = pcall(function() task.cancel(job) end) end if not cancelled then task.defer(function() task.cancel(job) end) end elseif jobType == 'RBXScriptConnection' then job:Disconnect() end end end function Maid:Add(task) if not task then error('Task cannot be false or nil', 2) end self[#self._tasks + 1] = task if type(task) == 'table' and not task.Destroy then warn('[Maid.Add] - Gave table task without .Destroy\n\n' .. debug.traceback()) end return task end function Maid:GiveTask(task) if not task then error('Task cannot be false or nil', 2) end local taskId = #self._tasks + 1 self[taskId] = task if type(task) == 'table' and not task.Destroy then warn('[Maid.GiveTask] - Gave table task without .Destroy\n\n' .. debug.traceback()) end return taskId end function Maid:GivePromise(promise) if not promise:IsPending() then return promise end local newPromise = promise.resolved(promise) local id = self:GiveTask(newPromise) newPromise:Finally(function() self[id] = nil end) return newPromise end function Maid:DoCleaning() local tasks = self._tasks for index, job in pairs(tasks)do if typeof(job) == 'RBXScriptConnection' then tasks[index] = nil job:Disconnect() end end local index, job = next(tasks) while job ~= nil do tasks[index] = nil local jobType = typeof(job) if jobType == 'function' then job() elseif jobType == 'table' and type(job.Destroy) == 'function' then job:Destroy() elseif jobType == 'Instance' then job:Destroy() elseif jobType == 'thread' then local cancelled if coroutine.running() ~= job then cancelled = pcall(function() task.cancel(job) end) end if not cancelled then local toCancel = job task.defer(function() task.cancel(toCancel) end) end elseif jobType == 'RBXScriptConnection' then job:Disconnect() end index, job = next(tasks) end end Maid.Destroy = Maid.DoCleaning return Maid end function __DARKLUA_BUNDLE_MODULES.b() return __DARKLUA_BUNDLE_MODULES.load'a'.new() end function __DARKLUA_BUNDLE_MODULES.c() local assets = Instance.new'Folder' return assets end function __DARKLUA_BUNDLE_MODULES.d() local assets, add, InsertService = Instance.new'Folder', function( name, to, what ) what.Name = name what.Parent = to return what end, game:GetService'InsertService' local insertMesh = function(meshId, collisionFidelity, renderFidelity) while true do local __DARKLUA_CONTINUE_3 = false repeat local success, mesh = pcall(InsertService.CreateMeshPartAsync, InsertService, meshId, collisionFidelity or Enum.CollisionFidelity.Default, renderFidelity or Enum.RenderFidelity.Automatic) if not success then warn(string.format('Failed to create mesh "%s": %s', tostring(meshId), tostring(mesh))) task.wait(0.5) __DARKLUA_CONTINUE_3 = true break end return mesh until true if not __DARKLUA_CONTINUE_3 then break end end end do local meshFolder = add('PlateMesh', assets, Instance.new'Folder') add('Block', meshFolder, insertMesh'rbxassetid://13307406342') add('Ball', meshFolder, insertMesh'rbxassetid://11640745670') add('Cylinder', meshFolder, insertMesh'rbxassetid://18406029582') end do local lifeLinkBeam = (add('LifeLinkBeam', assets, Instance.new'Beam')) lifeLinkBeam.Color = ColorSequence.new(Color3.new(0, 1, 0)) lifeLinkBeam.Transparency = NumberSequence.new{ NumberSequenceKeypoint.new(0, 1), NumberSequenceKeypoint.new(0.1, 0.75), NumberSequenceKeypoint.new(0.2, 0.75), NumberSequenceKeypoint.new(0.3, 0.4), NumberSequenceKeypoint.new(0.7, 0.4), NumberSequenceKeypoint.new(0.8, 0.75), NumberSequenceKeypoint.new(0.9, 0.75), NumberSequenceKeypoint.new(1, 1), } lifeLinkBeam.FaceCamera = true end return assets end function __DARKLUA_BUNDLE_MODULES.e() local assets = Instance.new'Folder' return assets end function __DARKLUA_BUNDLE_MODULES.f() local Assets = { Server = nil, Client = nil, Shared = nil, } Assets.Shared = __DARKLUA_BUNDLE_MODULES.load'c' if game:GetService'RunService':IsServer() then Assets.Server = __DARKLUA_BUNDLE_MODULES.load'd' else Assets.Client = __DARKLUA_BUNDLE_MODULES.load'e' end return table.freeze(Assets) end function __DARKLUA_BUNDLE_MODULES.g() local freeRunnerThread local acquireRunnerThreadAndCallEventHandler = function(fn, ...) local acquiredRunnerThread = freeRunnerThread freeRunnerThread = nil fn(...) freeRunnerThread = acquiredRunnerThread end local runEventHandlerInFreeThread, Connection = function(...) acquireRunnerThreadAndCallEventHandler(...) while true do acquireRunnerThreadAndCallEventHandler(coroutine.yield()) end end, {} Connection.__index = Connection function Connection:Disconnect() if not self.Connected then return end self.Connected = false if self._signal._handlerListHead == self then self._signal._handlerListHead = self._next else local prev = self._signal._handlerListHead while prev and prev._next ~= self do prev = prev._next end if prev then prev._next = self._next end end end Connection.Destroy = Connection.Disconnect setmetatable(Connection, { __index = function(_tb, key) error(('Attempt to get Connection::%s (not a valid member)'):format(tostring(key)), 2) end, __newindex = function(_tb, key, _value) error(('Attempt to set Connection::%s (not a valid member)'):format(tostring(key)), 2) end, }) local Signal = {} Signal.__index = Signal function Signal.new() local self = setmetatable({ _handlerListHead = false, _proxyHandler = nil, _yieldedThreads = nil, }, Signal) return self end function Signal.Wrap(rbxScriptSignal) assert(typeof(rbxScriptSignal) == 'RBXScriptSignal', 'Argument #1 to Signal.Wrap must be a RBXScriptSignal; got ' .. typeof(rbxScriptSignal)) local signal = Signal.new() signal._proxyHandler = rbxScriptSignal:Connect(function(...) signal:Fire(...) end) return signal end function Signal.Is(obj) return type(obj) == 'table' and getmetatable(obj) == Signal end function Signal:Connect(fn) local connection = setmetatable({ Connected = true, _signal = self, _fn = fn, _next = false, }, Connection) if self._handlerListHead then connection._next = self._handlerListHead self._handlerListHead = connection else self._handlerListHead = connection end return connection end function Signal:ConnectOnce(fn) return self:Once(fn) end function Signal:Once(fn) local connection, done = nil, false connection = self:Connect(function(...) if done then return end done = true connection:Disconnect() fn(...) end) return connection end function Signal:GetConnections() local items, item = {}, self._handlerListHead while item do table.insert(items, item) item = item._next end return items end function Signal:DisconnectAll() local item = self._handlerListHead while item do item.Connected = false item = item._next end self._handlerListHead = false local yieldedThreads = rawget(self, '_yieldedThreads') if yieldedThreads then for thread in next, yieldedThreads do if coroutine.status(thread) == 'suspended' then warn(debug.traceback(thread, 'signal disconnected; yielded thread cancelled', 2)) task.cancel(thread) end end table.clear(self._yieldedThreads) end end function Signal:Fire(...) local item = self._handlerListHead while item do if item.Connected then if not freeRunnerThread then freeRunnerThread = coroutine.create(runEventHandlerInFreeThread) end task.spawn(freeRunnerThread, item._fn, ...) end item = item._next end end function Signal:FireDeferred(...) local item = self._handlerListHead while item do local conn = item task.defer(function(...) if conn.Connected then conn._fn(...) end end, ...) item = item._next end end function Signal:Wait() local yieldedThreads = rawget(self, '_yieldedThreads') if not yieldedThreads then yieldedThreads = {} rawset(self, '_yieldedThreads', yieldedThreads) end local thread = coroutine.running() yieldedThreads[thread] = true self:Once(function(...) yieldedThreads[thread] = nil task.spawn(thread, ...) end) return coroutine.yield() end function Signal:Destroy() self:DisconnectAll() local proxyHandler = rawget(self, '_proxyHandler') if proxyHandler then proxyHandler:Disconnect() end end setmetatable(Signal, { __index = function(_tb, key) error(('Attempt to get Signal::%s (not a valid member)'):format(tostring(key)), 2) end, __newindex = function(_tb, key, _value) error(('Attempt to set Signal::%s (not a valid member)'):format(tostring(key)), 2) end, }) return table.freeze{ new = Signal.new, Wrap = Signal.Wrap, Is = Signal.Is, } end function __DARKLUA_BUNDLE_MODULES.h() local Signal, RunService, Scheduler = __DARKLUA_BUNDLE_MODULES.load'g', game:GetService'RunService', {} Scheduler.__index = Scheduler function Scheduler.new(rate, fixed) local self = setmetatable({ Signal = (Signal.new()), Active = false, rate = rate or 1.6666666666666665E-2, fixed = fixed or false, dt = 0, dtOffset = 0, durationThread = nil, }, Scheduler) self:Start() return self end function Scheduler.fixed(rate) return Scheduler.new(rate, true) end function Scheduler.connect(rate, callback) local self = Scheduler.new(rate) local connection = self:Connect(callback) return self, connection end function Scheduler.connectFixed(rate, callback) local self = Scheduler.fixed(rate) local connection = self:Connect(callback) return self, connection end function Scheduler:Destroy() self:Stop() self.Signal:Destroy() end function Scheduler:Connect(callback) return self.Signal:Connect(callback) end function Scheduler:Wait() return self.Signal:Wait() end function Scheduler:Step(dt) self.Signal:Fire(dt or self.rate) end local scheduled = {} function Scheduler:Start(duration) if not self.Active then self.Active = true local index = table.find(scheduled, self) if not index then table.insert(scheduled, self) end end if self.durationThread then task.cancel(self.durationThread) self.durationThread = nil end if duration then self.durationThread = task.delay(duration, function() self.durationThread = nil self:Stop() end) end end function Scheduler:Stop(duration) if self.Active then self.Active = false local index = table.find(scheduled, self) if index then table.remove(scheduled, index) end end if self.durationThread then task.cancel(self.durationThread) self.durationThread = nil end if duration then self.durationThread = task.delay(duration, function() self.durationThread = nil self:Start() end) end end local update = function(dtUpdate) for _, scheduler in ipairs(scheduled)do local dt, rate = scheduler.dt, scheduler.rate dt += dtUpdate if scheduler.fixed then while dt >= rate do scheduler.Signal:Fire(rate) dt -= rate end elseif dt >= rate then scheduler.Signal:Fire(dt - scheduler.dtOffset) dt = math.min(dt - rate, rate) scheduler.dtOffset = dt end scheduler.dt = dt end end local updateLoop = RunService.Heartbeat:Connect(update) __DARKLUA_BUNDLE_MODULES.load'b':GiveTask(updateLoop) return Scheduler end function __DARKLUA_BUNDLE_MODULES.i() local ipairs, table = ipairs, table return function(enumItems) local enum = {} for index, name in ipairs(enumItems)do enum[name] = index - 1 enum[index - 1] = name end setmetatable(enum, { __index = function(_, index) return error(string.format('"%s" is not a valid enum item.', tostring(index)), 2) end, }) return table.freeze(enum) end end function __DARKLUA_BUNDLE_MODULES.j() local Enum = __DARKLUA_BUNDLE_MODULES.load'i' return table.freeze{ Server = Enum{ 'Connect', 'Event', 'Invoke', }, Client = Enum{ 'ConnectResult', 'Event', 'InvokeResult', 'Disconnect', }, } end function __DARKLUA_BUNDLE_MODULES.k() return 'Network' end function __DARKLUA_BUNDLE_MODULES.l() local Maid, Signal, Scheduler, HeadMaid, HttpService, Players, ReplicatedStorage, RunService, Methods = __DARKLUA_BUNDLE_MODULES.load'a', __DARKLUA_BUNDLE_MODULES.load'g', __DARKLUA_BUNDLE_MODULES.load'h', __DARKLUA_BUNDLE_MODULES.load'b', game:GetService'HttpService', game:GetService'Players', game:GetService'ReplicatedStorage', game:GetService'RunService', __DARKLUA_BUNDLE_MODULES.load'j' local Network = {} Network.Maid = HeadMaid:Add(Maid.new()) Network.Id = __DARKLUA_BUNDLE_MODULES.load'k' Network.Connected = (Network.Maid:Add(Signal.new())) Network.Disconnected = (Network.Maid:Add(Signal.new())) Network.ConnectedPlayers = {} Network.ListeningPlayers = ({}) Network.PlayerKeys = ({}) Network.Events = {} Network.Invokes = {} Network.Maid:GiveTask(function() table.clear(Network.ConnectedPlayers) end) local send = function(player, method, ...) do task.spawn(function(...) while true do if not Network.ConnectedPlayers[player] then return end if Network.ListeningPlayers[player] then break end task.wait() end Network.Maid.Remote:FireClient(player, Network:GetKey(player), method, ...) end, ...) end end function Network:SetId(id) Network.Id = id end function Network:GetConnected() local connected = {} for player, _ in next, Network.ConnectedPlayers do table.insert(connected, player) end return connected end function Network:IsConnected(player) return Network.ConnectedPlayers[player] ~= nil end function Network:SetKey(player, key) Network.PlayerKeys[player] = key end function Network:GetKey(player) local key = Network.PlayerKeys[player] return key and key.Client end function Network:GenerateKey() return { Server = HttpService:GenerateGUID(false), Client = HttpService:GenerateGUID(false), } end function Network:Connect(player) local wasConnected = Network:IsConnected(player) Network.ConnectedPlayers[player] = os.clock() do Network.ListeningPlayers[player] = true end if not wasConnected then Network.Connected:Fire(player) end end function Network:Disconnect(player, why) if not Network:IsConnected(player) then return end Network.Maid.Remote:FireClient(player, Network:GetKey(player), Methods.Client.Disconnect, why) Network.ConnectedPlayers[player] = nil do Network.ListeningPlayers[player] = nil Network.PlayerKeys[player] = nil end Network.Disconnected:Fire(player) end function Network:CreateRemote() do table.clear(Network.ListeningPlayers) end local remote = Instance.new'RemoteEvent' Network.Maid.Remote = remote remote.Name = Network.Id remote.Archivable = false remote.Parent = ReplicatedStorage Network.Maid.OnServerEvent = remote.OnServerEvent:Connect(function( player, key, method, ... ) if method == Methods.Server.Connect and not Network:IsConnected(player) then if (key == nil or not Network.PlayerKeys[player] or key ~= Network.PlayerKeys[player].Server) then return remote:FireClient(player, Network:GetKey(player), Methods.Client.ConnectResult, false) end remote:FireClient(player, Network:GetKey(player), Methods.Client.ConnectResult, true) Network:Connect(player) return end do if key == nil or not Network.PlayerKeys[player] or key ~= Network.PlayerKeys[player].Server then return end end Network:Connect(player) if method == Methods.Server.Event then local event = ... local callback = Network.Events[event] if callback then callback(player, select(2, ...)) end elseif method == Methods.Server.Invoke then local invoke, id = ... local callback = Network.Invokes[invoke] if callback then send(player, Methods.Client.InvokeResult, id, callback(player, select(3, ...))) end end end) end function Network:IsRemoteOK() local remote = Network.Maid.Remote if not remote then return false end return remote.Parent == ReplicatedStorage and remote.Name == Network.Id end function Network:Init() Network:CreateRemote() do Network.Maid.RefitLoop = Scheduler.connect(5, function() Network:CreateRemote() end) Network.Maid.RefitCheckLooop = RunService.PostSimulation:Connect(function( ) if not Network:IsRemoteOK() then Network:CreateRemote() end end) end Network.Maid.DisconnectLoop = Scheduler.connect(1, function() for player, lastPing in next, Network.ConnectedPlayers do local __DARKLUA_CONTINUE_16 = false repeat if player.Parent ~= Players then Network:Disconnect(player, 'You left game') __DARKLUA_CONTINUE_16 = true break end if os.clock() - lastPing > 15 then Network:Disconnect(player, 'You stopped pinging the server') __DARKLUA_CONTINUE_16 = true break end __DARKLUA_CONTINUE_16 = true until true if not __DARKLUA_CONTINUE_16 then break end end end) end function Network:FireClient(player, event, ...) send(player, Methods.Client.Event, event, ...) end function Network:FireAllClients(event, ...) for player in next, Network.ConnectedPlayers do send(player, Methods.Client.Event, event, ...) end end function Network.event(name, callback) Network.Events[name] = callback return function() if Network.Events[name] == callback then Network.Events[name] = nil end end end function Network.invoke(name, callback) Network.Invokes[name] = callback return function() if Network.Invokes[name] == callback then Network.Invokes[name] = nil end end end return Network end function __DARKLUA_BUNDLE_MODULES.m() local Network, Status = __DARKLUA_BUNDLE_MODULES.load'l', {} Status.Current = '...' Network.invoke('GetStatus', function() return Status.Current end) function Status:Set(text) if Status.Current == text then return end Status.Current = text Network:FireAllClients('SetStatus', text) end return setmetatable(Status, { __call = Status.Set, }) end function __DARKLUA_BUNDLE_MODULES.n() local Network, Maid, Signal, HeadMaid = __DARKLUA_BUNDLE_MODULES.load'l', __DARKLUA_BUNDLE_MODULES.load'a', __DARKLUA_BUNDLE_MODULES.load'g', __DARKLUA_BUNDLE_MODULES.load'b' local Teams = {} Teams.Maid = HeadMaid:Add(Maid.new()) Teams.List = {} Teams.Updated = (Teams.Maid:Add(Signal.new())) local mapTeamsList = function() local mapped = {} for player, team in next, Teams.List do mapped[tostring(player.UserId)] = team end return mapped end Teams.Maid:GiveTask(Teams.Updated:Connect(function() Teams.Maid.UpdateThread = task.defer(function() Network:FireAllClients('UpdateTeams', mapTeamsList()) end) end)) Network.invoke('GetTeams', function() return mapTeamsList() end) function Teams:Assign(player, team) local oldTeam = Teams.List[player] Teams.List[player] = team Teams.Updated:Fire(player, team, oldTeam) end function Teams:Get(player) return Teams.List[player] end function Teams:GetPlayers(team) local players = {} for player, playerTeam in next, Teams.List do if playerTeam == team then table.insert(players, player) end end return players end function Teams:GetAmount(team) return #Teams:GetPlayers(team) end Network.Disconnected:Connect(function(player) Teams:Assign(player, nil) end) return Teams end function __DARKLUA_BUNDLE_MODULES.o() return __DARKLUA_BUNDLE_MODULES.load'i'{ 'Playing', 'Lobby', } end function __DARKLUA_BUNDLE_MODULES.p() local Maid = {} Maid.ClassName = 'Maid' function Maid.new() return setmetatable({_tasks = {}}, Maid) end function Maid.isMaid(value) return type(value) == 'table' and value.ClassName == 'Maid' end function Maid:__index(index) if Maid[index] then return Maid[index] else return self._tasks[index] end end function Maid:__newindex(index, newTask) if Maid[index] ~= nil then error(string.format("Cannot use '%s' as a Maid key", tostring(index)), 2) end local tasks = self._tasks local job = tasks[index] if job == newTask then return end tasks[index] = newTask if job then local jobType = typeof(job) if jobType == 'function' then job() elseif jobType == 'table' then if type(job.Destroy) == 'function' then job:Destroy() end elseif jobType == 'Instance' then job:Destroy() elseif jobType == 'thread' then local cancelled if coroutine.running() ~= job then cancelled = pcall(function() task.cancel(job) end) end if not cancelled then task.defer(function() task.cancel(job) end) end elseif jobType == 'RBXScriptConnection' then job:Disconnect() end end end function Maid:Add(task) if not task then error('Task cannot be false or nil', 2) end self[#self._tasks + 1] = task if type(task) == 'table' and not task.Destroy then warn('[Maid.Add] - Gave table task without .Destroy\n\n' .. debug.traceback()) end return task end function Maid:GiveTask(task) if not task then error('Task cannot be false or nil', 2) end local taskId = #self._tasks + 1 self[taskId] = task if type(task) == 'table' and not task.Destroy then warn('[Maid.GiveTask] - Gave table task without .Destroy\n\n' .. debug.traceback()) end return taskId end function Maid:GivePromise(promise) if not promise:IsPending() then return promise end local newPromise = promise.resolved(promise) local id = self:GiveTask(newPromise) newPromise:Finally(function() self[id] = nil end) return newPromise end function Maid:DoCleaning() local tasks = self._tasks for index, job in pairs(tasks)do if typeof(job) == 'RBXScriptConnection' then tasks[index] = nil job:Disconnect() end end local index, job = next(tasks) while job ~= nil do tasks[index] = nil local jobType = typeof(job) if jobType == 'function' then job() elseif jobType == 'table' and type(job.Destroy) == 'function' then job:Destroy() elseif jobType == 'Instance' then job:Destroy() elseif jobType == 'thread' then local cancelled if coroutine.running() ~= job then cancelled = pcall(function() task.cancel(job) end) end if not cancelled then local toCancel = job task.defer(function() task.cancel(toCancel) end) end elseif jobType == 'RBXScriptConnection' then job:Disconnect() end index, job = next(tasks) end end Maid.Destroy = Maid.DoCleaning return Maid end function __DARKLUA_BUNDLE_MODULES.q() return function(origin, arenaSize, lavaHeight) local lobby = Instance.new'Folder' local newPart = function(class) local basePart = Instance.new(class or 'Part') basePart.Anchored = true basePart.Material = Enum.Material.SmoothPlastic basePart.Parent = lobby return basePart end do local makeCorner, offset = function(position) local corner = newPart() corner.Color = Color3.fromRGB(103, 102, 104) corner.Size = Vector3.new(24, 1, 24) corner.Position = position local createSpawn = function(x, z) local spawnPart = newPart'Part' spawnPart.Name = 'SpawnLocation' spawnPart.Size = Vector3.new(8, 0.5, 8) spawnPart.Position = position + Vector3.new(x, 0.75, z) spawnPart.Parent = lobby local decal = Instance.new'Decal' decal.Texture = 'rbxasset://textures/SpawnLocation.png' decal.Face = Enum.NormalId.Top decal.Parent = spawnPart end createSpawn(5, 5) createSpawn(-5, 5) createSpawn(5, -5) createSpawn(-5, -5) end, 17 + arenaSize / 2 local xOffset, zOffset = Vector3.xAxis * offset, Vector3.zAxis * offset makeCorner(origin + xOffset + zOffset) makeCorner(origin - xOffset + zOffset) makeCorner(origin + xOffset - zOffset) makeCorner(origin - xOffset - zOffset) end do local makePath, offset = function(position, rotation) local flip, path = rotation % 180 ~= 0, newPart() path.Size = (flip and { (Vector3.new(24, 1, arenaSize + 10)), } or { (Vector3.new(arenaSize + 10, 1, 24)), })[1] path.Position = position local speed1 = newPart() speed1.Color = Color3.fromRGB(127, 127, 130) speed1.Size = (flip and { (Vector3.new(6, 0.1, arenaSize + 4)), } or { (Vector3.new(arenaSize + 4, 0.1, 6)), })[1] speed1.Position = position + Vector3.new(0, 0.55, 0) + (flip and { (Vector3.new(5, 0, 0)), } or { (Vector3.new(0, 0, 5)), })[1] local speed2 = newPart() speed2.Color = speed1.Color speed2.Size = speed1.Size speed2.Position = position + Vector3.new(0, 0.55, 0) + (flip and { (Vector3.new(-5, 0, 0)), } or { (Vector3.new(0, 0, -5)), })[1] local speed = 50 speed1.AssemblyLinearVelocity = (flip and { (Vector3.new(0, 0, -speed)), } or { (Vector3.new(speed, 0, 0)), })[1] speed2.AssemblyLinearVelocity = -speed1.AssemblyLinearVelocity end, 17 + arenaSize / 2 local xOffset, zOffset = Vector3.xAxis * offset, Vector3.zAxis * offset makePath(origin - zOffset, 0) makePath(origin - xOffset, 90) makePath(origin + zOffset, 180) makePath(origin + xOffset, 270) end do local width, lava = 5, newPart() lava.CanCollide = false lava.Position = origin + Vector3.yAxis * (lavaHeight - width / 2) lava.Size = Vector3.new(arenaSize, width, arenaSize) lava.Material = Enum.Material.Neon lava.Color = Color3.fromRGB(211, 56, 17) lava.Touched:Connect(function(hit) hit:BreakJoints() hit:Destroy() end) end return lobby end end function __DARKLUA_BUNDLE_MODULES.r() local HeadMaid, Maid, Network, lobbyCreator, Arena = __DARKLUA_BUNDLE_MODULES.load'b', __DARKLUA_BUNDLE_MODULES.load'p', __DARKLUA_BUNDLE_MODULES.load'l', __DARKLUA_BUNDLE_MODULES.load'q', {} Arena.Maid = HeadMaid:Add(Maid.new()) Arena.ArenaMaid = Arena.Maid:Add(Maid.new()) Arena.Folder = nil Arena.Lobby = nil Arena.Wall = nil Arena.Origin = Vector3.zero Arena.Size = 0 Arena.LavaHeight = -100 local root = script if script.Parent ~= workspace then task.defer(function() script.Parent = workspace end) end local maxPartSize, createWall = 2048, function(position, size) local wall = (Arena.Maid.Lobby:Add(Instance.new'Part')) wall.Anchored = true wall.Transparency = 1 if position then wall.Position = position end if size then wall.Size = size end wall.Parent = Arena.Lobby return wall end function Arena:SetOrigin(origin) Arena.Origin = origin Network:FireAllClients('SetArenaOrigin', origin) end function Arena:SetSize(size) Arena.Size = size Network:FireAllClients('SetArenaSize', size) end function Arena:SetLavaHeight(height) Arena.LavaHeight = height end function Arena:Create() Arena:Remove() Arena:CreateLobby() local arena = Arena.ArenaMaid:Add(Instance.new'Folder') Arena.Folder = arena Arena.ArenaMaid:GiveTask(function() Arena.Arena = nil end) arena.Parent = root end function Arena:Remove() Arena.ArenaMaid:DoCleaning() end function Arena:CreateLobby() local origin, size, maid = Arena.Origin, Arena.Size, Maid.new() Arena.Maid.Lobby = maid Arena.Lobby = lobbyCreator(origin, size, Arena.LavaHeight) Arena.Lobby.Parent = root maid.Lobby = Arena.Lobby local height = maxPartSize Arena.Wall = createWall(origin, Vector3.new(size + 10, height, size + 10)) do local width = maxPartSize / 3 local offset = size / 2 + width / 2 + 5 + 24 local xOffset, zOffset = Vector3.xAxis * offset, Vector3.zAxis * offset createWall(origin + xOffset, Vector3.new(width, height, width * 3)) createWall(origin + zOffset, Vector3.new(width * 3, height, width)) createWall(origin - xOffset, Vector3.new(width, height, width * 3)) createWall(origin - zOffset, Vector3.new(width * 3, height, width)) end Network:FireAllClients('SetArenaLobby', Arena.Lobby) end local removeCollision = function(part) if not part:IsA'BasePart' then return end local noCollisionConstraint = Instance.new'NoCollisionConstraint' noCollisionConstraint.Part0 = part noCollisionConstraint.Part1 = Arena.Wall noCollisionConstraint.Parent = part end function Arena:Allow(instance) removeCollision(instance) instance.DescendantAdded:Connect(removeCollision) for _, descendant in ipairs(instance:GetDescendants())do removeCollision(descendant) end end function Arena.moveTo(model, position) local wall = Arena.Wall if not wall then return model:MoveTo(position) end wall.CanCollide = false model:MoveTo(position) wall.CanCollide = true end Network.invoke('GetArenaSettings', function() return Arena.Origin, Arena.Size, Arena.Lobby end) return Arena end function __DARKLUA_BUNDLE_MODULES.s() local Arena, Players, Character = __DARKLUA_BUNDLE_MODULES.load'r', game:GetService'Players', {} function Character.get(target) if typeof(target) ~= 'Instance' then return end if target:IsA'Player' then return target.Character elseif target:IsA'Model' then return target end end function Character.getRoot(target) local character = Character.get(target) if not character then return end local root = character:FindFirstChild'HumanoidRootPart' if root and root:IsA'BasePart' then return root end end function Character.getPart(target) local character = Character.get(target) if not character then return end local part = character:FindFirstChild'HumanoidRootPart' or character:FindFirstChild'Torso' or character:FindFirstChild'UpperTorso' or character:FindFirstChild'LowerTorso' or character:FindFirstChild'Head' if part and part:IsA'BasePart' then return part end return character:FindFirstChildWhichIsA('BasePart', true) end function Character.getHumanoid(target) local character = Character.get(target) if character then return character:FindFirstChildOfClass'Humanoid' end end function Character.isReady(target) local character = Character.get(target) return Character.getRoot(character) and character:IsDescendantOf(workspace) end function Character.getCFrame(target) local root = Character.getRoot(target) if root then return root.CFrame end end function Character.teleport(target, location, preventClipping) local character = Character.get(target) if not character then return end local root = Character.getRoot(character) if not root then return end local locationCharacter = Character.get(location) if locationCharacter then local locationRoot = Character.getRoot(locationCharacter) if not locationRoot then return end location = locationRoot.CFrame elseif typeof(location) == 'Instance' and location:IsA'BasePart' then location = location.CFrame elseif typeof(location) == 'Vector3' then location = CFrame.new(location) * root.CFrame.Rotation elseif typeof(location) ~= 'CFrame' then return end character.PrimaryPart = root if not preventClipping then return character:PivotTo(location) end local humanoid = Character.getHumanoid(character) local hipHeight = (humanoid and { (humanoid.HipHeight), } or {2})[1] Arena.moveTo(character, location.Position) character:PivotTo(CFrame.new(root.Position + Vector3.yAxis * hipHeight) * location.Rotation) end function Character.freeze(target) local character = Character.get(target) if not character then return end local root = Character.getRoot(character) if root then root.Anchored = true end end function Character.unfreeze(target) local character = Character.get(target) if not character then return end local root = Character.getRoot(character) if root then root.Anchored = false end end function Character.load(player) return pcall(player.LoadCharacter, player) end function Character.refresh(player) local cframe = Character.getCFrame(player) while not Character.load(player) do task.wait() end while not Character.isReady(player) do task.wait() end Character.teleport(player, cframe) end function Character.kill(target) local humanoid = Character.getHumanoid(target) if humanoid then humanoid.Health = 0 end end function Character.remove(target) local character = Character.get(target) if character then local player = Players:GetPlayerFromCharacter(character) if player then player.Character = nil end character:Destroy() end end function Character.damage(target, damage) local humanoid = Character.getHumanoid(target) if humanoid then humanoid:TakeDamage(damage) end end return table.freeze(Character) end function __DARKLUA_BUNDLE_MODULES.t() local Maid, HeadMaid, Arena, Character, Assets, TweenService, RunService, Plate = __DARKLUA_BUNDLE_MODULES.load'a', __DARKLUA_BUNDLE_MODULES.load'b', __DARKLUA_BUNDLE_MODULES.load'r', __DARKLUA_BUNDLE_MODULES.load's', __DARKLUA_BUNDLE_MODULES.load'f', game:GetService'TweenService', game:GetService'RunService', {} local Plates = {} Plate.__index = Plate function Plate.new(owner) local self = setmetatable({}, Plate) self.Maid = Maid.new() self.Owners = (type(owner) == 'table' and {owner} or { {owner}, })[1] self.Part = nil self.PartMaid = self.Maid:Add(Maid.new()) self.CFrame = CFrame.identity self.Move = Vector3.zero self.Rotate = Vector3.zero self.SizeChange = Vector3.zero self.LinearVelocity = Vector3.zero self.AngularVelocity = Vector3.zero table.insert(Plates.List, self) self.Maid:GiveTask(function() local index = table.find(Plates.List, self) if index then table.remove(Plates.List, index) end end) self:Reset() return self end function Plate:Destroy() self.Maid:Destroy() end function Plate.from(plate) local self = Plate.new(table.clone(plate.Owners)) self:Reset(plate.Part) return self end function Plate:UpdateTags() local part = self.Part part:SetAttribute('IsPlate', true) local userIds = {} for _, player in ipairs(self.Owners)do table.insert(userIds, player.UserId) end part:SetAttribute('Owners', table.concat(userIds, ',')) end function Plate:Reset(clone) self.PartMaid:DoCleaning() self.Move = Vector3.zero self.Rotate = Vector3.zero self.SizeChange = Vector3.zero self.LinearVelocity = Vector3.zero self.AngularVelocity = Vector3.zero local part = Instance.fromExisting(clone or Assets.Server.PlateMesh.Block) part.Name = 'Plate' part.Anchored = true part.CFrame = self.CFrame part.Parent = assert(Arena.Folder, 'No Arena exists yet.') self.Part = part if not clone then part.Material = Enum.Material.SmoothPlastic self:SetSize(Plates.DefaultPlateSize) end self.Maid.Removing = part.AncestryChanged:Connect(function() if not part:IsDescendantOf(Arena.Folder) then self:Destroy() end end) local minSize = 0.0011 self.PartMaid:GiveTask(part:GetPropertyChangedSignal'Size':Connect(function( ) local aboveMinSize = 0 if part.Size.X > minSize then aboveMinSize += 1 end if part.Size.Y > minSize then aboveMinSize += 1 end if part.Size.Z > minSize then aboveMinSize += 1 end part.CanCollide = aboveMinSize >= 2 end)) self.PartMaid:GiveTask(RunService.Heartbeat:Connect(function(dt) part.AssemblyLinearVelocity = Vector3.zero part.AssemblyAngularVelocity = Vector3.zero if self.Move ~= Vector3.zero then local move, dtMove = nil, Plates.MovePerSecond * dt if self.Move.Magnitude < dtMove then move = self.Move self.Move = Vector3.zero else move = self.Move.Unit * dtMove self.Move -= move end part.Position += move end if self.Rotate ~= Vector3.zero then local rotate, dtRotate = nil, Plates.RotatePerSecond * dt if self.Rotate.Magnitude < dtRotate then rotate = self.Rotate self.Rotate = Vector3.zero else rotate = self.Rotate.Unit * dtRotate self.Rotate -= rotate end part.Rotation += rotate end if self.SizeChange ~= Vector3.zero then local size, dtSize = nil, Plates.SizePerSecond * dt if self.SizeChange.Magnitude < dtSize then size = self.SizeChange self.SizeChange = Vector3.zero else size = self.SizeChange.Unit * dtSize self.SizeChange -= size end part.Size += size end part.AssemblyLinearVelocity += self.LinearVelocity part.AssemblyAngularVelocity += self.AngularVelocity end)) self.PartMaid:GiveTask(part:GetPropertyChangedSignal'CFrame':Connect(function( ) self.CFrame = part.CFrame end)) self:UpdateTags() self.Maid.Part = part end function Plate:Kill() local killDuration, maid = 15, Maid.new() self.Maid.Kill = maid local sound = (maid:Add(Instance.new'Sound')) sound.SoundId = 'rbxassetid://8863377426' sound.Volume = 4 sound.PlaybackSpeed = Random.new():NextNumber(1.05, 1.175) sound.Parent = self.Part sound:Play() sound.Ended:Once(function() sound:Destroy() end) local oldTransparency = self.Part.Transparency self.Part.Transparency = 0.25 local tween = TweenService:Create(self.Part, TweenInfo.new(killDuration), {Transparency = 1}) tween:Play() maid.CancelTween = function() tween:Cancel() self.Part.Transparency = oldTransparency end maid.Thread = task.delay(killDuration, function() self:Destroy() maid:Destroy() end) end function Plate:SetCFrame(cframe) self.CFrame = cframe self.Part.CFrame = cframe end function Plate:SetPosition(position) self:SetCFrame(CFrame.new(position) * self.CFrame.Rotation) end function Plate:GetMoveTarget() return self.Part.Position + self.Move end function Plate:GetRotateTarget() return self.Part.Rotation + self.Rotate end function Plate:GetCFrameTarget() local targetPosition, targetRotation = self:GetMoveTarget(), self:GetRotateTarget() return CFrame.new(targetPosition) * CFrame.fromOrientation(math.rad(targetRotation.X), math.rad(targetRotation.Y), math.rad(targetRotation.Z)) end function Plate:GetSizeTarget() return self.Part.Size + self.SizeChange end function Plate:MoveTo(position) self.Move = position - self.Part.Position end function Plate:RotateTo(rotation) self.Rotate = rotation - self.Part.Rotation end function Plate:CFrameTo(cframe) local rx, ry, rz = cframe:ToOrientation() local x, y, z = math.deg(rx), math.deg(ry), math.deg(rz) self:MoveTo(cframe.Position) self:RotateTo(Vector3.new(x, y, z)) end function Plate:SizeTo(size) self.SizeChange = size - self.Part.Size end function Plate:SetSize(size) self.Part.Size = size end function Plate:AddSize(size) self:SizeTo(self.Part.Size + size) end function Plate:RemoveSize(size) self:SizeTo(self.Part.Size - size) end function Plate:Grow(amount) return self:AddSize(Vector3.new(amount, (self:GetShape() == Enum.PartType.Ball and {amount} or {0})[1], amount)) end function Plate:Shrink(amount) return self:RemoveSize(Vector3.new(amount, (self:GetShape() == Enum.PartType.Ball and {amount} or {0})[1], amount)) end function Plate:Bring(target) Character.teleport(target, self.CFrame.Position + Vector3.yAxis * 1, true) end function Plate:IsOwner(player) return table.find(self.Owners, player) ~= nil end function Plate:AddOwner(player) if not self:IsOwner(player) then table.insert(self.Owners, player) self:UpdateTags() end end function Plate:RemoveOwner(player) if self:IsOwner(player) then table.remove(self.Owners, table.find(self.Owners, player)) self:UpdateTags() end end function Plate:SetShape(shape) local part, plateMesh = (self.Part), (Assets.Server.PlateMesh) if shape == Enum.PartType.Ball then part:ApplyMesh(plateMesh.Ball) elseif shape == Enum.PartType.Block then part:ApplyMesh(plateMesh.Block) elseif shape == Enum.PartType.Cylinder then part:ApplyMesh(plateMesh.Cylinder) end end function Plate:GetShape() local meshId, plateMesh = (self.Part.MeshId), (Assets.Server.PlateMesh) if meshId == plateMesh.Ball.MeshId then return Enum.PartType.Ball elseif meshId == plateMesh.Block.MeshId then return Enum.PartType.Block elseif meshId == plateMesh.Cylinder.MeshId then return Enum.PartType.Cylinder end end Plates.DefaultPlateSize = Vector3.new(20, 1, 20) Plates.List = {} Plates.new = Plate.new Plates.from = Plate.from Plates.MovePerSecond = 2.5 Plates.RotatePerSecond = 20 Plates.SizePerSecond = 3 function Plates:GetPlates() return Plates.List end function Plates:ClearAll() local list = table.clone(Plates.List) table.clear(Plates.List) for _, plate in ipairs(list)do plate:Destroy() end end function Plates:PlayerDied(player) for _, plate in ipairs(Plates:GetPlates())do local __DARKLUA_CONTINUE_27 = false repeat if not plate:IsOwner(player) then __DARKLUA_CONTINUE_27 = true break end plate:RemoveOwner(player) if #plate.Owners <= 0 then task.defer(function() plate:Kill() end) end __DARKLUA_CONTINUE_27 = true until true if not __DARKLUA_CONTINUE_27 then break end end end HeadMaid:GiveTask(function() Plates:ClearAll() end) return Plates end function __DARKLUA_BUNDLE_MODULES.u() local Teams, Team, Network, Match = __DARKLUA_BUNDLE_MODULES.load'n', __DARKLUA_BUNDLE_MODULES.load'o', __DARKLUA_BUNDLE_MODULES.load'l', {} function Match:GetPlaying() return Teams:GetPlayers(Team.Playing) end function Match:GetAmountPlaying() return Teams:GetAmount(Team.Playing) end function Match:IsPlaying(player) return Teams:Get(player) == Team.Playing end function Match:AssignAll(team) for _, player in ipairs(Network:GetConnected())do Teams:Assign(player, team) end end function Match:AddPlayer(player) Teams:Assign(player, Team.Playing) end function Match:RemovePlayer(player) if Network:IsConnected(player) then Teams:Assign(player, Team.Lobby) else Teams:Assign(player, nil) end end return Match end function __DARKLUA_BUNDLE_MODULES.v() return __DARKLUA_BUNDLE_MODULES.load'i'{ 'None', 'Environment', 'Player', 'Plate', } end function __DARKLUA_BUNDLE_MODULES.w() local RunService, Character, Plates, Arena, Maid, Scheduler, Assets, Match, Selector, random = game:GetService'RunService', __DARKLUA_BUNDLE_MODULES.load's', __DARKLUA_BUNDLE_MODULES.load't', __DARKLUA_BUNDLE_MODULES.load'r', __DARKLUA_BUNDLE_MODULES.load'a', __DARKLUA_BUNDLE_MODULES.load'h', __DARKLUA_BUNDLE_MODULES.load'f', __DARKLUA_BUNDLE_MODULES.load'u', __DARKLUA_BUNDLE_MODULES.load'v', Random.new() local randomBoolean, get2RandomPlayers, get2RandomPlates, parentArena, moveTo = function( ) return random:NextInteger(0, 1) == 1 end, function() local availablePlayers = Match:GetPlaying() if #availablePlayers < 2 then return nil, nil end local player1Index, player2Index = random:NextInteger(1, #availablePlayers), random:NextInteger(1, #availablePlayers - 1) return table.remove(availablePlayers, player1Index), availablePlayers[player2Index] end, function() local availablePlates = table.clone(Plates:GetPlates()) if #availablePlates < 2 then return nil, nil end local plate1Index, plate2Index = random:NextInteger(1, #availablePlates), random:NextInteger(1, #availablePlates - 1) return table.remove(availablePlates, plate1Index), availablePlates[plate2Index] end, function(instance) Arena:Allow(instance) instance.Parent = Arena.Folder end, Arena.moveTo return table.freeze{ { 1, function() local targets = random:NextInteger(1, 2) return string.format('%s plate(s) will return to normal', tostring(targets)), targets end, function(targets) return targets, Selector.Plate end, function(context) context.Plate:Reset() end, }, { 1, function() local targets = random:NextInteger(1, 2) return string.format('%s players(s) will return to normal', tostring(targets)), targets end, function(targets) return targets, Selector.Player end, function(context) Character.refresh(context.Player) end, }, { 1.5, function() local targets, amount = random:NextInteger(1, 3), random:NextInteger(2, 6) return string.format('%s plate(s) will grow by %s studs', tostring(targets), tostring(amount)), targets, amount end, function(targets) return targets, Selector.Plate end, function(context, _, amount) context.Plate:Grow(amount) end, }, { 2, function() local targets, amount = random:NextInteger(1, 3), random:NextInteger(2, 6) return string.format('%s plate(s) will shrink by %s studs', tostring(targets), tostring(amount)), targets, amount end, function(targets) return targets, Selector.Plate end, function(context, _, amount) context.Plate:Shrink(amount) end, }, { 1, function() local targets = random:NextInteger(1, 3) return string.format('%s plate(s) will change color', tostring(targets)), targets end, function(targets) return targets, Selector.Plate end, function(context) context.Plate.Part.Color = Color3.new(random:NextNumber(), random:NextNumber(), random:NextNumber()) end, }, { 1, function() local targets = random:NextInteger(1, 3) return string.format('%s plate(s) will change material', tostring(targets)), targets end, function(targets) return targets, Selector.Plate end, function(context) local materials = { Enum.Material.Brick, Enum.Material.Cobblestone, Enum.Material.Concrete, Enum.Material.CorrodedMetal, Enum.Material.DiamondPlate, Enum.Material.Fabric, Enum.Material.Foil, Enum.Material.ForceField, Enum.Material.Glass, Enum.Material.Granite, Enum.Material.Grass, Enum.Material.Ice, Enum.Material.Marble, Enum.Material.Metal, Enum.Material.Neon, Enum.Material.Pebble, Enum.Material.Plastic, Enum.Material.Sand, Enum.Material.Slate, Enum.Material.SmoothPlastic, Enum.Material.Wood, Enum.Material.WoodPlanks, } context.Plate.Part.Material = materials[random:NextInteger(1, #materials)] end, }, { 1, function() local targets = random:NextInteger(1, 3) return string.format('%s plate(s) will become a disco plate', tostring(targets)), targets end, function(targets) return targets, Selector.Plate end, function(context) local part = context.Plate.Part context.Plate.PartMaid.DiscoThread = task.defer(function() while true do part.Color = Color3.new(random:NextNumber(), random:NextNumber(), random:NextNumber()) task.wait(0.5) end end) end, }, { 1, function() local targets, amount = random:NextInteger(1, 2), random:NextInteger(10, 25) return string.format('%s plate(s) will ascend %s studs', tostring(targets), tostring(amount)), targets, amount end, function(targets) return targets, Selector.Plate end, function(context, _, amount) context.Plate.Move += Vector3.yAxis * amount end, }, { 1, function() local targets, amount = random:NextInteger(1, 2), random:NextInteger(10, 25) return string.format('%s plate(s) will descend %s studs', tostring(targets), tostring(amount)), targets, amount end, function(targets) return targets, Selector.Plate end, function(context, _, amount) context.Plate.Move -= Vector3.yAxis * amount end, }, { 1, function() return '1 plate will return to normal height' end, function() return 1, Selector.Plate end, function(context) context.Plate:MoveTo(context.Plate.Part.Position * Vector3.new(1, 0, 1) + Vector3.yAxis * Arena.Origin.Y) end, }, { 1, function() local targets = random:NextInteger(1, 2) return string.format('%s plate(s) will be split in half', tostring(targets)), targets end, function(targets) return targets, Selector.Plate end, function(context) local plate = context.Plate local half = Plates.from(plate) if #plate.Owners > 1 then local owners = plate.Owners local transferAmount = math.floor(#owners / 2) for _ = 1, transferAmount do local owner = owners[random:NextInteger(1, #owners)] plate:RemoveOwner(owner) end for _, owner in ipairs(plate.Owners)do half:RemoveOwner(owner) end end local splitX, size, cframe = randomBoolean(), plate.Part.Size, plate.CFrame plate.Part.Size = (splitX and { (Vector3.new(size.X / 2, size.Y, size.Z)), } or { (Vector3.new(size.X, size.Y, size.Z / 2)), })[1] half.Part.Size = plate.Part.Size plate:SetCFrame(cframe * (splitX and { (CFrame.new(size.X / 4, 0, 0)), } or { (CFrame.new(0, 0, size.Z / 4)), })[1]) half:SetCFrame(cframe * (splitX and { (CFrame.new(-size.X / 4, 0, 0)), } or { (CFrame.new(0, 0, -size.Z / 4)), })[1]) context:Highlight(half.Part) end, }, { 1.5, '2 plates will merge together', nil, function(context) local plate1, plate2 = get2RandomPlates() if not plate1 or not plate2 then return end local plate1Position, plate2Position, mergeOnX = (plate1.Part.Position), (plate2.Part.Position), randomBoolean() local plate1Positive, maid = (mergeOnX and { (plate1Position.X > plate2Position.X), } or { (plate1Position.Z > plate2Position.Z), })[1], Maid.new() plate1.PartMaid.MergeMaid = maid plate2.PartMaid.MergeMaid = maid local merge, updateMove = function() plate1.PartMaid.MergeMaid = nil plate2.PartMaid.MergeMaid = nil maid:DoCleaning() local part1, part2 = plate1.Part, plate2.Part local size1, size2 = part1.Size, part2.Size local add = (mergeOnX and { (Vector3.new(size2.X, size1.Y - (size1.Y + size2.Y) / 2, size1.Z - (size1.Z + size2.Z) / 2)), } or { (Vector3.new(size1.X - (size1.X + size2.X) / 2, size1.Y - (size1.Y + size2.Y) / 2, size2.Z)), })[1] plate1.Part.Size += add plate1:SetCFrame(plate1.CFrame * CFrame.new(((plate1Positive and { (-add), } or {add})[1]) / 2)) for _, owner in ipairs(plate2.Owners)do plate1:AddOwner(owner) end plate1.LinearVelocity = plate1.LinearVelocity:Lerp(plate2.LinearVelocity, 0.5) plate1.AngularVelocity = plate1.AngularVelocity:Lerp(plate2.AngularVelocity, 0.5) part1.Color = part1.Color:Lerp(part2.Color, 0.5) if plate1:GetShape() ~= plate2:GetShape() then plate1:SetShape(Enum.PartType.Block) end plate2:Destroy() end, function() local plate1Target, plate2Target, plate1Size, plate2Size = (plate1:GetCFrameTarget()), (plate2:GetCFrameTarget()), (plate1.Part.Size), (plate2.Part.Size) local middle, offset = plate1Target:Lerp(plate2Target, 0.5), (mergeOnX and { ((plate1Size.X + plate2Size.X) / 4), } or { ((plate1Size.Z + plate2Size.Z) / 4), })[1] local plate1Offset, plate2Offset = (plate1Positive and {offset} or { (-offset), })[1], (plate1Positive and { (-offset), } or {offset})[1] plate1:CFrameTo(middle * (mergeOnX and { (CFrame.new(plate1Offset, 0, 0)), } or { (CFrame.new(0, 0, plate1Offset)), })[1]) plate2:CFrameTo(middle * (mergeOnX and { (CFrame.new(plate2Offset, 0, 0)), } or { (CFrame.new(0, 0, plate2Offset)), })[1]) local size1, size2 = (plate1:GetSizeTarget()), (plate2:GetSizeTarget()) plate1:SizeTo((mergeOnX and { (Vector3.new(size1.X, (size1.Y + size2.Y) / 2, (size1.Z + size2.Z) / 2)), } or { (Vector3.new((size1.X + size2.X) / 2, (size1.Y + size2.Y) / 2, size1.Z)), })[1]) plate2:SizeTo((mergeOnX and { (Vector3.new(size2.X, (size1.Y + size2.Y) / 2, (size1.Z + size2.Z) / 2)), } or { (Vector3.new((size1.X + size2.X) / 2, (size1.Y + size2.Y) / 2, size2.Z)), })[1]) end updateMove() maid.loop = Scheduler.connect(0.1, function() updateMove() local totalMagnitude = plate1.Move.Magnitude + plate1.Rotate.Magnitude + plate1.SizeChange.Magnitude + plate2.Move.Magnitude + plate2.Rotate.Magnitude + plate2.SizeChange.Magnitude if totalMagnitude < 0.25 then merge() end end) context:ShowPlate(plate1) context:ShowPlate(plate2) end, }, { 1, 'A bridge will be constructed between 2 plates', nil, function(context) local plate1, plate2 = get2RandomPlates() if not plate1 or not plate2 then return end local part1, part2 = plate1.Part, plate2.Part local position1, position2 = part1.Position + Vector3.yAxis * 1, part2.Position + Vector3.yAxis * 1 local distance, bridge = (position1 - position2).Magnitude, Instance.new'Part' bridge.Anchored = false bridge.CanCollide = true bridge.Size = Vector3.new(5, distance, 0.75) bridge.CFrame = CFrame.lookAt(position1, position2) * CFrame.new(0, 0.6, -distance * 0.5) * CFrame.Angles(math.rad(90), 0, 0) parentArena(bridge) bridge:SetNetworkOwner(nil) context:ShowPlate(plate1) context:ShowPlate(plate2) end, }, { 1, '1 plate will recieve a ball', { 1, Selector.Plate, }, function(context) local model, ball = Instance.new'Model', Instance.new'Part' ball.Material = Enum.Material.SmoothPlastic ball.Size = Vector3.one * 7.5 ball.Shape = Enum.PartType.Ball ball.Parent = model parentArena(model) moveTo(model, context.Plate.Part.Position) end, }, { 1, '1 plate will get a laser spinner', { 1, Selector.Plate, }, function(context) local plate = context.Plate local part, maid = plate.Part, plate.PartMaid:Add(Maid.new()) local laser = maid:Add(Instance.new'Part') laser.Anchored = true laser.CanCollide = false laser.Material = Enum.Material.Neon laser.Color = Color3.fromRGB(255, 0, 0) laser.Parent = part maid.TouchedThread = task.delay(1, function() maid.Touched = laser.Touched:Connect(function(hit) Character.damage(hit.Parent, 10) end) end) local rotationPerSec = random:NextNumber(25, 35) if randomBoolean() then rotationPerSec = -rotationPerSec end local rotation = random:NextNumber(0, 360) maid.Loop = RunService.Heartbeat:Connect(function(dt) local maxSize = math.max(part.Size.X, part.Size.Z) laser.Size = Vector3.new((1.4142135623730951) * maxSize, 1, 1) rotation = (rotation + rotationPerSec * dt) % 360 laser.CFrame = part.CFrame * CFrame.new(Vector3.yAxis * (part.Size.Y / 2 + 0.5)) * CFrame.Angles(0, math.rad(rotation), 0) end) end, }, { 1, function() local targets = random:NextInteger(1, 2) return string.format('%s plate(s) will become a treadmill', tostring(targets)), targets end, function(targets) return targets, Selector.Plate end, function(context) local speed, dir = random:NextNumber(8, 12), random:NextInteger(1, 4) if dir == 1 then context.Plate.LinearVelocity += Vector3.new(speed, 0, 0) elseif dir == 2 then context.Plate.LinearVelocity -= Vector3.new(speed, 0, 0) elseif dir == 3 then context.Plate.LinearVelocity += Vector3.new(0, 0, speed) else context.Plate.LinearVelocity -= Vector3.new(0, 0, speed) end end, }, { 1, function() local targets = random:NextInteger(1, 2) return string.format('%s plate(s) will become a trampoline', tostring(targets)), targets end, function(targets) return targets, Selector.Plate end, function(context) local power = random:NextNumber(50, 80) context.Plate.LinearVelocity = Vector3.new(context.Plate.LinearVelocity.X, math.max(context.Plate.LinearVelocity.Y, power), context.Plate.LinearVelocity.Z) end, }, { 1, function() local targets = random:NextInteger(1, 2) return string.format('%s plate(s) will become a cube', tostring(targets)), targets end, function(targets) return targets, Selector.Plate end, function(context) local size = context.Plate:GetSizeTarget() local maxSize = math.max(size.X, size.Y, size.Z) context.Plate:SizeTo(Vector3.one * maxSize) context.Plate:SetShape(Enum.PartType.Block) end, }, { 1, function() local targets = random:NextInteger(1, 2) return string.format('%s plate(s) will become a sphere', tostring(targets)), targets end, function(targets) return targets, Selector.Plate end, function(context) local size = context.Plate:GetSizeTarget() local maxSize = math.max(size.X, size.Y, size.Z) context.Plate:SizeTo(Vector3.one * maxSize) context.Plate:SetShape(Enum.PartType.Ball) end, }, { 1, function() local targets = random:NextInteger(1, 2) return string.format('%s plate(s) will become a cylinder', tostring(targets)), targets end, function(targets) return targets, Selector.Plate end, function(context) local size = context.Plate:GetSizeTarget() local maxSize = math.max(size.X, size.Z) context.Plate:SizeTo(Vector3.new(maxSize, size.Y, maxSize)) context.Plate:SetShape(Enum.PartType.Cylinder) end, }, { 1, function() local targets = random:NextInteger(1, 2) return string.format('%s plate(s) will flip', tostring(targets)), targets end, function(targets) return targets, Selector.Plate end, function(context) local rotation = randomBoolean() and 180 or -180 context.Plate.Rotate += (randomBoolean() and { (Vector3.new(rotation, 0, 0)), } or { (Vector3.new(0, 0, rotation)), })[1] end, }, { 1, function() local targets = random:NextInteger(1, 2) return string.format('%s plate(s) will rotate', tostring(targets)), targets end, function(targets) return targets, Selector.Plate end, function(context) context.Plate.Rotate += Vector3.new(0, (randomBoolean() and 90 or -90) * random:NextNumber(2, 4), 0) end, }, { 1, function() local targets = random:NextInteger(1, 2) return string.format('%s plate(s) will move', tostring(targets)), targets end, function(targets) return targets, Selector.Plate end, function(context) local direction, distance = Vector3.new(random:NextNumber(-1, 1), 0, random:NextNumber( -1, 1)).Unit, random:NextNumber(15, 30) context.Plate.Move += direction * distance end, }, { 1, function() local targets = random:NextInteger(1, 2) return string.format('%s players(s) will teleport to a random plate', tostring(targets)), targets end, function(targets) return targets, Selector.Player end, function(context) local availablePlates = Plates:GetPlates() if #availablePlates < 1 then return end local plate = availablePlates[random:NextInteger(1, #availablePlates)] plate:Bring(context.Player) end, }, { 1, '2 plates will swap position', nil, function(context) local plate1, plate2 = get2RandomPlates() if not plate1 or not plate2 then return end local cframe1, cframe2 = plate1.CFrame, plate2.CFrame plate1:SetCFrame(cframe2) plate2:SetCFrame(cframe1) context:ShowPlate(plate1) context:ShowPlate(plate2) end, }, { 1, '2 players will swap position', nil, function(context) local player1, player2 = get2RandomPlayers() if not player1 or not player2 then return end local cframe1, cframe2 = Character.getCFrame(player1), Character.getCFrame(player2) Character.teleport(player1, cframe2) Character.teleport(player2, cframe1) context:ShowPlayer(player1) context:ShowPlayer(player2) end, }, { 1, function() local targets, amount = random:NextInteger(1, 3), random:NextInteger(3, 7) return string.format('%s player(s) will gain %s walkspeed', tostring(targets), tostring(amount)), targets, amount end, function(targets) return targets, Selector.Player end, function(context, _, amount) local humanoid = (Character.getHumanoid(context.Player)) if humanoid then humanoid.WalkSpeed += amount end end, }, { 1, function() local targets, amount = random:NextInteger(1, 3), random:NextInteger(3, 7) return string.format('%s player(s) will lose %s walkspeed', tostring(targets), tostring(amount)), targets, amount end, function(targets) return targets, Selector.Player end, function(context, _, amount) local humanoid = (Character.getHumanoid(context.Player)) if humanoid then humanoid.WalkSpeed -= amount end end, }, { 1, function() local targets, minutes = random:NextInteger(1, 2), random:NextInteger(1, 2) return string.format('%s player(s) will gain a forcefield for %s minute(s)', tostring(targets), tostring(minutes)), targets, minutes end, function(targets) return targets, Selector.Player end, function(context, _, minutes) local forceField = Instance.new'ForceField' forceField.Parent = context.Player.Character task.delay(minutes * 60, game.Destroy, forceField) end, }, { 1, '2 players lives will becomed linked', nil, function(context) local player1, player2 = get2RandomPlayers() if not player1 or not player2 then return end local character1, character2 = Character.get(player1), Character.get(player2) local humanoid1, humanoid2 = Character.getHumanoid(character1), Character.getHumanoid(character2) humanoid1.Died:Once(function() task.defer(Character.kill, character2) end) humanoid2.Died:Once(function() task.defer(Character.kill, character1) end) context:ShowPlayer(player1) context:ShowPlayer(player2) local part1, part2, attachment1 = Character.getPart(character1), Character.getPart(character2), Instance.new'Attachment' attachment1.Parent = part1 local attachment2 = Instance.new'Attachment' attachment2.Parent = part2 local beam = (Assets.Server.LifeLinkBeam:Clone()) beam.Attachment0 = attachment1 beam.Attachment1 = attachment2 beam.Parent = part1 end, }, { 1, function() local targets = random:NextInteger(1, 1) return string.format('%s player(s) will recieve a ball and chain', tostring(targets)), targets end, function(targets) return targets, Selector.Player end, function(context) local character = Character.get(context.Player) local leftLeg = character:FindFirstChild'Left Leg' or character:FindFirstChild'LeftLowerLeg' if not leftLeg then return end local ball = Instance.new'Part' ball.Color = Color3.new(0, 0, 0) ball.Shape = Enum.PartType.Ball ball.Size = Vector3.one * 2.5 ball.Material = Enum.Material.Metal ball.Position = leftLeg.Position + Vector3.one * 1.5 ball.CustomPhysicalProperties = PhysicalProperties.new(50, 2, 0) ball.Parent = character local attachment0 = Instance.new'Attachment' attachment0.Parent = leftLeg local attachment1 = Instance.new'Attachment' attachment1.Parent = ball local ropeConstraint = Instance.new'RopeConstraint' ropeConstraint.Color = BrickColor.DarkGray() ropeConstraint.Thickness = 0.2 ropeConstraint.Visible = true ropeConstraint.Length = 6 ropeConstraint.Attachment0 = attachment0 ropeConstraint.Attachment1 = attachment1 ropeConstraint.Parent = ball end, }, { 1, function() local targets = random:NextInteger(1, 1) return string.format('%s plate(s) will begin slowly sinking forever', tostring(targets)), targets end, function(targets) return targets, Selector.Plate end, function(context) local plate, sinkPerSecond = context.Plate, 0.3333333333333333 plate.PartMaid.ForeverSink = RunService.Heartbeat:Connect(function( dt ) plate:SetPosition(plate.CFrame.Position - Vector3.yAxis * sinkPerSecond * dt) end) end, }, { 1, function() local targets = random:NextInteger(1, 1) return string.format('%s plate(s) will become an elevator', tostring(targets)), targets end, function(targets) return targets, Selector.Plate end, function(context) local plate, maid = context.Plate, Maid.new() plate.PartMaid.Elevator = maid maid.Thead = task.defer(function() local move, cooldown = 20, 3 local duration = move / Plates.MovePerSecond plate.Move += Vector3.yAxis * move / 2 task.wait(duration / 2 + cooldown) while true do plate.Move -= Vector3.yAxis * move task.wait(duration + cooldown) plate.Move += Vector3.yAxis * move task.wait(duration + cooldown) end end) end, }, { 1, function() local targets = random:NextInteger(1, 1) return string.format('%s plate(s) will be given controls', tostring(targets)), targets end, function(targets) return targets, Selector.Plate end, function(context) local plate = context.Plate local part, maid = plate.Part, Maid.new() plate.PartMaid.Controls = maid local addControl = function(dir, rot) local activeColor, inactiveColor, range, control = Color3.fromRGB(165, 79, 21), Color3.fromRGB(0, 0, 0), 10, (maid:Add(Instance.new'Part')) control.Material = Enum.Material.SmoothPlastic control.Color = activeColor control.Size = Vector3.new(2, 0.1, 2) control.Parent = part local decal = (maid:Add(Instance.new'Decal')) decal.Texture = 'rbxassetid://153287088' decal.Face = Enum.NormalId.Top decal.Parent = control local clickDetector = (maid:Add(Instance.new'ClickDetector')) clickDetector.MaxActivationDistance = range clickDetector.Parent = control local weld = (maid:Add(Instance.new'Weld')) weld.Part0 = part weld.Part1 = control weld.Parent = control local updateWeld = function() local size = part.Size weld.C0 = CFrame.new(dir.X * size.X / 2, size.Y / 2, dir.Z * size.Z / 2) weld.C1 = CFrame.new(-1, -5E-2, 0) * CFrame.Angles(0, math.rad(rot), 0) end updateWeld() maid:GiveTask(part:GetPropertyChangedSignal'Size':Connect(updateWeld)) local db = false clickDetector.MouseClick:Connect(function(player) if db or not Match:IsPlaying(player) then return end local duration = 2 task.delay(duration + 0.5, function() db = false control.Color = activeColor clickDetector.MaxActivationDistance = range end) db = true control.Color = inactiveColor clickDetector.MaxActivationDistance = 0 plate:CFrameTo(CFrame.new(plate:GetMoveTarget()) * plate.CFrame.Rotation * CFrame.new(dir * Plates.MovePerSecond * duration)) end) end addControl(Vector3.new(1, 0, 0), 180) addControl(Vector3.new(-1, 0, 0), 0) addControl(Vector3.new(0, 0, 1), -90) addControl(Vector3.new(0, 0, -1), 90) end, }, } end function __DARKLUA_BUNDLE_MODULES.x() local List, Event = __DARKLUA_BUNDLE_MODULES.load'w', {} Event.__index = Event function Event.new(data) local self = setmetatable({}, Event) self.Data = data return self end function Event:RunFunc(index, ...) local value = self.Data[index] if type(value) == 'function' then return value(...) elseif type(value) == 'table' then return unpack(value) else return value end end function Event:Init() return self:RunFunc(2) end function Event:Selector(...) return self:RunFunc(3, ...) end function Event:Run(context, ...) self.Data[4](context, ...) end local Events = {} function Events:GetPossible(Game) local possible, totalWeight = table.clone(List), 0 for _, data in ipairs(possible)do totalWeight += data[1] end possible.totalWeight = totalWeight return possible end function Events:Get(possible) local random = Random.new() local targetWeight, weightCounter = random:NextInteger(1, possible.totalWeight), 0 for _, data in ipairs(possible)do weightCounter += data[1] if weightCounter >= targetWeight then return Event.new(data) end end end return Events end function __DARKLUA_BUNDLE_MODULES.y() local Functions = {} function Functions.formatPlayerName(player) if player.DisplayName == player.Name then return player.DisplayName end return string.format('%s (@%s)', tostring(player.DisplayName), tostring(player.Name)) end function Functions.formatPlateOwnerName(owners) if #owners == 0 then return 'No one' end local names = table.create(#owners) for index, player in ipairs(owners)do names[index] = Functions.formatPlayerName(player) end return table.concat(names, ' + ') end return table.freeze(Functions) end function __DARKLUA_BUNDLE_MODULES.z() local Status, Network, Maid, HeadMaid, Teams, Team, Arena, Plates, Character, Events, EventSelector, Functions, Scheduler, Match, RunService, Players, Game = __DARKLUA_BUNDLE_MODULES.load'm', __DARKLUA_BUNDLE_MODULES.load'l', __DARKLUA_BUNDLE_MODULES.load'a', __DARKLUA_BUNDLE_MODULES.load'b', __DARKLUA_BUNDLE_MODULES.load'n', __DARKLUA_BUNDLE_MODULES.load'o', __DARKLUA_BUNDLE_MODULES.load'r', __DARKLUA_BUNDLE_MODULES.load't', __DARKLUA_BUNDLE_MODULES.load's', __DARKLUA_BUNDLE_MODULES.load'x', __DARKLUA_BUNDLE_MODULES.load'v', __DARKLUA_BUNDLE_MODULES.load'y', __DARKLUA_BUNDLE_MODULES.load'h', __DARKLUA_BUNDLE_MODULES.load'u', game:GetService'RunService', game:GetService'Players', {} Game.HeadMaid = HeadMaid:Add(Maid.new()) Game.Maid = Game.HeadMaid:Add(Maid.new()) Game.EndEarly = false Game.Paused = false function Game:Restart() Game.EndEarly = true task.defer(function() while Game.EndEarly do Status'Restarting...' task.wait() end end) end function Game:Pause() Game.Paused = true end function Game:Unpause() Game.Paused = false end function Game:YieldIfPaused() while Game.Paused do Status'Game paused' task.wait() end end function Game:Intermission() local duration, playersNeeded = RunService:IsStudio() and 5 or 15, RunService:IsStudio() and 1 or 2 local hasPlayers = function() return #Network:GetConnected() >= playersNeeded end while true do local __DARKLUA_CONTINUE_39 = false repeat if not hasPlayers() then Status(string.format('Waiting for %s more player(s)...', tostring(playersNeeded - #Network:GetConnected()))) task.wait() __DARKLUA_CONTINUE_39 = true break end for left = duration, 1, -1 do if not hasPlayers() then break end Game:YieldIfPaused() Status(string.format('Intermission - %s', tostring(left))) task.wait(1) end if hasPlayers() then break end __DARKLUA_CONTINUE_39 = true until true if not __DARKLUA_CONTINUE_39 then break end end end function Game:StartGame() Status'Starting game...' Match:AssignAll(Team.Playing) local playerAmount = Match:GetAmountPlaying() for _, player in ipairs(Match:GetPlaying())do Character.remove(player) end local plateSize, gap, gridSize = math.max(Plates.DefaultPlateSize.X, Plates.DefaultPlateSize.Z), 5, math.ceil(math.sqrt(playerAmount + 5)) Arena:SetSize((plateSize + gap) * (gridSize + 1)) Arena:Create() Plates:ClearAll() local random, takenSpots, gridMax = Random.new(), {}, gridSize - 1 for _, player in ipairs(Match:GetPlaying())do local __DARKLUA_CONTINUE_42 = false repeat if player.Parent ~= Players then __DARKLUA_CONTINUE_42 = true break end local x, z while true do local __DARKLUA_CONTINUE_43 = false repeat x, z = random:NextInteger(0, gridMax), random:NextInteger(0, gridMax) local coordinate = string.format('%s,%s', tostring(x), tostring(z)) if takenSpots[coordinate] then __DARKLUA_CONTINUE_43 = true break end takenSpots[coordinate] = true break until true if not __DARKLUA_CONTINUE_43 then break end end local plate = Plates.new(player) plate:SetPosition(Arena.Origin + Vector3.new(x - gridMax / 2, 0, z - gridMax / 2) * (plateSize + gap)) while not Character.load(player) do task.wait() end while not Character.isReady(player) do task.wait() end Character.freeze(player) plate:Bring(player) local root = Character.getRoot(player) if root then Character.teleport(player, root.Position + Vector3.yAxis * 3) end __DARKLUA_CONTINUE_42 = true until true if not __DARKLUA_CONTINUE_42 then break end end task.wait(3) for _, player in ipairs(Match:GetPlaying())do Character.unfreeze(player) end task.wait(1) end local eventContext = {} eventContext.Maid = HeadMaid:Add(Maid.new()) eventContext.__index = eventContext function eventContext:Show(name, instance) table.insert(self.Names, name) Status(string.format('%s - %s', tostring(self.Status), tostring(table.concat(self.Names, ' ')))) self:Highlight(instance) end function eventContext:Highlight(instance) local highlight = Instance.new'Highlight' highlight.FillColor = Color3.new(0, 0, 1) highlight.FillTransparency = 0.5 highlight.OutlineColor = Color3.new(1, 1, 1) highlight.OutlineTransparency = 0 highlight.Parent = instance task.delay(0.75, game.Destroy, highlight) local soundTarget = (instance:IsA'Model' and { (instance.PrimaryPart), } or { ((instance:IsA'BasePart' and {instance} or {nil})[1]), })[1] if soundTarget then local sound = Instance.new'Sound' sound.SoundId = 'rbxassetid://6380285152' sound.Volume = 4 sound.PlaybackSpeed = Random.new():NextNumber(1, 1.05) + (#self.Names - 1) * 0.1 sound.Parent = soundTarget sound:Play() sound.Ended:Once(function() sound:Destroy() end) end end function eventContext:ShowPlayer(player) self:Show(Functions.formatPlayerName(player), player.Character) end function eventContext:ShowPlate(plate) return self:Show(Functions.formatPlateOwnerName(plate.Owners), plate.Part) end function Game:RunEvent(possibleEvents) local event = Events:Get(possibleEvents) assert(event, 'Unable to find an event!') local args = table.pack(event:Init()) local status, durationLeft = args[1], 5 while durationLeft > 0 do Game:YieldIfPaused() if Game.EndEarly then return end local display = math.round(math.max(durationLeft, 0) * 10) / 10 local isWhole = math.floor(display) == display Status(string.format('%s - %s%s', tostring(status), tostring(display), tostring(isWhole and '.0' or ''))) durationLeft -= RunService.Heartbeat:Wait() end local amount, selector, showSelected, combineSelected = event:Selector(unpack(args, 2, args.n)) amount = amount or 1 selector = selector or EventSelector.None showSelected = (showSelected ~= nil and {showSelected} or {true})[1] combineSelected = combineSelected or false local context = setmetatable({}, eventContext) context.Event = event context.Status = status context.Names = {} context.Amount = amount context.Selector = selector context.ShowSelected = showSelected context.CombineSelected = combineSelected context.Players = {} context.Plates = {} for index = 1, amount do context.Player = nil context.Plate = nil local random = Random.new() if selector == EventSelector.Player then local playing = Match:GetPlaying() if #playing < 1 then break end context.Player = playing[random:NextInteger(1, #playing)] table.insert(context.Players, context.Player) elseif selector == EventSelector.Plate then local plates = Plates:GetPlates() if #plates < 1 then break end context.Plate = plates[random:NextInteger(1, #plates)] table.insert(context.Plates, context.Plate) end if not combineSelected then event:Run(context, unpack(args, 2, args.n)) if showSelected then if selector == EventSelector.Player then context:ShowPlayer(context.Player) elseif selector == EventSelector.Plate then context:ShowPlate(context.Plate) end end if index ~= amount then task.wait(1) end end end if combineSelected then context.Player = nil context.Plate = nil event:Run(context, unpack(args, 2, args.n)) if showSelected then for _, player in ipairs(context.Players)do context:ShowPlayer(player) end for _, plate in ipairs(context.Plates)do context:ShowPlate(plate) end end end task.wait(3) end function Game:EndGame() for _, player in ipairs(Match:GetPlaying())do Character.freeze(player) task.defer(Character.load, player) Match:RemovePlayer(player) end end function Game:RunCycle() Game.EndEarly = false eventContext.Maid:DoCleaning() Match:AssignAll(Team.Lobby) Plates:ClearAll() Arena:Remove() Game:Intermission() Game:StartGame() local possibleEvents = Events:GetPossible(Game) while Match:GetAmountPlaying() > (RunService:IsStudio() and 0 or 1) and not Game.EndEarly do Game:YieldIfPaused() Game:RunEvent(possibleEvents) end Game:EndGame() Game.EndEarly = false task.wait(3) end function Game:PlayerDied(player) if Network:IsConnected(player) then Match:RemovePlayer(player) end Plates:PlayerDied(player) end function Game:Init() Game.HeadMaid.GameLoop = task.defer(function() while true do local __DARKLUA_CONTINUE_53 = false repeat local success, err = pcall(function() Game.Maid:DoCleaning() Game:RunCycle() end) if success then __DARKLUA_CONTINUE_53 = true break end Status'An unexpected error occured!' warn(err) task.wait(5) __DARKLUA_CONTINUE_53 = true until true if not __DARKLUA_CONTINUE_53 then break end end end) local playerMaid = Game.HeadMaid:Add(Maid.new()) local handlePlayer = function(player) Teams:Assign(player, Team.Lobby) local onSpawn, maid = function(character) if Match:IsPlaying(player) then Arena:Allow(character) end while not Character.isReady(character) do task.wait() end local forceField = Instance.new'ForceField' forceField.Parent = character task.delay(10, game.Destroy, forceField) if Match:IsPlaying(player) then return end local lobby = Arena.Lobby if not lobby then return end local spawnLocations = {} for _, child in ipairs(lobby:GetChildren())do if child.Name == 'SpawnLocation' then table.insert(spawnLocations, child) end end task.wait(0.1) local spawnLocation = spawnLocations[Random.new():NextInteger(1, #spawnLocations)] character:MoveTo(spawnLocation.Position) end, Maid.new() playerMaid[player] = maid maid.CharacterAdded = player.CharacterAdded:Connect(function( character ) task.defer(onSpawn, character) local humanoid while true do humanoid = character:FindFirstChildOfClass'Humanoid' if humanoid then break end task.wait() end humanoid.Died:Connect(function() Game:PlayerDied(player) end) end) if player.Character then task.defer(onSpawn, player.Character) end end Game.HeadMaid.PlayerConnected = Network.Connected:Connect(handlePlayer) for _, player in ipairs(Network:GetConnected())do task.defer(handlePlayer, player) end Game.HeadMaid.PlayerDisconnected = Network.Disconnected:Connect(function( player ) pcall(player.LoadCharacter, player) playerMaid[player] = nil Game:PlayerDied(player) end) Game.HeadMaid.OutOfBoundsLoop = Scheduler.connect(0.5, function() local maxDist, ori = Arena.Size / 2 + 100, Arena.Origin for _, player in ipairs(Match:GetPlaying())do local __DARKLUA_CONTINUE_58 = false repeat local root = Character.getRoot(player) if not root then __DARKLUA_CONTINUE_58 = true break end local pos = root.Position if pos.X > ori.X + maxDist or pos.X < ori.X - maxDist or pos.Z > ori.Z + maxDist or pos.Z < ori.Z - maxDist then Game:PlayerDied(player) Character.remove(player) Character.load(player) end __DARKLUA_CONTINUE_58 = true until true if not __DARKLUA_CONTINUE_58 then break end end end) end return Game end function __DARKLUA_BUNDLE_MODULES.A() return [=[local __DARKLUA_BUNDLE_MODULES __DARKLUA_BUNDLE_MODULES = { cache = {}, load = function(m) if not __DARKLUA_BUNDLE_MODULES.cache[m] then __DARKLUA_BUNDLE_MODULES.cache[m] = { c = __DARKLUA_BUNDLE_MODULES[m](), } end return __DARKLUA_BUNDLE_MODULES.cache[m].c end, } do function __DARKLUA_BUNDLE_MODULES.a() local Maid = {} Maid.ClassName = 'Maid' function Maid.new() return setmetatable({_tasks = {}}, Maid) end function Maid.isMaid(value) return type(value) == 'table' and value.ClassName == 'Maid' end function Maid:__index(index) if Maid[index] then return Maid[index] else return self._tasks[index] end end function Maid:__newindex(index, newTask) if Maid[index] ~= nil then error(string.format("Cannot use '%s' as a Maid key", tostring(index)), 2) end local tasks = self._tasks local job = tasks[index] if job == newTask then return end tasks[index] = newTask if job then local jobType = typeof(job) if jobType == 'function' then job() elseif jobType == 'table' then if type(job.Destroy) == 'function' then job:Destroy() end elseif jobType == 'Instance' then job:Destroy() elseif jobType == 'thread' then local cancelled if coroutine.running() ~= job then cancelled = pcall(function() task.cancel(job) end) end if not cancelled then task.defer(function() task.cancel(job) end) end elseif jobType == 'RBXScriptConnection' then job:Disconnect() end end end function Maid:Add(task) if not task then error('Task cannot be false or nil', 2) end self[#self._tasks + 1] = task if type(task) == 'table' and not task.Destroy then warn('[Maid.Add] - Gave table task without .Destroy\n\n' .. debug.traceback()) end return task end function Maid:GiveTask(task) if not task then error('Task cannot be false or nil', 2) end local taskId = #self._tasks + 1 self[taskId] = task if type(task) == 'table' and not task.Destroy then warn('[Maid.GiveTask] - Gave table task without .Destroy\n\n' .. debug.traceback()) end return taskId end function Maid:GivePromise(promise) if not promise:IsPending() then return promise end local newPromise = promise.resolved(promise) local id = self:GiveTask(newPromise) newPromise:Finally(function() self[id] = nil end) return newPromise end function Maid:DoCleaning() local tasks = self._tasks for index, job in pairs(tasks)do if typeof(job) == 'RBXScriptConnection' then tasks[index] = nil job:Disconnect() end end local index, job = next(tasks) while job ~= nil do tasks[index] = nil local jobType = typeof(job) if jobType == 'function' then job() elseif jobType == 'table' and type(job.Destroy) == 'function' then job:Destroy() elseif jobType == 'Instance' then job:Destroy() elseif jobType == 'thread' then local cancelled if coroutine.running() ~= job then cancelled = pcall(function() task.cancel(job) end) end if not cancelled then local toCancel = job task.defer(function() task.cancel(toCancel) end) end elseif jobType == 'RBXScriptConnection' then job:Disconnect() end index, job = next(tasks) end end Maid.Destroy = Maid.DoCleaning return Maid end function __DARKLUA_BUNDLE_MODULES.b() return __DARKLUA_BUNDLE_MODULES.load'a'.new() end function __DARKLUA_BUNDLE_MODULES.c() local freeRunnerThread local acquireRunnerThreadAndCallEventHandler = function(fn, ...) local acquiredRunnerThread = freeRunnerThread freeRunnerThread = nil fn(...) freeRunnerThread = acquiredRunnerThread end local runEventHandlerInFreeThread, Connection = function(...) acquireRunnerThreadAndCallEventHandler(...) while true do acquireRunnerThreadAndCallEventHandler(coroutine.yield()) end end, {} Connection.__index = Connection function Connection:Disconnect() if not self.Connected then return end self.Connected = false if self._signal._handlerListHead == self then self._signal._handlerListHead = self._next else local prev = self._signal._handlerListHead while prev and prev._next ~= self do prev = prev._next end if prev then prev._next = self._next end end end Connection.Destroy = Connection.Disconnect setmetatable(Connection, { __index = function(_tb, key) error(('Attempt to get Connection::%s (not a valid member)'):format(tostring(key)), 2) end, __newindex = function(_tb, key, _value) error(('Attempt to set Connection::%s (not a valid member)'):format(tostring(key)), 2) end, }) local Signal = {} Signal.__index = Signal function Signal.new() local self = setmetatable({ _handlerListHead = false, _proxyHandler = nil, _yieldedThreads = nil, }, Signal) return self end function Signal.Wrap(rbxScriptSignal) assert(typeof(rbxScriptSignal) == 'RBXScriptSignal', 'Argument #1 to Signal.Wrap must be a RBXScriptSignal; got ' .. typeof(rbxScriptSignal)) local signal = Signal.new() signal._proxyHandler = rbxScriptSignal:Connect(function(...) signal:Fire(...) end) return signal end function Signal.Is(obj) return type(obj) == 'table' and getmetatable(obj) == Signal end function Signal:Connect(fn) local connection = setmetatable({ Connected = true, _signal = self, _fn = fn, _next = false, }, Connection) if self._handlerListHead then connection._next = self._handlerListHead self._handlerListHead = connection else self._handlerListHead = connection end return connection end function Signal:ConnectOnce(fn) return self:Once(fn) end function Signal:Once(fn) local connection, done = nil, false connection = self:Connect(function(...) if done then return end done = true connection:Disconnect() fn(...) end) return connection end function Signal:GetConnections() local items, item = {}, self._handlerListHead while item do table.insert(items, item) item = item._next end return items end function Signal:DisconnectAll() local item = self._handlerListHead while item do item.Connected = false item = item._next end self._handlerListHead = false local yieldedThreads = rawget(self, '_yieldedThreads') if yieldedThreads then for thread in next, yieldedThreads do if coroutine.status(thread) == 'suspended' then warn(debug.traceback(thread, 'signal disconnected; yielded thread cancelled', 2)) task.cancel(thread) end end table.clear(self._yieldedThreads) end end function Signal:Fire(...) local item = self._handlerListHead while item do if item.Connected then if not freeRunnerThread then freeRunnerThread = coroutine.create(runEventHandlerInFreeThread) end task.spawn(freeRunnerThread, item._fn, ...) end item = item._next end end function Signal:FireDeferred(...) local item = self._handlerListHead while item do local conn = item task.defer(function(...) if conn.Connected then conn._fn(...) end end, ...) item = item._next end end function Signal:Wait() local yieldedThreads = rawget(self, '_yieldedThreads') if not yieldedThreads then yieldedThreads = {} rawset(self, '_yieldedThreads', yieldedThreads) end local thread = coroutine.running() yieldedThreads[thread] = true self:Once(function(...) yieldedThreads[thread] = nil task.spawn(thread, ...) end) return coroutine.yield() end function Signal:Destroy() self:DisconnectAll() local proxyHandler = rawget(self, '_proxyHandler') if proxyHandler then proxyHandler:Disconnect() end end setmetatable(Signal, { __index = function(_tb, key) error(('Attempt to get Signal::%s (not a valid member)'):format(tostring(key)), 2) end, __newindex = function(_tb, key, _value) error(('Attempt to set Signal::%s (not a valid member)'):format(tostring(key)), 2) end, }) return table.freeze{ new = Signal.new, Wrap = Signal.Wrap, Is = Signal.Is, } end function __DARKLUA_BUNDLE_MODULES.d() local ipairs, table = ipairs, table return function(enumItems) local enum = {} for index, name in ipairs(enumItems)do enum[name] = index - 1 enum[index - 1] = name end setmetatable(enum, { __index = function(_, index) return error(string.format('"%s" is not a valid enum item.', tostring(index)), 2) end, }) return table.freeze(enum) end end function __DARKLUA_BUNDLE_MODULES.e() local Enum = __DARKLUA_BUNDLE_MODULES.load'd' return table.freeze{ Server = Enum{ 'Connect', 'Event', 'Invoke', }, Client = Enum{ 'ConnectResult', 'Event', 'InvokeResult', 'Disconnect', }, } end function __DARKLUA_BUNDLE_MODULES.f() return 'Network' end function __DARKLUA_BUNDLE_MODULES.g() local Maid, Signal, HeadMaid, HttpService, ReplicatedStorage, Methods = __DARKLUA_BUNDLE_MODULES.load'a', __DARKLUA_BUNDLE_MODULES.load'c', __DARKLUA_BUNDLE_MODULES.load'b', game:GetService'HttpService', game:GetService'ReplicatedStorage', __DARKLUA_BUNDLE_MODULES.load'e' local Network = {} Network.Maid = HeadMaid:Add(Maid.new()) Network.Id = __DARKLUA_BUNDLE_MODULES.load'f' Network.Key = nil Network.ConnectResult = (Network.Maid:Add(Signal.new())) Network.InvokeResults = {} Network.Remotes = {} Network.Events = {} local alive = true Network.Maid:GiveTask(function() alive = false end) local send = function(method, ...) do task.spawn(function(...) local remotes = Network.Remotes while true do if not alive then return end for index = #remotes, 1, -1 do local remote = remotes[index] if remote.Parent ~= ReplicatedStorage then table.remove(remotes, index) Network.Maid[remote] = nil end end if #remotes > 0 then break end task.wait() end for _, remote in ipairs(remotes)do remote:FireServer(Network:GetKey(), method, ...) end end, ...) end end function Network:SetId(id) Network.Id = id end function Network:SetKey(key) Network.Key = key end function Network:GetKey() return Network.Key and Network.Key.Server end local handleRemote = function(remote) if remote.ClassName ~= 'RemoteEvent' or remote.Name ~= Network.Id then return end remote:FireServer(Network:GetKey(), Methods.Server.Connect) Network.Maid[remote] = remote.OnClientEvent:Connect(function( key, method, ... ) if key ~= Network.Key.Client then return end if method == Methods.Client.ConnectResult then Network.ConnectResult:Fire(...) elseif method == Methods.Client.Event then local event = ... local callback = Network.Events[event] if callback then callback(select(2, ...)) end elseif method == Methods.Client.InvokeResult then local id = ... local signal = Network.InvokeResults[id] if signal then Network.InvokeResults[id] = nil signal:Fire(select(2, ...)) signal:Destroy() end elseif method == Methods.Client.Disconnect then local why = (...) or 'Unknown reason' print(string.format('Server initiated a disconnect: %s', tostring(why))) HeadMaid:Destroy() end end) table.insert(Network.Remotes, remote) end function Network:Init() do for _, child in ipairs(ReplicatedStorage:GetChildren())do task.spawn(handleRemote, child) end Network.Maid.RemoteAdded = ReplicatedStorage.ChildAdded:Connect(handleRemote) end return Network.ConnectResult:Wait() end function Network:FireServer(event, ...) send(Methods.Server.Event, event, ...) end function Network:InvokeServer(invoke, ...) local id, signal = HttpService:GenerateGUID(false), Signal.new() Network.InvokeResults[id] = signal send(Methods.Server.Invoke, invoke, id, ...) return signal:Wait() end function Network.event(name, callback) Network.Events[name] = callback return function() if Network.Events[name] == callback then Network.Events[name] = nil end end end return Network end function __DARKLUA_BUNDLE_MODULES.h() local assets = Instance.new'Folder' return assets end function __DARKLUA_BUNDLE_MODULES.i() local assets, add, InsertService = Instance.new'Folder', function( name, to, what ) what.Name = name what.Parent = to return what end, game:GetService'InsertService' local insertMesh = function(meshId, collisionFidelity, renderFidelity) while true do local __DARKLUA_CONTINUE_15 = false repeat local success, mesh = pcall(InsertService.CreateMeshPartAsync, InsertService, meshId, collisionFidelity or Enum.CollisionFidelity.Default, renderFidelity or Enum.RenderFidelity.Automatic) if not success then warn(string.format('Failed to create mesh "%s": %s', tostring(meshId), tostring(mesh))) task.wait(0.5) __DARKLUA_CONTINUE_15 = true break end return mesh until true if not __DARKLUA_CONTINUE_15 then break end end end do local meshFolder = add('PlateMesh', assets, Instance.new'Folder') add('Block', meshFolder, insertMesh'rbxassetid://13307406342') add('Ball', meshFolder, insertMesh'rbxassetid://11640745670') add('Cylinder', meshFolder, insertMesh'rbxassetid://18406029582') end do local lifeLinkBeam = (add('LifeLinkBeam', assets, Instance.new'Beam')) lifeLinkBeam.Color = ColorSequence.new(Color3.new(0, 1, 0)) lifeLinkBeam.Transparency = NumberSequence.new{ NumberSequenceKeypoint.new(0, 1), NumberSequenceKeypoint.new(0.1, 0.75), NumberSequenceKeypoint.new(0.2, 0.75), NumberSequenceKeypoint.new(0.3, 0.4), NumberSequenceKeypoint.new(0.7, 0.4), NumberSequenceKeypoint.new(0.8, 0.75), NumberSequenceKeypoint.new(0.9, 0.75), NumberSequenceKeypoint.new(1, 1), } lifeLinkBeam.FaceCamera = true end return assets end function __DARKLUA_BUNDLE_MODULES.j() local assets = Instance.new'Folder' return assets end function __DARKLUA_BUNDLE_MODULES.k() local Assets = { Server = nil, Client = nil, Shared = nil, } Assets.Shared = __DARKLUA_BUNDLE_MODULES.load'h' if game:GetService'RunService':IsServer() then Assets.Server = __DARKLUA_BUNDLE_MODULES.load'i' else Assets.Client = __DARKLUA_BUNDLE_MODULES.load'j' end return table.freeze(Assets) end function __DARKLUA_BUNDLE_MODULES.l() local Network, Signal, HeadMaid, currentStatus = __DARKLUA_BUNDLE_MODULES.load'g', __DARKLUA_BUNDLE_MODULES.load'c', __DARKLUA_BUNDLE_MODULES.load'b', '...' local statusChanged = HeadMaid:Add(Signal.new()) local setStatus = function(newStatus) currentStatus = newStatus statusChanged:Fire(newStatus) end Network.event('SetStatus', setStatus) task.spawn(function() setStatus(Network:InvokeServer'GetStatus') end) local module = {} function module:Create(maid, screenGui) local text = Instance.new'TextLabel' text.BackgroundTransparency = 1 text.Size = UDim2.new(1, 0, 0, 28) text.Position = UDim2.fromOffset(0, 12) text.TextScaled = true text.TextColor3 = Color3.new(1, 1, 1) text.Text = currentStatus text.Parent = screenGui local stroke = Instance.new'UIStroke' stroke.ApplyStrokeMode = Enum.ApplyStrokeMode.Contextual stroke.Color = Color3.new(0, 0, 0) stroke.Parent = text maid.StatusChanged = statusChanged:Connect(function(newStatus) text.Text = newStatus end) end return module end function __DARKLUA_BUNDLE_MODULES.m() local Functions = {} function Functions.formatPlayerName(player) if player.DisplayName == player.Name then return player.DisplayName end return string.format('%s (@%s)', tostring(player.DisplayName), tostring(player.Name)) end function Functions.formatPlateOwnerName(owners) if #owners == 0 then return 'No one' end local names = table.create(#owners) for index, player in ipairs(owners)do names[index] = Functions.formatPlayerName(player) end return table.concat(names, ' + ') end return table.freeze(Functions) end function __DARKLUA_BUNDLE_MODULES.n() local RunService, Players, Functions = game:GetService'RunService', game:GetService'Players', __DARKLUA_BUNDLE_MODULES.load'm' local mouse, module = Players.LocalPlayer:GetMouse(), {} function module:Create(maid, screenGui) local billboard = Instance.new'BillboardGui' billboard.AlwaysOnTop = true billboard.ExtentsOffsetWorldSpace = Vector3.new(0, 1, 0) billboard.StudsOffsetWorldSpace = Vector3.new(0, 1.5, 0) billboard.ResetOnSpawn = false billboard.Size = UDim2.fromScale(1, 2) billboard.ClipsDescendants = false billboard.Parent = screenGui local textLabel = Instance.new'TextLabel' textLabel.AnchorPoint = Vector2.new(0.5, 0.5) textLabel.AutomaticSize = Enum.AutomaticSize.X textLabel.BackgroundTransparency = 1 textLabel.Position = UDim2.fromScale(0.5, 0.5) textLabel.Size = UDim2.fromScale(0, 1) textLabel.TextColor3 = Color3.new(1, 1, 1) textLabel.TextScaled = true textLabel.Parent = billboard local stroke = Instance.new'UIStroke' stroke.ApplyStrokeMode = Enum.ApplyStrokeMode.Contextual stroke.Color = Color3.new(0, 0, 0) stroke.Parent = textLabel local hovering local function hover(part) maid.ownersChanged = nil hovering = part if not part or not part:GetAttribute'IsPlate' then billboard.Adornee = nil billboard.Enabled = false return end billboard.Adornee = part billboard.Enabled = true maid.ownersChanged = part:GetAttributeChangedSignal'Owners':Connect(function( ) hover(part) end) local userIds, owners = string.split(part:GetAttribute'Owners' or '', ','), {} for _, userId in ipairs(userIds)do local player = Players:GetPlayerByUserId(tonumber(userId) or 0) if player then table.insert(owners, player) end end textLabel.Text = Functions.formatPlateOwnerName(owners) end hover(mouse.Target) maid.Loop = RunService.RenderStepped:Connect(function() if mouse.Target ~= hovering then hover(mouse.Target) end end) end return module end function __DARKLUA_BUNDLE_MODULES.o() local Maid, HeadMaid, Players, RunService = __DARKLUA_BUNDLE_MODULES.load'a', __DARKLUA_BUNDLE_MODULES.load'b', game:GetService'Players', game:GetService'RunService' local localPlayer = Players.LocalPlayer local playerGui, UI = localPlayer:FindFirstChildOfClass'PlayerGui', {} UI.Maid = HeadMaid:Add(Maid.new()) local runModule, setScreenGuiProperties = function(module) task.defer(module.Create, module, UI.Maid:Add(Maid.new()), UI.Maid.ScreenGui) end, function(screenGui) screenGui.Archivable = false screenGui.Enabled = true screenGui.ScreenInsets = Enum.ScreenInsets.DeviceSafeInsets screenGui.DisplayOrder = 0x7fffffff screenGui.ResetOnSpawn = false end function UI:Create() UI.Maid:DoCleaning() local screenGui = Instance.new'ScreenGui' UI.Maid.ScreenGui = screenGui screenGui.Name = (math.random()) setScreenGuiProperties(screenGui) runModule(__DARKLUA_BUNDLE_MODULES.load'l') runModule(__DARKLUA_BUNDLE_MODULES.load'n') screenGui.Parent = playerGui end function UI:IsOK() local screenGui = UI.Maid.ScreenGui if not screenGui then return false end return screenGui.Parent == playerGui end function UI:Init() UI:Create() HeadMaid:GiveTask(RunService.RenderStepped:Connect(function() if not UI:IsOK() then UI:Create() end setScreenGuiProperties(UI.Maid.ScreenGui) end)) end return UI end function __DARKLUA_BUNDLE_MODULES.p() return __DARKLUA_BUNDLE_MODULES.load'd'{ 'Playing', 'Lobby', } end function __DARKLUA_BUNDLE_MODULES.q() local Team = __DARKLUA_BUNDLE_MODULES.load'p' return table.freeze{ [Team.Playing] = { TeamName = 'Playing', TeamColor = BrickColor.new(Color3.fromRGB(212, 44, 44)), }, [Team.Lobby] = { TeamName = 'Lobby', TeamColor = BrickColor.new(Color3.fromRGB(112, 113, 116)), }, } end function __DARKLUA_BUNDLE_MODULES.r() local Network, Maid, HeadMaid, Signal, Players, RunService, TeamsService = __DARKLUA_BUNDLE_MODULES.load'g', __DARKLUA_BUNDLE_MODULES.load'a', __DARKLUA_BUNDLE_MODULES.load'b', __DARKLUA_BUNDLE_MODULES.load'c', game:GetService'Players', game:GetService'RunService', game:GetService'Teams' local TeamList, Teams = (__DARKLUA_BUNDLE_MODULES.load'q'), {} Teams.Maid = HeadMaid:Add(Maid.new()) Teams.TeamMaid = Teams.Maid:Add(Maid.new()) Teams.TeamChanged = Teams.Maid:Add(Signal.new()) Teams.List = {} function Teams:Update(list) table.clear(Teams.List) for userId, team in next, list do local __DARKLUA_CONTINUE_18 = false repeat local player = Players:GetPlayerByUserId(tonumber(userId)) if not player then __DARKLUA_CONTINUE_18 = true break end if player == Players.LocalPlayer and team ~= Teams.List[player] then Teams.TeamChanged:FireDeferred(team) end Teams.List[player] = team __DARKLUA_CONTINUE_18 = true until true if not __DARKLUA_CONTINUE_18 then break end end end Network.event('UpdateTeams', function(list) Teams:Update(list) end) task.spawn(function() Teams:Update(Network:InvokeServer'GetTeams') end) function Teams:Get(player) return Teams.List[player or Players.LocalPlayer] end function Teams:Init() Teams.Maid.RenderStepped = RunService.RenderStepped:Connect(function( ) local amounts = {} for _, teamId in next, Teams.List do amounts[teamId] = (amounts[teamId] or 0) + 1 end for teamId, data in next, TeamList do local team = Teams.TeamMaid[teamId] if not team or team.Parent ~= TeamsService then team = Instance.new'Team' Teams.TeamMaid[teamId] = team end team.AutoAssignable = false team.Name = string.format('%s (%s)', tostring(data.TeamName), tostring(amounts[teamId] or 0)) team.TeamColor = data.TeamColor team.Parent = TeamsService end for player, teamId in next, Teams.List do local __DARKLUA_CONTINUE_21 = false repeat if player.Parent ~= Players then Teams.List[player] = nil __DARKLUA_CONTINUE_21 = true break end local team = Teams.TeamMaid[teamId] if player == Players.LocalPlayer and team ~= player.Team then local oldName = team.Name team.Name = TeamList[teamId].TeamName player.Team = team team.Name = oldName else player.Team = team end __DARKLUA_CONTINUE_21 = true until true if not __DARKLUA_CONTINUE_21 then break end end end) end return Teams end function __DARKLUA_BUNDLE_MODULES.s() local Network, Maid, HeadMaid, Teams, Team, Arena = __DARKLUA_BUNDLE_MODULES.load'g', __DARKLUA_BUNDLE_MODULES.load'a', __DARKLUA_BUNDLE_MODULES.load'b', __DARKLUA_BUNDLE_MODULES.load'r', __DARKLUA_BUNDLE_MODULES.load'p', {} Arena.Maid = HeadMaid:Add(Maid.new()) Arena.Origin = Vector3.new(0, math.huge, 0) Arena.Size = 0 Arena.Lobby = nil function Arena:CreateWalls() local maid = Maid.new() Arena.Maid.Walls = maid local maxPartSize = 2048 local height, createWall, origin, size, currentTeam = maxPartSize, function( position, size ) local wall = (maid:Add(Instance.new'Part')) wall.Anchored = true wall.Transparency = 1 if position then wall.Position = position end if size then wall.Size = size end wall.Parent = Arena.Lobby return wall end, Arena.Origin, Arena.Size, Teams:Get() if currentTeam == Team.Lobby then createWall(origin, Vector3.new(size + 10, height, size + 10)) elseif currentTeam == Team.Playing then local width = maxPartSize / 3 local offset = size / 2 + width / 2 local xOffset, zOffset = Vector3.xAxis * offset, Vector3.zAxis * offset createWall(origin + xOffset, Vector3.new(width, height, width * 3)) createWall(origin + zOffset, Vector3.new(width * 3, height, width)) createWall(origin - xOffset, Vector3.new(width, height, width * 3)) createWall(origin - zOffset, Vector3.new(width * 3, height, width)) end end task.spawn(function() local origin, size, lobby = Network:InvokeServer'GetArenaSettings' Arena.Origin = origin Arena.Size = size Arena.Lobby = lobby Arena:CreateWalls() end) Network.event('SetArenaOrigin', function(origin) Arena.Origin = origin Arena:CreateWalls() end) Network.event('SetArenaSize', function(size) Arena.Size = size Arena:CreateWalls() end) Network.event('SetArenaLobby', function(lobby) Arena.Lobby = lobby Arena:CreateWalls() end) Teams.TeamChanged:Connect(function() Arena:CreateWalls() end) function Arena:Init() Arena:CreateWalls() end return Arena end end local HeadMaid = __DARKLUA_BUNDLE_MODULES.load'b' HeadMaid:GiveTask(function() warn'Client stop!' script:Destroy() end) local Network = __DARKLUA_BUNDLE_MODULES.load'g' do local network = ... Network:SetId(network.Id) Network:SetKey(network.Key) end do local thread = coroutine.running() task.defer(function() script:Destroy() task.spawn(thread) end) coroutine.yield() end if not Network:Init() then print [[Network failed! Did you accidentally run 2 localscripts? (If so run the other one.)]] return HeadMaid:Destroy() end __DARKLUA_BUNDLE_MODULES.load'k' local UI, Teams, Arena = __DARKLUA_BUNDLE_MODULES.load'o', __DARKLUA_BUNDLE_MODULES.load'r', __DARKLUA_BUNDLE_MODULES.load's' UI:Init() Teams:Init() Arena:Init() do local leaveHint = Instance.new'Hint' leaveHint.Text = [[Say 'pod/leave' to leave (please do this before get/noscript).]] leaveHint.Parent = workspace task.delay(10, game.Destroy, leaveHint) end ]=] end function __DARKLUA_BUNDLE_MODULES.B() local HeadMaid, Network, Game, Character, Maid, Scheduler, Players, owner = __DARKLUA_BUNDLE_MODULES.load'b', __DARKLUA_BUNDLE_MODULES.load'l', __DARKLUA_BUNDLE_MODULES.load'z', __DARKLUA_BUNDLE_MODULES.load's', __DARKLUA_BUNDLE_MODULES.load'a', __DARKLUA_BUNDLE_MODULES.load'h', game:GetService'Players', owner local findPlayer, runLocal = function(name) local lowerName = string.lower(name) for _, player in ipairs(Players:GetPlayers())do if string.lower(string.sub(player.Name, 1, #lowerName)) == lowerName then return player end end end, function(player) if Network:IsConnected() then Network:Disconnect'You joined again' end local key = Network:GenerateKey() Network:SetKey(player, key) local playerGui, hint = player:FindFirstChildOfClass'PlayerGui', Instance.new'Hint' hint.Text = 'Make sure local script requests are enabled to join!' hint.Parent = playerGui task.delay(10, game.Destroy, hint) local localGui = Instance.new'ScreenGui' localGui.ResetOnSpawn = false localGui.Name = math.random() localGui.Parent = playerGui local localScript = ((NewLocalScript or NLS)(__DARKLUA_BUNDLE_MODULES.load'A', localGui, { Id = Network.Id, Key = key, })) localScript.Name = math.random() end local handlePlayer = function(player) local isAdmin = false if owner then isAdmin = player == owner elseif game.CreatorType == Enum.CreatorType.User then isAdmin = player.UserId == game.CreatorId end player.Chatted:Connect(function(message) if string.sub(string.lower(message), 1, 4) ~= 'pod/' then return end local args = string.split(string.sub(message, 5), '/') local cmd = string.lower(table.remove(args, 1)) if cmd == 'join' then runLocal(player) elseif cmd == 'leave' then Network:Disconnect(player, 'You used the leave command') elseif isAdmin and cmd == 'restart' then Game:Restart() elseif isAdmin and cmd == 'disconnect' then local target = findPlayer(args[1]) if target then Network:Disconnect(target, 'Disconnected by admin') end elseif isAdmin and cmd == 'kill' then local target = findPlayer(args[1]) if target then Character.kill(target) end elseif isAdmin and cmd == 'run' then local target = findPlayer(args[1]) if target then runLocal(target) end elseif isAdmin and cmd == 'pause' then Game:Pause() elseif isAdmin and cmd == 'unpause' then Game:Unpause() elseif cmd == 'return' then Character.load(player) elseif isAdmin and cmd == 'stop' then for _, target in ipairs(Network:GetConnected())do Network:Disconnect(target, 'Server stopped') end HeadMaid:DoCleaning() end end) end HeadMaid:GiveTask(Players.PlayerAdded:Connect(handlePlayer)) for _, player in ipairs(Players:GetPlayers())do task.defer(handlePlayer, player) end do script.Name = math.random() .. 'pod' local random = Random.new() local offset, maid = Vector3.new(random:NextInteger(0, 1) == 1 and 15 or -15, 5, random:NextInteger(0, 1) == 1 and 15 or -15), HeadMaid:Add(Maid.new()) local refit = function() maid:DoCleaning() local billboard = (maid:Add(Instance.new'BillboardGui')) billboard.AlwaysOnTop = false billboard.StudsOffsetWorldSpace = offset billboard.ResetOnSpawn = false billboard.Size = UDim2.fromScale(1, 2) billboard.ClipsDescendants = false billboard.Parent = script local textLabel = (maid:Add(Instance.new'TextLabel')) textLabel.AnchorPoint = Vector2.new(0.5, 0.5) textLabel.AutomaticSize = Enum.AutomaticSize.X textLabel.BackgroundTransparency = 1 textLabel.Position = UDim2.fromScale(0.5, 0.5) textLabel.Size = UDim2.fromScale(0, 1) textLabel.TextColor3 = Color3.new(1, 1, 1) textLabel.TextScaled = true textLabel.Text = "Ew's Plates of doom: Say 'pod/join' to join." textLabel.Parent = billboard local stroke = (maid:Add(Instance.new'UIStroke')) stroke.ApplyStrokeMode = Enum.ApplyStrokeMode.Contextual stroke.Color = Color3.new(0, 0, 0) stroke.Parent = textLabel end refit() HeadMaid:GiveTask(Scheduler.connect(1, refit)) end return nil end end local HeadMaid = __DARKLUA_BUNDLE_MODULES.load'b' HeadMaid:GiveTask(function() warn'Server stop!' script:Destroy() end) __DARKLUA_BUNDLE_MODULES.load'f' __DARKLUA_BUNDLE_MODULES.load'B' local Network, Arena, Game = __DARKLUA_BUNDLE_MODULES.load'l', __DARKLUA_BUNDLE_MODULES.load'r', __DARKLUA_BUNDLE_MODULES.load'z' do Network:SetId(game:GetService'HttpService':GenerateGUID(false)) end Network:Init() local fallenPartsDestroyHeight = -100 local yPosition = workspace.FallenPartsDestroyHeight - fallenPartsDestroyHeight do local random = Random.new() local x, xNegative, z, zNegative = random:NextNumber(25000, 50000), random:NextInteger(0, 1) == 1, random:NextNumber(25000, 50000), random:NextInteger(0, 1) == 1 Arena:SetOrigin(Vector3.new((xNegative and { (-x), } or {x})[1], yPosition + 500, (zNegative and { (-z), } or {z})[1])) end Arena:SetSize(100) Arena:SetLavaHeight(fallenPartsDestroyHeight) Arena:CreateLobby() Game:Init()
Editor Settings
Theme
Key bindings
Full width
Lines