diff --git a/lua/pac3/editor/client/wear.lua b/lua/pac3/editor/client/wear.lua index 038b8123e..8a03a5d73 100644 --- a/lua/pac3/editor/client/wear.lua +++ b/lua/pac3/editor/client/wear.lua @@ -63,17 +63,10 @@ end do -- to server local function net_write_table(tbl) - local buffer = pac.StringStream() buffer:writeTable(tbl) - local data = buffer:getString() - local ok, err = pcall(net.WriteStream, data) - - if not ok then - return ok, err - end - + net.WriteStream(data) return #data end @@ -104,10 +97,11 @@ do -- to server net.Start("pac_submit") - local bytes, err = net_write_table(data) + local ok, bytes = pcall(net_write_table, data) - if not bytes then - pace.Notify(false, "unable to transfer data to server: " .. tostring(err or "too big"), pace.pac_show_uniqueid:GetBool() and string.format("%s (%s)", part:GetName(), part:GetPrintUniqueID()) or part:GetName()) + if not ok then + net.Abort() + pace.Notify(false, "unable to transfer data to server: " .. tostring(bytes or "too big"), pace.pac_show_uniqueid:GetBool() and string.format("%s (%s)", part:GetName(), part:GetPrintUniqueID()) or part:GetName()) return false end @@ -127,8 +121,9 @@ do -- to server end net.Start("pac_submit") - local ret, err = net_write_table(data) - if ret == nil then + local ok, err = pcall(net_write_table, data) + if not ok then + net.Abort() pace.Notify(false, "unable to transfer data to server: " .. tostring(err or "too big"), name) return false end @@ -236,6 +231,13 @@ end net.Receive("pac_submit", function() if not pac.IsEnabled() then return end + local owner = net.ReadEntity() + if owner:IsValid() and owner:IsPlayer() then + pac.Message("Receiving outfit from ", owner) + else + return + end + net.ReadStream(ply, function(data) if not data then pac.Message("message from server timed out") @@ -243,7 +245,11 @@ net.Receive("pac_submit", function() end local buffer = pac.StringStream(data) - local data = buffer:readTable() + local ok, data = pcall(buffer.readTable, buffer) + if not ok then + pac.Message("received invalid message from server!?") + return + end if type(data.owner) ~= "Player" or not data.owner:IsValid() then pac.Message("received message from server but owner is not valid!? typeof " .. type(data.owner) .. " || ", data.owner) diff --git a/lua/pac3/editor/server/wear.lua b/lua/pac3/editor/server/wear.lua index a003a5ab4..6a35acfe7 100644 --- a/lua/pac3/editor/server/wear.lua +++ b/lua/pac3/editor/server/wear.lua @@ -7,6 +7,7 @@ local isfunction = isfunction local ProtectedCall = ProtectedCall pace.StreamQueue = pace.StreamQueue or {} +pace.MaxStreamQueue = 32 -- Max queued outfits per player timer.Create("pac_check_stream_queue", 0.1, 0, function() local item = table.remove(pace.StreamQueue) @@ -46,17 +47,10 @@ local function make_copy(tbl, input) end local function net_write_table(tbl) - local buffer = pac.StringStream() buffer:writeTable(tbl) - local data = buffer:getString() - local ok, err = pcall(net.WriteStream, data) - - if not ok then - return ok, err - end - + net.WriteStream(data) return #data end @@ -272,17 +266,19 @@ function pace.SubmitPartNow(data, filter) local ret = pac.CallHook("SendData", players, data) if ret == nil then net.Start("pac_submit") - local bytes, err = net_write_table(data) + net.WriteEntity(owner) + local ok, err = pcall(net_write_table, data) - if not bytes then + if ok then + net.Send(players) + else + net.Abort() local errStr = tostring(err) ErrorNoHalt("[PAC3] Outfit broadcast failed for " .. tostring(owner) .. ": " .. errStr .. "\n") if owner and owner:IsValid() then owner:ChatPrint("[PAC3] ERROR: Could not broadcast your outfit: " .. errStr) end - else - net.Send(players) end end @@ -299,18 +295,22 @@ end -- Inserts the given part into the StreamQueue function pace.SubmitPart(data, filter, callback) - if istable(data.part) then - pac.dprint("queuing part %q from %s", data.part.self.Name, tostring(data.owner)) - table.insert(pace.StreamQueue, { - data = data, - filter = filter, - callback = callback - }) - - return "queue" + if not ((istable(data.part) or isstring(data.part)) and IsValid(data.owner)) then return end + local owner = data.owner + local count = 0 + for _, v in ipairs(pace.StreamQueue) do + if v.data.owner == owner then + if count == pace.MaxStreamQueue then return end + count = count + 1 + end end - return pace.SubmitPartNow(data, filter) + if data.part.self then pac.dprint("queuing part %q from %s", data.part.self.Name, tostring(data.owner)) end + table.insert(pace.StreamQueue, { + data = data, + filter = filter, + callback = callback + }) end -- Inserts the given part into the StreamQueue, and notifies when it completes @@ -402,15 +402,15 @@ pace.PCallNetReceive(net.Receive, "pac_submit", function(len, ply) return end local buffer = pac.StringStream(data) - pace.HandleReceivedData(ply, buffer:readTable()) + local ok,tbl = pcall(buffer.readTable, buffer) + if ok then + pace.HandleReceivedData(ply, tbl) + end end) end) function pace.ClearOutfit(ply) - local uid = pac.Hash(ply) - - pace.SubmitPart({part = "__ALL__", uid = pac.Hash(ply), owner = ply}) - pace.CallHook("RemoveOutfit", ply) + pace.RemovePart({part = "__ALL__", uid = pac.Hash(ply), owner = ply}) end function pace.RequestOutfits(ply)