--!strict --!optimize 2 --!native local Players = game:GetService("Players") local RunService = game:GetService("RunService") local RunContext = RunService:IsServer() and "Server" or "Client" local Registry = require("../Modules/Registry") local Enums = require("../Enums") local Types = require("../Types") local Processor = RunService:IsServer() and require("../Process/Server") or require("../Process/Client") :: Types.ClientProcesser | Types.ServerProcesser local Function = { __index = function(self: Types.Function, index) if RunContext == "Server" then if index == "Invoke" then error("can not use Invoke on server") end elseif RunContext == "Client" then if index == "InvokeTo" then error("can not use InvokeTo on client") end end return ({ Invoke = function(data: any) return Processor.Invoke(self, data) end, InvokeTo = function(user: Player, data: any) return Processor.InvokeTo(self, user, data) end, Listen = function(listener) self._listener = listener end, })[index] end, } local PacketID = 0 return function(request: Types.DataTypeInterface, response: Types.DataTypeInterface) local self = setmetatable({ _request = request, _response = response, _listener = nil, _packetid = PacketID, _method = "Function" }, Function) :: Types.Function Registry.set("Function", PacketID, self) PacketID+=1 return self end