From c6cf04a342a013afab52063a9b5445a3683700d4 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Sun, 19 Jul 2026 23:21:00 +0100 Subject: [PATCH] Decouple realtime publication from peer sockets --- .../CultMeshQuicRealtimeTransport.cs | 55 ++++++++++++++++-- src/GameCult.Mesh/docs/transport-planes.md | 12 +++- ...ultMeshNativeQuicRealtimeTransportTests.cs | 27 ++++++--- unity/org.gamecult.cultlib/README.md | 4 +- .../Plugins/GameCult.Caching.MessagePack.dll | Bin 27136 -> 27136 bytes .../Plugins/GameCult.Caching.MessagePack.pdb | Bin 16744 -> 16744 bytes .../Runtime/Plugins/GameCult.Caching.dll | Bin 82944 -> 82944 bytes .../Runtime/Plugins/GameCult.Caching.pdb | Bin 29376 -> 29376 bytes .../Runtime/Plugins/GameCult.Logging.dll | Bin 6656 -> 6656 bytes .../Runtime/Plugins/GameCult.Logging.pdb | Bin 9536 -> 9536 bytes .../Plugins/GameCult.Mesh.Quic.Native.dll | Bin 15360 -> 15360 bytes .../Plugins/GameCult.Mesh.Quic.Native.pdb | Bin 12268 -> 12268 bytes .../Runtime/Plugins/GameCult.Mesh.dll | Bin 593920 -> 593920 bytes .../Runtime/Plugins/GameCult.Mesh.pdb | Bin 192780 -> 192780 bytes .../Runtime/Plugins/GameCult.Networking.dll | Bin 456192 -> 456192 bytes .../Runtime/Plugins/GameCult.Networking.pdb | Bin 229880 -> 229880 bytes unity/org.gamecult.cultlib/package.json | 2 +- 17 files changed, 81 insertions(+), 19 deletions(-) diff --git a/src/GameCult.Mesh.Quic/CultMeshQuicRealtimeTransport.cs b/src/GameCult.Mesh.Quic/CultMeshQuicRealtimeTransport.cs index 2bf691a6..a0198a32 100644 --- a/src/GameCult.Mesh.Quic/CultMeshQuicRealtimeTransport.cs +++ b/src/GameCult.Mesh.Quic/CultMeshQuicRealtimeTransport.cs @@ -217,6 +217,18 @@ public sealed class CultMeshQuicRealtimeServer : IAsyncDisposable CancellationToken cancellationToken = default) { if (frame == null) throw new ArgumentNullException(nameof(frame)); + cancellationToken.ThrowIfCancellationRequested(); + + if (frame.Delivery == CultMeshRealtimeDelivery.LatestOnly) + { + foreach (var client in _clients.Keys) + { + if (client.TryPublishLatest(frame)) continue; + if (_clients.TryRemove(client, out _)) client.Dispose(); + } + return; + } + var sends = _clients.Keys.Select(client => SendToConnectedClientAsync(client, frame, cancellationToken)).ToArray(); if (sends.Length > 0) await Task.WhenAll(sends).ConfigureAwait(false); } @@ -304,8 +316,11 @@ internal sealed class CultMeshQuicRealtimeTransport : ICultMeshRealtimeTransport private readonly ConcurrentDictionary _latestGenerations = new(StringComparer.Ordinal); private readonly ConcurrentDictionary _streamReaders = new(); private readonly SemaphoreSlim _reliableSendGate = new(1, 1); + private readonly CultMeshRealtimeInbox _outbound = new(); private readonly Action? _observer; private readonly Task _acceptLoop; + private readonly Task _outboundLoop; + private readonly Task _completion; private QuicStream? _reliableOutbound; private int _nextReaderId; private bool _disposed; @@ -319,11 +334,19 @@ internal sealed class CultMeshQuicRealtimeTransport : ICultMeshRealtimeTransport _connection = connection; _observer = observer; _acceptLoop = AcceptStreamsAsync(_shutdown.Token); + _outboundLoop = SendPublishedFramesAsync(_shutdown.Token); + _completion = Task.WhenAll(_acceptLoop, _outboundLoop); } public string TransportId => "msquic-realtime"; public string Endpoint { get; } - public Task Completion => _acceptLoop; + public Task Completion => _completion; + + internal bool TryPublishLatest(CultMeshRealtimeFrame frame) + { + if (_disposed || frame.Delivery != CultMeshRealtimeDelivery.LatestOnly) return false; + return _outbound.Publish(frame); + } public async Task SendAsync(CultMeshRealtimeFrame frame, CancellationToken cancellationToken = default) { @@ -368,6 +391,7 @@ internal sealed class CultMeshQuicRealtimeTransport : ICultMeshRealtimeTransport { if (_disposed) return; _disposed = true; + _outbound.Complete(); _shutdown.Cancel(); _reliableOutbound?.DisposeAsync().AsTask().GetAwaiter().GetResult(); _connection.DisposeAsync().AsTask().GetAwaiter().GetResult(); @@ -376,6 +400,26 @@ internal sealed class CultMeshQuicRealtimeTransport : ICultMeshRealtimeTransport _shutdown.Dispose(); } + private async Task SendPublishedFramesAsync(CancellationToken cancellationToken) + { + try + { + while (!cancellationToken.IsCancellationRequested) + { + var frame = await _outbound.ReceiveAsync(cancellationToken).ConfigureAwait(false); + await SendAsync(frame, cancellationToken).ConfigureAwait(false); + } + } + catch (OperationCanceledException) when (cancellationToken.IsCancellationRequested) + { + } + catch + { + _shutdown.Cancel(); + throw; + } + } + private async Task OpenStreamAsync(byte kind, CancellationToken cancellationToken) { var stream = await _connection.OpenOutboundStreamAsync( @@ -515,21 +559,20 @@ internal sealed class CultMeshRealtimeInbox private readonly Dictionary _latest = new(StringComparer.Ordinal); private bool _completed; - public void Publish(CultMeshRealtimeFrame frame) + public bool Publish(CultMeshRealtimeFrame frame) { if (frame.Delivery != CultMeshRealtimeDelivery.LatestOnly) { - _ready.Writer.TryWrite(new InboxToken(frame, null)); - return; + return _ready.Writer.TryWrite(new InboxToken(frame, null)); } var key = frame.ChannelId + "\u001f" + frame.BodyId; lock (_gate) { - if (_completed) return; + if (_completed) return false; var alreadyPending = _latest.ContainsKey(key); _latest[key] = frame; - if (!alreadyPending) _ready.Writer.TryWrite(new InboxToken(null, key)); + return alreadyPending || _ready.Writer.TryWrite(new InboxToken(null, key)); } } diff --git a/src/GameCult.Mesh/docs/transport-planes.md b/src/GameCult.Mesh/docs/transport-planes.md index 2d529593..c1372105 100644 --- a/src/GameCult.Mesh/docs/transport-planes.md +++ b/src/GameCult.Mesh/docs/transport-planes.md @@ -49,9 +49,15 @@ advertised mapping when it is actually reachable; otherwise it connects to the advertised QUIC route. Latest-only receivers must replace pending generations per body rather than queueing render debt. -Provider broadcast isolates physical peers. A client disconnect or send failure -removes that session without failing the publication tick for healthy clients; -only caller cancellation stops the broadcast operation. +Provider simulation owns state generation, not socket completion. Latest-only +broadcast enqueues into a keyed, coalescing outbox owned by each physical peer +and returns without waiting for network delivery. The peer's transport worker +owns stream writes and eviction after disconnect or send failure. Thus a slow, +stalled, or departed client cannot backpressure a simulation tick, while a +healthy peer still converges on the newest generation. Reliable-ordered +broadcast remains completion-bearing because dropping or replacing it would +violate its declared delivery contract; caller cancellation can stop that +operation. **Derived state:** connector choice, physical endpoint, connection health, and transport diagnostics. None of these grant provider authority or become content diff --git a/tests/GameCult.Mesh.Quic.Native.Tests/CultMeshNativeQuicRealtimeTransportTests.cs b/tests/GameCult.Mesh.Quic.Native.Tests/CultMeshNativeQuicRealtimeTransportTests.cs index b491d912..c12cae03 100644 --- a/tests/GameCult.Mesh.Quic.Native.Tests/CultMeshNativeQuicRealtimeTransportTests.cs +++ b/tests/GameCult.Mesh.Quic.Native.Tests/CultMeshNativeQuicRealtimeTransportTests.cs @@ -92,19 +92,32 @@ public sealed class CultMeshNativeQuicRealtimeTransportTests var pin = Convert.ToHexString(SHA256.HashData(certificate.RawData)); var endpoint = $"cultmesh-state+quic://127.0.0.1:{server.LocalEndPoint.Port}?cert-sha256={pin}"; var connector = new CultMeshNativeQuicRealtimeTransportConnector(); - var client = await connector.ConnectAsync( + var departedClient = await connector.ConnectAsync( new CultMeshTransportCandidate(endpoint), CultMeshEndpointId.Parse("aetheria.local")); - await WaitUntilAsync(() => server.ConnectionCount == 1); + using var healthyClient = await connector.ConnectAsync( + new CultMeshTransportCandidate(endpoint), + CultMeshEndpointId.Parse("aetheria.local")); + await WaitUntilAsync(() => server.ConnectionCount == 2); await server.BroadcastAsync(Frame(sequence: 1)); using var receiveTimeout = new CancellationTokenSource(TimeSpan.FromSeconds(5)); - await client.ReceiveAsync(receiveTimeout.Token); + await departedClient.ReceiveAsync(receiveTimeout.Token); + await healthyClient.ReceiveAsync(receiveTimeout.Token); - client.Dispose(); + departedClient.Dispose(); - Func broadcastAfterDeparture = () => server.BroadcastAsync(Frame(sequence: 2)); - await broadcastAfterDeparture.Should().NotThrowAsync( - "a short-lived realtime observer cannot terminate provider publication"); + for (var sequence = 2; sequence <= 100; sequence++) + await server.BroadcastAsync(Frame(sequence)).WaitAsync(TimeSpan.FromSeconds(1)); + + CultMeshRealtimeFrame received; + do + { + received = await healthyClient.ReceiveAsync(receiveTimeout.Token); + } + while (received.Sequence < 100); + + received.Sequence.Should().Be(100, + "a departed observer cannot stall provider publication or starve healthy peers"); } private static CultMeshRealtimeFrame Frame(long sequence) => new() diff --git a/unity/org.gamecult.cultlib/README.md b/unity/org.gamecult.cultlib/README.md index 136c38ab..fe294920 100644 --- a/unity/org.gamecult.cultlib/README.md +++ b/unity/org.gamecult.cultlib/README.md @@ -9,10 +9,10 @@ runtime; the Microsoft license is included under `Third Party Notices`. Build it with `scripts/build-unity-package.ps1`. Do not edit generated plugin assemblies in the package output. -Install version `1.0.37` through Unity Package Manager with: +Install version `1.0.38` through Unity Package Manager with: ```text -https://github.com/GameCult/CultLib.git?path=/unity/org.gamecult.cultlib#cultlib-unity-v1.0.37 +https://github.com/GameCult/CultLib.git?path=/unity/org.gamecult.cultlib#cultlib-unity-v1.0.38 ``` CultMesh chooses mapped memory for reachable same-machine bodies and advertised diff --git a/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Caching.MessagePack.dll b/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Caching.MessagePack.dll index 9512f6b3d34f14c933b484d852486f91e99bca0c..e6dbf77d0878dd02df5751de6a298eb033567ea8 100644 GIT binary patch delta 237 zcmZp;!q{+yaY6@++nLR47WM=QTusP2C871peU;Yg(zTllW^bMo^om=-@$uQX>)jTb2^SZcMj4X$w4$YqIlMo=_@}a}! zY3U!|HICNzvrL~UPhOKST>&Z>3ljvXo*J+ugGGGTu|q)<_rcv(hvxZfNUd%B!)B~P6m=770C=H3}!%aQ=q&tkevjiLAq0cVrdL%nYT48{zmKoJ9=m<59+P}~S8ngkR}WJqR61(HTUbw*%0Lm)qm!5pa546Mr# Ms6KJ?#I$^703~EgMgRZ+ diff --git a/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Caching.MessagePack.pdb b/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Caching.MessagePack.pdb index d932026c34ea2a2ea59497915f0f7a6ae69556ff..afbf39e5b18e18daca2a6fed3f63b219a8ec6391 100644 GIT binary patch delta 1337 zcmZwGYfuwc6ae76n++j>@K8`*R$H7V7+xEY1VsUZMWlemmX~yj2_%9btu+a8&?tpq zQJ6pgTPagUB!Cbe1_~%uUZV9yVbp<9gb_s}B3MzZLfaFjKl-CP^PO|<-g9^F?9P3f zg+0x})R{Ixv&VuSOBcfG12>MPte!`oI{N0w1o!Q3PlJUK|{K4ypj%6-Uir5+u0cNCFOkOppyuxDlur#JUqG0YrNc zNVy+EK3L;PAT}U@03?H-zzCQGFMt_IAR)*jX=oh0Au+T_{`bofD3nW}NDv2vAO-9P z2SFCd14Ufp8Umf-B8#Qs^uIT1^<#JvU3r;h{2v%vU=fh1OLZrk2H6zQm&Oq;W{}MR zb7{QE-4e1Dum<614PwC?8fh$8A7#oyCa9kA3!ew+FFUh{53sXQ55FuvjTONj$sA?^Il(6>(Uu5O}q?!t=_XT~XI_0i#-urpop zXo@3gl`}(8EzRVUHNK8ZRnN?mHNz!t%l2cWU}ZWj{VKl-p!F;RYpX$B?FwFSwwT&<_(ldU7=lD^D$N1m|nyQ=nS<~ZF+V%d5T}Q9( zef413tyjwDim^eb4_btWsPb|)Pjc_lh}+46khEDz$UExRcCumP;x6@<3vp$+;+%^Y zcI4k}x#nS_WO5>dTD>#=luGhE((Y)_j`L#Lp4;X8Oo@{YMz!t>IGmYF<@6N&IyW!q z_IFdUFI4(B?P#g+avHpolrJ>M;S#n^@mGtWLevQaWYaela zzkICBF0a(5@gc)8JTTFPK2?|MtRL-|k6JZTe*V5-$WU%u)BZX;IVe?B2YWAa;?ra`xBXYhXLe07-a6_2@UzLZZ%!HJs0D?t zcNPi9FiqC-T%Uei_ z_(?pmSWjD7gWK84zdwsAF!U^p^@jQ*At>)VZ1Q$GeMV!jaMDcJTL<5ZyzvknK}a>K zriX638F*IaGIvAO-VnSyElD6vJ>dRnxG0{K6=OAJSWT5ClXt?Z7^}6%YS~z|aTcrf m)!XqO5cb8G?jokUZ|u{}V+|CnVGY*c3Qc;;O|b+VzkdKSkh--1 delta 1347 zcmZwFYfuwc6bJCT%dP>Ghk!h_I#!z)NH8J1AA-RFt00IVuR0|q;T6P+ia<&f2*nfu z4P~YSSOlivK%#U}tSE)T04Wp)N(H1~k&Xmw1q*_TLQfb!^h0;%ch0@L|GRrcUa%hofurCU5CSns1sUKx$OlDIC_QU8#gWl29K`}D$O9Ka z3Ahfrz$Ew^e8|L6Ft`C6ZE+L^YQcIt98o|61S}jSfHNQqF^N zYx6y9Bk0CpBM3y>5FMV-NTb90a9uiDhgABvkPdo*J%BogFG9^E+w^FN&27`uMIPEM z@I!WZc)3s=8`=qJL*B=)?Pdnq9)bQPc7dknDxB?uPP`kQZ>}`)R^baa=O2c^&XgtN ziDTZzvRR$Uw`~&-ezrQ4`+C`Svi~5v#4Zm8?ARZI>6igMTm@*`wEBL9(5B${BSTi6{4E z9=Pql+BnVkOO*`ix9C523r_4$lPaQ^EGyw`fAzw8d5~i4`Lh(CldqGKC(9h~JU{Gs zVuE?kQp&4|$C+jAz1K5CqSc``^>@bvyQAyzB)3wDa!f@<4D_O-y2mnJfq_3^nA7ajd#!+^woo>c)+`Y4&Oz2_A@t; zn(@uS%L6OrMyiFYGt|E2J%7|U^mI}G5cFRKCDMxi?kR;to_8X;@X)l?*C`@O%`2N) zX?1S5P>#0Blf;a5mpXThgsQ_t%c-*wtS#kt+`I>0RBWodJ)b*#Ec^?N7wLZ1ASd!P zD=s0j@j>zx%SSao8Wnfl_v_E>Xtj+_Nvj*#Q<^p#d5e@7HZ;wVpO6jKC-u9k{7wGK z!WCJj7s$R`jm(PLU^aj=II$eAlZY4N;267`y!X4{v4s1I8N zv$W6mp1ggY7&$XZxmxo#>rk~V3aJy1Xu)cy70pg}X{A_Q1y)z9$Z#$&F2%0dVAq&f nt@bK*&7CrLnINo6F=ZR3oY3Z!uQ3&gskUP(HiRex&j{jQuh7S? diff --git a/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Caching.dll b/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Caching.dll index 575b4d98eb6f070d11906872d6b52a9fa3b49d4f..addc762575c8ff60c477ac07e5c33a162e34dc8d 100644 GIT binary patch delta 247 zcmZqZU~TANozTG|THd*;v1e-!qmGEcD_`|*tTS1h=N_qJ`|&pa{q_?gjLQ@>ERqwG zEs`x$lg$m14GoRVjgr!mlGBnclTFObO%07rk_?kAQq9xSwofx<+{DZx?ECBCbRSE` z0D;bir`j279{R34XtdTScGK_aYb+V-6=0$-p`t+biCs+mxrcb3|DD?M@!587E5_5T z{uT_$42eJtqAeLxfuuQu0gyBVLL(sCh#`p~4TzJ0BuGUvg9(EfP}~$KZwzE70cnu# QRG?TIL)!LK2gcdV0C-SPv;Y7A delta 247 zcmZqZU~TANozTJ3eC+G$#-6P`j5;C$Eg!1*g@23rZ5KPeEbw;b`Ryk}7?&w%7^WB+ znWdQ|8k?pV7+P2w8JQ%RCMKsQ8l@RoSQ@6LnVXpzn;KdsZl7k#xQUtN{n?Cj(|s%% z0|bI}%_lGAvU8mGLPK^%JTK$)HI|I^3Q*C&dr(oJdcT>zwfiPWtoR}BCnCMw+luit ztG^*b3WFho5rY{+8iNT#B7-r5DNw`!C}zQ62^2R1iY5WY5*d;iQh}rqP@NH2&Jf5? WV=xEmGz0501gcNmp6b9jn;8J+gGcuO diff --git a/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Caching.pdb b/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Caching.pdb index 9cd13875426b1286b38a8d23ffa9c12cb93a60fd..68fba3225f7735d78622a010b49db3e8e0a16042 100644 GIT binary patch delta 2914 zcmYk-2~<;88o=>;L)cVotD?@}R%8)TmI#TVC}CVG3XHqrP(>r4BjB+`t(6+LGIfVi zYq5-qMhgl>CrGjNC{$%cJ1W$=50w3&R*MTRP@I1tcE~xu`+fK3d+*(s_wG$moh+)8 zDM`IHt*!H1lv5R!U98Ggz4xz{o?$PmQd61@R|ZRQ9Tlj~N`tscavRlX#BX?pHdwn!(GAWR3KatI z7fi%dEJPd`m#L)}=-~nG~5sVN_L4<*3J{DscR$(1BAr(#*kTG($H`3dL|KvTzi?mHz zE3gL1*p4r}gyqAtrhf?Epa7>(iZa|mZF{X0e%?|ML)2En z8)}TgSWLoHL?8;WNWdr9hMl;8a@;~S?&1+%LZPt|T{ImR=|LWNYP^8dD#dU_VJ{lt5}*|05sytsMS6gF za!QdIV6Yb10oLMF`+#|nr4zt1LnT_!=N%~q!X4h2glYI2^!O6{kcFctL=n#83T~hc zHi1%fM{f*(8@voOYK+EsgkvV=A_fUqfi+0Rc6@<7ID~IdfKw>JC0s)V>LEsP1Eb70 z_WHxpV=NG3VF;y}jz}y-91@X)jo6CMkpUxekdKo%iyv_ncTkJ_c!E|aN3#o}7v3Ii zo&Yi
    E8S}@2a71oxSpS+MyJ`+?36kjy=X@IaJ9ep8-35b-dSq z$;!~$zgBCWtMa|Z+V}C8aMN~Dh4zC>WjD)=jiteto2Kmk!F9z@cgJ^{vm#IS^{R=u zW^fZB#Yano6YuSytWU$76Rj@)J<-v2vfTF1gU7l#H0y3y+tf@r89Vj-iITkWf%`n8 z;&VR9D4sakr!F~c$(k!_8MySUZAfA0tLhh5%K8mlUR>DaLCd~7k@wr&Rz}Wo^RM=D ze$q3!C@i7n+}^ddcVmaA9U6CiUiL?6D=+LA?_lu!>|KAqk6KqP?LBMv;Vth~7Zg6Y zp|WWkxWC}pp~K6!)V62}qsPrY*7ZzFO5s2DKR+7u)U$hSSj$&ua!kA5{`utE(0%f@Vf;#xmodZ6u)b7LMoc>2D<`+CWv%^%-*stPG7 zP29cpS;MNDiB118qy*eDyfr$#XL-h@^cel_(D2x=SEWx2X-I5NYK~Kly6EoL5E1bp zuccyASy}Vo|3;nhz37s>IP!SV_42H`4L-TuQx;|9D;!rQ7w(Ljp7g5tcGHS-oQ(b76Q{9?p`!BnDet})c z{T7*a+JF6!k^1@ik$P>kUgM+p^;Kz93t|@NWAs|RpIYPZJHl^)uYP2-CML$TSe>Ql zyEAENtyn9>hixqm+7DC1_r0unSEK9UV)D@5>*qX68s|!5k~Hp;#!P9i$BOr?CY(~$WHA5-3<8bz1?kD4-;xY)9y F{s-O}$S?o^ delta 2913 zcmYk-3tUav9>DRn&)FwQDF)YEHC{a_)v42y9vTf}_++F}1{D&0ygoz2y*LcX#n5!F zJQ_p~(V*+dYjE>w#-oOc$s^VD^vPq4G+ZP1cj}mFe?H&!|F5%?j}c@-02q5)8hD&Z&F&drGq7L2i0iA6THA5P})ku3_Z{n{b3Im zcp}P95;2I!0wiJu)?y=4u>%>{kHaXy8C=9wJ4q{UlT@M(&G-$kAnYa41>Io_XLw>b zKEx*oM;zuO5i79{I;0~LdC=o~T*Nh$;T~%3wOo|sIbK8QAc<~x555S)WJKdIj^iAP zP=ecdfCfB4E81Y<$i&eHA7Cgv;ExcD#Y9Ze(#${tzQ8}R1{-mlemK#Jj64+ zg5)F#8`wdIE4YbTG~+pzn~c{Pz{xY)}Q8cY{E;7be4qdB8h`Iinp*H#v?#H z7Gfz@VLei?eV8zAJZt*7$j3<(;u^~E01fT6lJIhs#B5id|6-CX{KwUB4t`!^EMlwz z)o8*CsN5uB0b95u1YwwrxmbP zR$?7CBMrNegTpwkHs0)?fftMMIy^!fx_NLR1R%`g&q8Cugc-N@l!T9#=3~spDb#o> z#6u`G3O>bm2P%Xa{eBn(9|R&4pCS^`n2iPa5^J#u|HfV%!1o%ZxQIH9;k-)GOs*Z` zr4;V)K_Egg4&j)BSj@pfBx4J<;X2B3A9Z+y7W@I(TPe)FJ1)|Te7v_TGEj!Qs6i8+ zddpg2=_89iuz@YyFcQ-chxtf^4%s+_0-VKF+(#W=L+L9ESHxm3nqluJi_utsjnE<8 z&oDVzWcq1UBF|4H3fl(^gM2!Ed}gS@8@%r?iGgr}JH}xWreYR$Vjm9TC{E)7uA&ro zA%;uB6jtbq0dRzymc|D`7>zJYMl|BF5KFNN>yd)($UrXgaT1025jRkQYBWJHf*TlN zxUqK|pB`fY2!(b$O$4SP4)c+Sl~{+(NW*UA;4qHk9Ewna+jxKmJV7hkU=qM8h&~t` zV3+_ap)q=NM6K{Q4ulxvSYw>XK~pfVz29;068bBUgs-s`yO51TD8SiH^_S@vck17w zU)iZ&AE50x@#9W|FWPgSJ;ka(7M#G2n%?9##{4s5d})lMf($k9HkRQamTqJs5Bea( zKK_K-qao*0G~`_kIh|`kI;rbmC*DcRU|IYP{e#O10tB^&btW+A>TH1O!Qtwg6GPyMQ=3HBgsgKuJ zPS_N1;J-IrhvpqCdZPOL*8tOFUo?Ds@lH%>OI=3eOUH3FJ*RBdrCKiwzdF5j+cW2( z+V0V|4wGlBvJgkRTZLb;?{Rvy>yX8Esxay6U8*Tx{oUWK!bFi6dd49$WkQmr^9MKT z^Wzc*4$kk{>tsd#oKaiuS{Igup4qncT8ry$OPk_n6Z%zbU09{c{$K3x-lsAzq)zDb zWskjk+~tEF_ln=jwx0zibUV;*apl&7jo(fBhdOtR_U6)XuQmIpx5h0}ZJYO~=ZVWp zK1y@D@zzSStMO>5OX}0A>a<=lqlUFSopEVIpUcT_4osiuwmZGbdRSCmH_zV1F#}7E zJ6uPsTuN>WHx~sk7JYzgGGu_;MeAQ~tSWV1~SuyH3wU4j+tT=BkFAt5o zZ;XDnSFWP(FF)k{ELI5-VzsBFAnp2xXE&UGE>|Sh=pB5Utp`O)Sv+=6OKJL=l>=i;g)t4>3PBh>ms@wE!G Mzee>t6KuQuAFP|c@&Et; diff --git a/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Logging.dll b/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Logging.dll index 6dbc721fc91e21c144198a4f7464498230501cbd..cd07fedc234a3817ba2f17609d01dd677df40ede 100644 GIT binary patch delta 235 zcmZoLX)u}4!7{Zb|H;N48(x8mf4_MxD<=9a`1RP`+(AfX^9|k!j2afniOCkpmZ{0+ z2FZqoM&?FIX-Uax$(G3`X6B}b#wJOI$rh>RX=#%u@ZVwCQ5xSfxj-O5K>Jj>Z_XFYX7RURNM=X`Vi0Y~ zkP0Nt84Q4=ArKk?*+vXW3~4}|3?xA+k{L`G%z)yiKzU;zI|)dGbf*Hv(iqYZG F1^|-{N*MqE delta 235 zcmZoLX)u}4!Sd+%>gyYOYRD K#Lb#w*O>w2Vo_%R diff --git a/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Logging.pdb b/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Logging.pdb index 2c47c069e23d338501724d3f24d99897a0a9ff67..03c2e6c1c5a88d3d39237aff00735dd89b04d736 100644 GIT binary patch delta 763 zcmX@$b--&vjfnQUu8(&XG5K{VrO&lgo?Wn`G`?rzgk_#Fii`|-K->bvvlJPCfQezX zA``<|AifF24}kbN5WfS#Wm;F?^|_}VoKsFHz!8HgDfjw!MN zX*MvMfq?@^a{{qC11p0zi#kyJ5|CtP&|seiRG-GU4M;{ZF*C9-Xl`E5w2i60>W|Oz zi@OtApbD;Tar`*nxHWX-k&s^DlFkCmc z?5)Mxxy-FsR2NQg=nVe8=u6TP*-Z8=mz2($y;1&Z`YXk?Ec=aI0{6AKOJ=^8|0lUp z$DeOkU;ingbsHuZB%KU)S@`PgFN5{RXVnY82oSVMY|3R=At#{168_{u?vF)o`I?O^ z6Xs;z5Hz{bd`wSp!*xZsOH5r^e@-bf{oW&c;{a^ok@xXk# z;;F`kgI(3rgp1T@jPFYwOM6Z%!8%s2M08T2x$gJZr}-UhAkppWj)N zlVW_9AFZ%>zSmsQEIa<jKYzwS0Lq!e4Fq=HS%&DQ3T7=I@=icb3ojD=z0V z)6Nv!=^EUY*(OBvih>x63TFkhDIp`-XsezEl4mO$N0 z%epsh(J5WdB|Ga=_{FF1G}grbd;3m*%KwhvPjC0dvd&lH)^&0<7tD2zbFlVVd7{#u zfswgkX|+;HesXDU>f~hh0u77g#AJ(P%hY6ZgJeTPBXgsqw4~&;WXog|GjmfzW0NGq iWQ$buw6x8?*%!z#CQqKD63vp#xNy(p-zu)aga`n+lQKvE delta 760 zcmX@$b--&vjmS&Z`;&gZT;Vo(`KRa|7q-q0{>r{*;)G?Maf*x#1wh;e#B&rGfPjf% zts)b{c_6+G#E*dZB@llA%Yo!!fSKXDA~VB3AZAr!X5g7z&-mIk2dI*PffE)?Qg>FuQ0D6st9!Y>A^=U(N@Sn4_}_lEna>@O#~-dtPrn|)itU6r$c_C1_E z@zR$s3ts=w@O{V?UATOfPNj&}yRjcYP8j4sC8nfMCb-2gaWRX5eVi$LOScWO9 z0K1T}w;79R*@6wcEICs@&zs`lCt8>MoH3X2d=AeOmSe1pdgUf7GghBvw0V2Pd{V*G ze@mY^M;F&zVcRAZ7Avqy|NHin%2V5>Y}h>A@C$dFLuuZwZhPiQujiM0hnr{Y&K5jh zsr@CZK4kKOPa137*6-(Ac4Jbh^yWElH_Dw9VEZK>aJll@)GrG6;~&gpN%S?#`L%e? z-8d`xw#D`V0rO_x*NQ2;E75dpOH^`R(&epv^EQcoQq^j@R2i|&?VW}Ey0XJ<*Pa~S z7d5SC@=Fs*{^vDYmVW+vEZpQj)4r2kIY#>D3#_z{-TawUZ)ABoeFca5(+yC@M{&)Po`g@u$<9u6g-B?F+xl-RS2T2~q z&Psa*M&^d4)k-P($)%Iy*^4v`Qw)vF(o7PKO;ZdEEi8?UOp;6!lT#Co(u^!D4O7$1 h&CHBV4J{Kl|72ev!1bl$Mm7mTZ}9VrFh?Xl#;Xm~4@1o|eYIAjilcIoZcRax;s;6Gj%VC%kJW zzcCCDm@HCpqrd09SHG>g${Ox{X_I}7CMv)L&qD=4s!xjBsa|086YScpIA!x+qf}OZ z3x;HdL?8yymJF#t(wxBnNE!m65s+=fki?J%#K}Msq#~KYgux6bZVHq)2C|cYG)Q+U OP%MohZSzJ8e`Wy5{7gXr delta 246 zcmZpuXsDRb!D3REb7^BwgO)(s^A-kayWRdf&0JY)SFFz2ETg@UMb9wB(8w&!B+=M3 z#lXGLeBnj*&rfvX6n}W)_1dj4b!A#WqZS zV;CSHVt4#s!dY(j9V#A6ZulI(G1q0M0&2kN^Mx diff --git a/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Mesh.Quic.Native.pdb b/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Mesh.Quic.Native.pdb index 515a7472846761091c9193a8b7d59d362468995b..7354db8c94193857c907773f57aba4541ca11fcf 100644 GIT binary patch delta 1033 zcmaD8|0aGyjmTt?iW~hs@4fnM)m7GT?@RM~!n_Dz{ao*NU}5Vu!k`)Ge|O)0ZCCNWkwbTUKR!x4u%aH z3@n@s`!pPY>@>{=AbA}~axy&K{E_7cQ@weEw$G1~K`$m;Z*?UyoT!Y(Z&j=e3~NJfXWe!Xs5So~&t|K-B=Tlql(jh5N^hqHdbxV-g2#CbX5T7nEuPH8bbX~S)@=@@X}3PxGroFt{qCKs+FRaE?RdUM(8?oA=!#rx zY0;0x=H0qGa+0QQj*cl$;b8vDe{t2Qo7t~cX|2yW%3{kT+cJ3Hih^u+p_xd{dbpt{5TS+ zenYo^_FGr6>t`PQb3Uxro{vyQ9EG{2l_+p!L)K)K%S%;q%= z2N)QxCS;wG(E8=RN^5oL+RX*C-4kAr zU|`{7IH2JGWM^nL0Lhy`l9S>2=8r5tnCc(?3Y>D_S&z7a{Y7UxEXhM8-G->GBB(Sxt(>}L7>+Bhdi6D>XOKxLc0rvxK?^QE!4}^d*}S}aE9q5 zwy@o4{;zsmn|`jpn%jhWn974j^X=2<>}amFCCs_KHV%o5F*MCEr|RJ`R{KbhY> zULmI?!nYvS??VscHii>X4g$}6x-RI}L{6^Z(5T8gKA=D_8!J(F8jf6<@EFMGD& z0?RhlJKG&s?7LGRS{@>C>Cm}2w-@0&jjzsZ5wB;u@^$_0rK`;|Zf6Ugk5n$1az$l@ zE!XQOKce%+q6=;w(Mm7h@$Q5G+b{V=zOQ$#Nojv_ygXu}!kUw9>+EmcobLVHx&BqT z$d>14_Z?pRM7f^JUU1E!=WV7s(#qOgq7_ccF~{4Yy`$!|AF8a_qLZ6`$kSC$$5UX7 zBWXAubES1jvKlk-0OLN$AL#RzhC%%;+o`@BCL05OUlYwKAGXm_upOq z@nhp=zYWoH+jn>CtebiD@9j2UzIYpM-B>?!xzn@OG?+;=b(PvPPG;n)(J)LgG%`yw zNi;T1F)*~SG%_+tGEGcQO*Bd~vamEvO*1z$Gd4A}Ox(PbYXy@;^Rch185S@yw0x-I z7yd2gw_WV?vcTJ!=O?e?mDO;}OU$XPN-ZkZOUcOrCgzI)XC5;&Ffe?HIA?d{+g0aH zPOTXSlsI+*6)V@XuxgxUIKaRlKGo#@yCO-CHN3VRg&rqUV#Jo}QVP z4mIo1@zvKsW;qMYKeu(-8JE3X2S2miD0>K3?weYi0afcb^Faec11Ceb_0QciRTlZJ zW)(Om_~pcNxLUu|lF2@Nd=g4`pG{^+U}sqKXyfw?_`@P63n~V4iXHq)$ diff --git a/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Mesh.dll b/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Mesh.dll index 3aac9d60873ef33141668aa7e8e747c48bc93999..1c38ba77512d2031385310cfece75424ec337eb4 100644 GIT binary patch delta 268 zcmZozpwh5FWkLswg7v{WjXkYBjIBLPtv$@GJuIy~tgSt4tv&2pdpNFe3RH_8u?;k5 z@ZGi1{pxatQ}?$QaB&{f7mbN|OCdUqKmYRP5h0{e?IRgZCSUcT(6@ofpdaiPCVaUz{PRkoQ7eFp^;gdNusf7ih-eprIC?Il4)XcYNAn^k%gsUYMQy3 znX##%W#aaTn;bi|SyDC~@0%{d${8TA@3LV+ZSqCeO}}zxd$~G_OfO;OtW<3@HqT3`PuQ3~3A|42cZJ45mO41E81%gC$Vh r2q>Ba6iZ}CW=I8+MnH8&U^zn|KaIg0sM8Fr%MhqOaeE>U=X_=WX+Tr& diff --git a/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Mesh.pdb b/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Mesh.pdb index 54429321866db39d6363ad77c23d5913a9221432..bd294f53fff1e9e24d3b5ec4a924d78a19b432af 100644 GIT binary patch delta 25152 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 delta 25172 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 delta 270 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 delta 21500 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 B5-b1! diff --git a/unity/org.gamecult.cultlib/package.json b/unity/org.gamecult.cultlib/package.json index 08930273..1fdcdc7f 100644 --- a/unity/org.gamecult.cultlib/package.json +++ b/unity/org.gamecult.cultlib/package.json @@ -1,7 +1,7 @@ { "name": "org.gamecult.cultlib", "displayName": "CultLib", - "version": "1.0.37", + "version": "1.0.38", "unity": "2021.3", "description": "CultCache, CultNet, and CultMesh managed runtime assemblies for Unity.", "license": "MIT",