--!strict --!optimize 2 --!native local Players = game:GetService("Players") local RunService = game:GetService("RunService") local RunContext = RunService:IsClient() and "Client" or "Server" local Registry = require("../Modules/Registry") local Enums = require("../Enums") local Types = require("../Types") local Processor = RunContext == "Server" and require("../Process/Server") or require("../Process/Client") local Event = { __index = function(self: Types.Event, index) if RunContext == "Server" then if index == "Send" then error("can not use Send on server") end elseif RunContext == "Client" then if index == "SendTo" or index == "SendToAll" or index == "SendToAllExcept" then error("can not use SendTo, SendToAll, SendToAllExcept on client") end end return ({ Send = function(data: any) Processor.Send(self, data) end, SendTo = function(user: Player, data: any) Processor.SendTo(self, user, data) end, SendToAll = function(data: any) for _, user in Players:GetPlayers() do Processor.SendTo(self, user, data) end end, SendToAllExcept = function(exclude: { Player }, data: any) for _, user in Players:GetPlayers() do if table.find(exclude, user) then continue end Processor.SendTo(self, user, data) end end, Listen = function(listener) table.insert(self._listeners, listener) end, })[index] end, } local PacketID = 0 return function(packettype, solver: Types.DataTypeInterface) : Types.Event local self = setmetatable({ _solver = solver, _listeners = {}, _packetid = PacketID, _packettype = packettype, _method = "Event" }, Event) Registry.set("Event", PacketID, self) PacketID+=1 return self end