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()