2024-08-07 16:45:56 +00:00
|
|
|
--!strict
|
|
|
|
--!native
|
|
|
|
--!optimize 2
|
|
|
|
--!nolint LocalShadow
|
|
|
|
--#selene: allow(shadowing)
|
|
|
|
-- File generated by Blink v0.14.1 (https://github.com/1Axen/Blink)
|
|
|
|
-- This file is not meant to be edited
|
|
|
|
|
|
|
|
local Players = game:GetService("Players")
|
|
|
|
local ReplicatedStorage = game:GetService("ReplicatedStorage")
|
|
|
|
local RunService = game:GetService("RunService")
|
|
|
|
|
|
|
|
if not RunService:IsServer() then
|
2024-10-12 20:18:11 +00:00
|
|
|
error("Server network module can only be required from the server.")
|
2024-08-07 16:45:56 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
local Reliable: RemoteEvent = ReplicatedStorage:FindFirstChild("BLINK_RELIABLE_REMOTE") :: RemoteEvent
|
|
|
|
if not Reliable then
|
2024-10-12 20:18:11 +00:00
|
|
|
local RemoteEvent = Instance.new("RemoteEvent")
|
|
|
|
RemoteEvent.Name = "BLINK_RELIABLE_REMOTE"
|
|
|
|
RemoteEvent.Parent = ReplicatedStorage
|
|
|
|
Reliable = RemoteEvent
|
2024-08-07 16:45:56 +00:00
|
|
|
end
|
|
|
|
|
2024-10-12 20:18:11 +00:00
|
|
|
local Unreliable: UnreliableRemoteEvent =
|
|
|
|
ReplicatedStorage:FindFirstChild("BLINK_UNRELIABLE_REMOTE") :: UnreliableRemoteEvent
|
2024-08-07 16:45:56 +00:00
|
|
|
if not Unreliable then
|
2024-10-12 20:18:11 +00:00
|
|
|
local UnreliableRemoteEvent = Instance.new("UnreliableRemoteEvent")
|
|
|
|
UnreliableRemoteEvent.Name = "BLINK_UNRELIABLE_REMOTE"
|
|
|
|
UnreliableRemoteEvent.Parent = ReplicatedStorage
|
|
|
|
Unreliable = UnreliableRemoteEvent
|
2024-08-07 16:45:56 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
local Invocations = 0
|
|
|
|
|
|
|
|
local SendSize = 64
|
|
|
|
local SendOffset = 0
|
|
|
|
local SendCursor = 0
|
|
|
|
local SendBuffer = buffer.create(64)
|
|
|
|
local SendInstances = {}
|
|
|
|
|
|
|
|
local RecieveCursor = 0
|
|
|
|
local RecieveBuffer = buffer.create(64)
|
|
|
|
|
|
|
|
local RecieveInstances = {}
|
|
|
|
local RecieveInstanceCursor = 0
|
|
|
|
|
|
|
|
type Entry = {
|
2024-10-12 20:18:11 +00:00
|
|
|
value: any,
|
|
|
|
next: Entry?,
|
2024-08-07 16:45:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
type Queue = {
|
2024-10-12 20:18:11 +00:00
|
|
|
head: Entry?,
|
|
|
|
tail: Entry?,
|
2024-08-07 16:45:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
type BufferSave = {
|
2024-10-12 20:18:11 +00:00
|
|
|
Size: number,
|
|
|
|
Cursor: number,
|
|
|
|
Buffer: buffer,
|
|
|
|
Instances: { Instance },
|
2024-08-07 16:45:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
local function Read(Bytes: number)
|
2024-10-12 20:18:11 +00:00
|
|
|
local Offset = RecieveCursor
|
|
|
|
RecieveCursor += Bytes
|
|
|
|
return Offset
|
2024-08-07 16:45:56 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
local function Save(): BufferSave
|
2024-10-12 20:18:11 +00:00
|
|
|
return {
|
|
|
|
Size = SendSize,
|
|
|
|
Cursor = SendCursor,
|
|
|
|
Buffer = SendBuffer,
|
|
|
|
Instances = SendInstances,
|
|
|
|
}
|
2024-08-07 16:45:56 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
local function Load(Save: BufferSave?)
|
2024-10-12 20:18:11 +00:00
|
|
|
if Save then
|
|
|
|
SendSize = Save.Size
|
|
|
|
SendCursor = Save.Cursor
|
|
|
|
SendOffset = Save.Cursor
|
|
|
|
SendBuffer = Save.Buffer
|
|
|
|
SendInstances = Save.Instances
|
|
|
|
return
|
|
|
|
end
|
|
|
|
|
|
|
|
SendSize = 64
|
|
|
|
SendCursor = 0
|
|
|
|
SendOffset = 0
|
|
|
|
SendBuffer = buffer.create(64)
|
|
|
|
SendInstances = {}
|
2024-08-07 16:45:56 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
local function Invoke()
|
2024-10-12 20:18:11 +00:00
|
|
|
if Invocations == 255 then
|
|
|
|
Invocations = 0
|
|
|
|
end
|
2024-08-07 16:45:56 +00:00
|
|
|
|
2024-10-12 20:18:11 +00:00
|
|
|
local Invocation = Invocations
|
|
|
|
Invocations += 1
|
|
|
|
return Invocation
|
2024-08-07 16:45:56 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
local function Allocate(Bytes: number)
|
2024-10-12 20:18:11 +00:00
|
|
|
local InUse = (SendCursor + Bytes)
|
|
|
|
if InUse > SendSize then
|
|
|
|
--> Avoid resizing the buffer for every write
|
|
|
|
while InUse > SendSize do
|
|
|
|
SendSize *= 1.5
|
|
|
|
end
|
|
|
|
|
|
|
|
local Buffer = buffer.create(SendSize)
|
|
|
|
buffer.copy(Buffer, 0, SendBuffer, 0, SendCursor)
|
|
|
|
SendBuffer = Buffer
|
|
|
|
end
|
|
|
|
|
|
|
|
SendOffset = SendCursor
|
|
|
|
SendCursor += Bytes
|
|
|
|
|
|
|
|
return SendOffset
|
2024-08-07 16:45:56 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
local function CreateQueue(): Queue
|
2024-10-12 20:18:11 +00:00
|
|
|
return {
|
|
|
|
head = nil,
|
|
|
|
tail = nil,
|
|
|
|
}
|
2024-08-07 16:45:56 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
local function Pop(queue: Queue): any
|
2024-10-12 20:18:11 +00:00
|
|
|
local head = queue.head
|
|
|
|
if head == nil then
|
|
|
|
return
|
|
|
|
end
|
2024-08-07 16:45:56 +00:00
|
|
|
|
2024-10-12 20:18:11 +00:00
|
|
|
queue.head = head.next
|
|
|
|
return head.value
|
2024-08-07 16:45:56 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
local function Push(queue: Queue, value: any)
|
2024-10-12 20:18:11 +00:00
|
|
|
local entry: Entry = {
|
|
|
|
value = value,
|
|
|
|
next = nil,
|
|
|
|
}
|
2024-08-07 16:45:56 +00:00
|
|
|
|
2024-10-12 20:18:11 +00:00
|
|
|
if queue.tail ~= nil then
|
|
|
|
queue.tail.next = entry
|
|
|
|
end
|
2024-08-07 16:45:56 +00:00
|
|
|
|
2024-10-12 20:18:11 +00:00
|
|
|
queue.tail = entry
|
2024-08-07 16:45:56 +00:00
|
|
|
|
2024-10-12 20:18:11 +00:00
|
|
|
if queue.head == nil then
|
|
|
|
queue.head = entry
|
|
|
|
end
|
2024-08-07 16:45:56 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
local Types = {}
|
|
|
|
local Calls = table.create(256)
|
|
|
|
|
|
|
|
local Events: any = {
|
2024-10-12 20:18:11 +00:00
|
|
|
Reliable = table.create(256),
|
|
|
|
Unreliable = table.create(256),
|
2024-08-07 16:45:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
local Queue: any = {
|
2024-10-12 20:18:11 +00:00
|
|
|
Reliable = table.create(256),
|
|
|
|
Unreliable = table.create(256),
|
2024-08-07 16:45:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function Types.ReadEVENT_UpdateTransform(): (number, CFrame)
|
|
|
|
-- Read BLOCK: 32 bytes
|
|
|
|
local BLOCK_START = Read(32)
|
|
|
|
local Value1 = buffer.readf64(RecieveBuffer, BLOCK_START + 0)
|
|
|
|
local X = buffer.readf32(RecieveBuffer, BLOCK_START + 8)
|
|
|
|
local Y = buffer.readf32(RecieveBuffer, BLOCK_START + 12)
|
|
|
|
local Z = buffer.readf32(RecieveBuffer, BLOCK_START + 16)
|
|
|
|
local Position = Vector3.new(X, Y, Z)
|
|
|
|
local rX = buffer.readf32(RecieveBuffer, BLOCK_START + 20)
|
|
|
|
local rY = buffer.readf32(RecieveBuffer, BLOCK_START + 24)
|
|
|
|
local rZ = buffer.readf32(RecieveBuffer, BLOCK_START + 28)
|
|
|
|
local Value2 = CFrame.new(Position) * CFrame.fromOrientation(rX, rY, rZ)
|
|
|
|
return Value1, Value2
|
|
|
|
end
|
|
|
|
|
|
|
|
function Types.WriteEVENT_UpdateTransform(Value1: number, Value2: CFrame): ()
|
|
|
|
-- Allocate BLOCK: 33 bytes
|
|
|
|
local BLOCK_START = Allocate(33)
|
|
|
|
buffer.writeu8(SendBuffer, BLOCK_START + 0, 0)
|
|
|
|
buffer.writef64(SendBuffer, BLOCK_START + 1, Value1)
|
|
|
|
local Vector = Value2.Position
|
|
|
|
buffer.writef32(SendBuffer, BLOCK_START + 9, Vector.X)
|
|
|
|
buffer.writef32(SendBuffer, BLOCK_START + 13, Vector.Y)
|
|
|
|
buffer.writef32(SendBuffer, BLOCK_START + 17, Vector.Z)
|
|
|
|
local rX, rY, rZ = Value2:ToOrientation()
|
|
|
|
buffer.writef32(SendBuffer, BLOCK_START + 21, rX)
|
|
|
|
buffer.writef32(SendBuffer, BLOCK_START + 25, rY)
|
|
|
|
buffer.writef32(SendBuffer, BLOCK_START + 29, rZ)
|
|
|
|
end
|
|
|
|
|
|
|
|
function Types.ReadEVENT_SpawnMob(): (number, CFrame, number)
|
|
|
|
-- Read BLOCK: 33 bytes
|
|
|
|
local BLOCK_START = Read(33)
|
|
|
|
local Value1 = buffer.readf64(RecieveBuffer, BLOCK_START + 0)
|
|
|
|
local X = buffer.readf32(RecieveBuffer, BLOCK_START + 8)
|
|
|
|
local Y = buffer.readf32(RecieveBuffer, BLOCK_START + 12)
|
|
|
|
local Z = buffer.readf32(RecieveBuffer, BLOCK_START + 16)
|
|
|
|
local Position = Vector3.new(X, Y, Z)
|
|
|
|
local rX = buffer.readf32(RecieveBuffer, BLOCK_START + 20)
|
|
|
|
local rY = buffer.readf32(RecieveBuffer, BLOCK_START + 24)
|
|
|
|
local rZ = buffer.readf32(RecieveBuffer, BLOCK_START + 28)
|
|
|
|
local Value2 = CFrame.new(Position) * CFrame.fromOrientation(rX, rY, rZ)
|
|
|
|
local Value3 = buffer.readu8(RecieveBuffer, BLOCK_START + 32)
|
|
|
|
return Value1, Value2, Value3
|
|
|
|
end
|
|
|
|
|
|
|
|
function Types.WriteEVENT_SpawnMob(Value1: number, Value2: CFrame, Value3: number): ()
|
|
|
|
-- Allocate BLOCK: 34 bytes
|
|
|
|
local BLOCK_START = Allocate(34)
|
|
|
|
buffer.writeu8(SendBuffer, BLOCK_START + 0, 0)
|
|
|
|
buffer.writef64(SendBuffer, BLOCK_START + 1, Value1)
|
|
|
|
local Vector = Value2.Position
|
|
|
|
buffer.writef32(SendBuffer, BLOCK_START + 9, Vector.X)
|
|
|
|
buffer.writef32(SendBuffer, BLOCK_START + 13, Vector.Y)
|
|
|
|
buffer.writef32(SendBuffer, BLOCK_START + 17, Vector.Z)
|
|
|
|
local rX, rY, rZ = Value2:ToOrientation()
|
|
|
|
buffer.writef32(SendBuffer, BLOCK_START + 21, rX)
|
|
|
|
buffer.writef32(SendBuffer, BLOCK_START + 25, rY)
|
|
|
|
buffer.writef32(SendBuffer, BLOCK_START + 29, rZ)
|
|
|
|
buffer.writeu8(SendBuffer, BLOCK_START + 33, Value3)
|
|
|
|
end
|
|
|
|
|
2024-10-12 20:18:11 +00:00
|
|
|
local PlayersMap: { [Player]: BufferSave } = {}
|
2024-08-07 16:45:56 +00:00
|
|
|
|
|
|
|
Players.PlayerRemoving:Connect(function(Player)
|
2024-10-12 20:18:11 +00:00
|
|
|
PlayersMap[Player] = nil
|
2024-08-07 16:45:56 +00:00
|
|
|
end)
|
|
|
|
|
|
|
|
local function StepReplication()
|
2024-10-12 20:18:11 +00:00
|
|
|
for Player, Send in PlayersMap do
|
|
|
|
if Send.Cursor <= 0 then
|
|
|
|
continue
|
|
|
|
end
|
|
|
|
|
|
|
|
local Buffer = buffer.create(Send.Cursor)
|
|
|
|
buffer.copy(Buffer, 0, Send.Buffer, 0, Send.Cursor)
|
|
|
|
Reliable:FireClient(Player, Buffer, Send.Instances)
|
|
|
|
|
|
|
|
Send.Size = 64
|
|
|
|
Send.Cursor = 0
|
|
|
|
Send.Buffer = buffer.create(64)
|
|
|
|
table.clear(Send.Instances)
|
|
|
|
end
|
2024-08-07 16:45:56 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
RunService.Heartbeat:Connect(StepReplication)
|
|
|
|
|
2024-10-12 20:18:11 +00:00
|
|
|
Reliable.OnServerEvent:Connect(function(Player: Player, Buffer: buffer, Instances: { Instance })
|
2024-08-07 16:45:56 +00:00
|
|
|
RecieveCursor = 0
|
|
|
|
RecieveBuffer = Buffer
|
|
|
|
RecieveInstances = Instances
|
|
|
|
RecieveInstanceCursor = 0
|
|
|
|
local Size = buffer.len(RecieveBuffer)
|
2024-10-12 20:18:11 +00:00
|
|
|
while RecieveCursor < Size do
|
2024-08-07 16:45:56 +00:00
|
|
|
-- Read BLOCK: 1 bytes
|
|
|
|
local BLOCK_START = Read(1)
|
|
|
|
local Index = buffer.readu8(RecieveBuffer, BLOCK_START + 0)
|
|
|
|
end
|
|
|
|
end)
|
|
|
|
|
2024-10-12 20:18:11 +00:00
|
|
|
Unreliable.OnServerEvent:Connect(function(Player: Player, Buffer: buffer, Instances: { Instance })
|
2024-08-07 16:45:56 +00:00
|
|
|
RecieveCursor = 0
|
|
|
|
RecieveBuffer = Buffer
|
|
|
|
RecieveInstances = Instances
|
|
|
|
RecieveInstanceCursor = 0
|
|
|
|
local Size = buffer.len(RecieveBuffer)
|
2024-10-12 20:18:11 +00:00
|
|
|
while RecieveCursor < Size do
|
2024-08-07 16:45:56 +00:00
|
|
|
-- Read BLOCK: 1 bytes
|
|
|
|
local BLOCK_START = Read(1)
|
|
|
|
local Index = buffer.readu8(RecieveBuffer, BLOCK_START + 0)
|
|
|
|
end
|
|
|
|
end)
|
|
|
|
|
|
|
|
return {
|
|
|
|
StepReplication = StepReplication,
|
|
|
|
|
|
|
|
UpdateTransform = {
|
|
|
|
Fire = function(Player: Player, Value1: number, Value2: CFrame): ()
|
|
|
|
Load()
|
|
|
|
Types.WriteEVENT_UpdateTransform(Value1, Value2)
|
|
|
|
local Buffer = buffer.create(SendCursor)
|
|
|
|
buffer.copy(Buffer, 0, SendBuffer, 0, SendCursor)
|
|
|
|
Unreliable:FireClient(Player, Buffer, SendInstances)
|
|
|
|
end,
|
|
|
|
FireAll = function(Value1: number, Value2: CFrame): ()
|
|
|
|
Load()
|
|
|
|
Types.WriteEVENT_UpdateTransform(Value1, Value2)
|
|
|
|
local Buffer = buffer.create(SendCursor)
|
|
|
|
buffer.copy(Buffer, 0, SendBuffer, 0, SendCursor)
|
|
|
|
Unreliable:FireAllClients(Buffer, SendInstances)
|
|
|
|
end,
|
2024-10-12 20:18:11 +00:00
|
|
|
FireList = function(List: { Player }, Value1: number, Value2: CFrame): ()
|
2024-08-07 16:45:56 +00:00
|
|
|
Load()
|
|
|
|
Types.WriteEVENT_UpdateTransform(Value1, Value2)
|
|
|
|
local Buffer = buffer.create(SendCursor)
|
|
|
|
buffer.copy(Buffer, 0, SendBuffer, 0, SendCursor)
|
|
|
|
for _, Player in List do
|
|
|
|
Unreliable:FireClient(Player, Buffer, SendInstances)
|
|
|
|
end
|
|
|
|
end,
|
|
|
|
FireExcept = function(Except: Player, Value1: number, Value2: CFrame): ()
|
|
|
|
Load()
|
|
|
|
Types.WriteEVENT_UpdateTransform(Value1, Value2)
|
|
|
|
local Buffer = buffer.create(SendCursor)
|
|
|
|
buffer.copy(Buffer, 0, SendBuffer, 0, SendCursor)
|
|
|
|
for _, Player in Players:GetPlayers() do
|
|
|
|
if Player == Except then
|
|
|
|
continue
|
|
|
|
end
|
|
|
|
Unreliable:FireClient(Player, Buffer, SendInstances)
|
|
|
|
end
|
|
|
|
end,
|
|
|
|
},
|
|
|
|
SpawnMob = {
|
|
|
|
Fire = function(Player: Player, Value1: number, Value2: CFrame, Value3: number): ()
|
|
|
|
Load(PlayersMap[Player])
|
|
|
|
Types.WriteEVENT_SpawnMob(Value1, Value2, Value3)
|
|
|
|
PlayersMap[Player] = Save()
|
|
|
|
end,
|
|
|
|
FireAll = function(Value1: number, Value2: CFrame, Value3: number): ()
|
|
|
|
Load()
|
|
|
|
Types.WriteEVENT_SpawnMob(Value1, Value2, Value3)
|
|
|
|
local Buffer, Size, Instances = SendBuffer, SendCursor, SendInstances
|
|
|
|
for _, Player in Players:GetPlayers() do
|
|
|
|
Load(PlayersMap[Player])
|
|
|
|
local Position = Allocate(Size)
|
|
|
|
buffer.copy(SendBuffer, Position, Buffer, 0, Size)
|
|
|
|
table.move(Instances, 1, #Instances, #SendInstances + 1, SendInstances)
|
|
|
|
PlayersMap[Player] = Save()
|
|
|
|
end
|
|
|
|
end,
|
2024-10-12 20:18:11 +00:00
|
|
|
FireList = function(List: { Player }, Value1: number, Value2: CFrame, Value3: number): ()
|
2024-08-07 16:45:56 +00:00
|
|
|
Load()
|
|
|
|
Types.WriteEVENT_SpawnMob(Value1, Value2, Value3)
|
|
|
|
local Buffer, Size, Instances = SendBuffer, SendCursor, SendInstances
|
|
|
|
for _, Player in List do
|
|
|
|
Load(PlayersMap[Player])
|
|
|
|
local Position = Allocate(Size)
|
|
|
|
buffer.copy(SendBuffer, Position, Buffer, 0, Size)
|
|
|
|
table.move(Instances, 1, #Instances, #SendInstances + 1, SendInstances)
|
|
|
|
PlayersMap[Player] = Save()
|
|
|
|
end
|
|
|
|
end,
|
|
|
|
FireExcept = function(Except: Player, Value1: number, Value2: CFrame, Value3: number): ()
|
|
|
|
Load()
|
|
|
|
Types.WriteEVENT_SpawnMob(Value1, Value2, Value3)
|
|
|
|
local Buffer, Size, Instances = SendBuffer, SendCursor, SendInstances
|
|
|
|
for _, Player in Players:GetPlayers() do
|
|
|
|
if Player == Except then
|
|
|
|
continue
|
|
|
|
end
|
|
|
|
Load(PlayersMap[Player])
|
|
|
|
local Position = Allocate(Size)
|
|
|
|
buffer.copy(SendBuffer, Position, Buffer, 0, Size)
|
|
|
|
table.move(Instances, 1, #Instances, #SendInstances + 1, SendInstances)
|
|
|
|
PlayersMap[Player] = Save()
|
|
|
|
end
|
|
|
|
end,
|
|
|
|
},
|
2024-10-12 20:18:11 +00:00
|
|
|
}
|