app.hypergames.hypersdk 1.8.9 → 1.8.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
## [1.8.10](https://github.com/mvmhyper/hyper-sdk/compare/v1.8.9...v1.8.10) (2026-04-22)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* hold score batches until startGame ack ([bf49863](https://github.com/mvmhyper/hyper-sdk/commit/bf498637b2c7a14e9d8eba5f62345fc97b59d6aa))
|
|
7
|
+
|
|
1
8
|
## [1.8.9](https://github.com/mvmhyper/hyper-sdk/compare/v1.8.8...v1.8.9) (2026-04-17)
|
|
2
9
|
|
|
3
10
|
|
package/HyperLoader.unity
CHANGED
|
@@ -840,7 +840,7 @@ GameObject:
|
|
|
840
840
|
m_Component:
|
|
841
841
|
- component: {fileID: 1064166296}
|
|
842
842
|
m_Layer: 0
|
|
843
|
-
m_Name:
|
|
843
|
+
m_Name: __HyperSDK_BuildMarker_639122897878079609
|
|
844
844
|
m_TagString: Untagged
|
|
845
845
|
m_Icon: {fileID: 0}
|
|
846
846
|
m_NavMeshLayer: 0
|
|
@@ -294,6 +294,9 @@ namespace Hyper.Internal.Managers
|
|
|
294
294
|
private Coroutine _sendGameResumedCoroutine;
|
|
295
295
|
private bool _gameStarted;
|
|
296
296
|
private bool _gameResumed;
|
|
297
|
+
private bool _canFlushScoresAfterGameStartAck;
|
|
298
|
+
private bool _hasLoggedWaitingForGameStartAck;
|
|
299
|
+
private bool _hasLoggedFirstFlushAfterGameStartAck;
|
|
297
300
|
private bool _isManuallyClosed;
|
|
298
301
|
private bool _isSocketErrorCalled;
|
|
299
302
|
|
|
@@ -361,6 +364,10 @@ namespace Hyper.Internal.Managers
|
|
|
361
364
|
|
|
362
365
|
public void SendGameStarted()
|
|
363
366
|
{
|
|
367
|
+
_canFlushScoresAfterGameStartAck = false;
|
|
368
|
+
_hasLoggedWaitingForGameStartAck = false;
|
|
369
|
+
_hasLoggedFirstFlushAfterGameStartAck = false;
|
|
370
|
+
|
|
364
371
|
if (_sendGameStartedCoroutine == null)
|
|
365
372
|
{
|
|
366
373
|
_sendGameStartedCoroutine = StartCoroutine(SendGameStartedCoroutine());
|
|
@@ -583,7 +590,14 @@ namespace Hyper.Internal.Managers
|
|
|
583
590
|
{
|
|
584
591
|
_gameManager?.ShowConnectionRestored();
|
|
585
592
|
|
|
586
|
-
|
|
593
|
+
// If gameplay started locally but backend never acknowledged startGame,
|
|
594
|
+
// reconnect must bootstrap the backend session with startGame first.
|
|
595
|
+
if (!_gameStarted)
|
|
596
|
+
{
|
|
597
|
+
HyperDebug.Log("[Reconnect] Game has started locally but startGame ack not received yet. Sending startGame on reconnect.");
|
|
598
|
+
SendGameStarted();
|
|
599
|
+
}
|
|
600
|
+
else if (!_gameManager.IsPaused)
|
|
587
601
|
{
|
|
588
602
|
SendGameResumed();
|
|
589
603
|
}
|
|
@@ -633,6 +647,8 @@ namespace Hyper.Internal.Managers
|
|
|
633
647
|
public void OnSocketGameStarted(string message)
|
|
634
648
|
{
|
|
635
649
|
_gameStarted = true;
|
|
650
|
+
_canFlushScoresAfterGameStartAck = true;
|
|
651
|
+
_hasLoggedWaitingForGameStartAck = false;
|
|
636
652
|
|
|
637
653
|
if (_sendGameStartedCoroutine != null)
|
|
638
654
|
{
|
|
@@ -642,6 +658,8 @@ namespace Hyper.Internal.Managers
|
|
|
642
658
|
|
|
643
659
|
HyperDebug.Log("[WebSocket] Received gameStarted event from server.");
|
|
644
660
|
TryUpdateCSRFToken(message, "gameStarted");
|
|
661
|
+
int pendingCount = _dataManager?.PendingScores?.Count ?? 0;
|
|
662
|
+
HyperDebug.Log($"[Score] gameStarted acknowledged by backend. Score flush gate opened. PendingCount={pendingCount}");
|
|
645
663
|
}
|
|
646
664
|
|
|
647
665
|
public void OnSocketGameResumed(string message)
|
|
@@ -649,6 +667,14 @@ namespace Hyper.Internal.Managers
|
|
|
649
667
|
_gameResumed = true;
|
|
650
668
|
HyperDebug.Log("[WebSocket] Received gameResumed event from server.");
|
|
651
669
|
|
|
670
|
+
if (!_canFlushScoresAfterGameStartAck)
|
|
671
|
+
{
|
|
672
|
+
_canFlushScoresAfterGameStartAck = true;
|
|
673
|
+
_hasLoggedWaitingForGameStartAck = false;
|
|
674
|
+
int pendingCount = _dataManager?.PendingScores?.Count ?? 0;
|
|
675
|
+
HyperDebug.Log($"[Score] gameResumed acknowledged before gameStarted ack. Opening score flush gate. PendingCount={pendingCount}");
|
|
676
|
+
}
|
|
677
|
+
|
|
652
678
|
TryUpdateCSRFToken(message, "gameResumed");
|
|
653
679
|
ResumeScoreSending();
|
|
654
680
|
}
|
|
@@ -1175,6 +1201,21 @@ namespace Hyper.Internal.Managers
|
|
|
1175
1201
|
{
|
|
1176
1202
|
int pendingCount = _dataManager?.PendingScores?.Count ?? 0;
|
|
1177
1203
|
HyperDebug.Log($"[Score] Socket disconnected - accumulating scores for offline batch. PendingCount={pendingCount}");
|
|
1204
|
+
_isWaitingForTokenLogEmitted = false;
|
|
1205
|
+
_hasLoggedWaitingForGameStartAck = false;
|
|
1206
|
+
yield return _scoreSendInterval;
|
|
1207
|
+
continue;
|
|
1208
|
+
}
|
|
1209
|
+
|
|
1210
|
+
if (!_canFlushScoresAfterGameStartAck)
|
|
1211
|
+
{
|
|
1212
|
+
int pendingCount = _dataManager?.PendingScores?.Count ?? 0;
|
|
1213
|
+
if (!_hasLoggedWaitingForGameStartAck)
|
|
1214
|
+
{
|
|
1215
|
+
HyperDebug.LogWarning($"[Score] Waiting for gameStarted acknowledgement before flushing score batches. PendingCount={pendingCount}");
|
|
1216
|
+
_hasLoggedWaitingForGameStartAck = true;
|
|
1217
|
+
}
|
|
1218
|
+
|
|
1178
1219
|
_isWaitingForTokenLogEmitted = false;
|
|
1179
1220
|
yield return _scoreSendInterval;
|
|
1180
1221
|
continue;
|
|
@@ -1211,6 +1252,11 @@ namespace Hyper.Internal.Managers
|
|
|
1211
1252
|
scoresToSend.AddRange(_dataManager?.PendingScores);
|
|
1212
1253
|
_dataManager?.PendingScores.Clear();
|
|
1213
1254
|
int count = scoresToSend.Count;
|
|
1255
|
+
if (!_hasLoggedFirstFlushAfterGameStartAck)
|
|
1256
|
+
{
|
|
1257
|
+
HyperDebug.Log($"[Score] First score flush after gameStarted acknowledgement. BatchSize={count}");
|
|
1258
|
+
_hasLoggedFirstFlushAfterGameStartAck = true;
|
|
1259
|
+
}
|
|
1214
1260
|
HyperDebug.Log($"[Score] Preparing to send {count} score sample(s) over WebSocket. LastPendingCumulativeScore={scoresToSend[count - 1].cumulativeScore}");
|
|
1215
1261
|
|
|
1216
1262
|
// Send the entire batch as an array payload.
|
|
@@ -283,12 +283,13 @@ namespace Hyper.Internal
|
|
|
283
283
|
_dataManager.UpdateScore(0);
|
|
284
284
|
HyperRuntime.Timer.StartActiveGameTimer();
|
|
285
285
|
|
|
286
|
-
//
|
|
286
|
+
_dataManager.StartCapturingScores(); // Start capture/sender immediately so offline starts still buffer score samples.
|
|
287
|
+
_backendManager.StartSendingScores(); // Sender loop already pauses actual submissions while disconnected or token-gated.
|
|
288
|
+
|
|
289
|
+
// startGame handshake can only be emitted when socket is connected.
|
|
287
290
|
if (_backendManager.isSocketConnected)
|
|
288
291
|
{
|
|
289
292
|
_backendManager.SendGameStarted();
|
|
290
|
-
_dataManager.StartCapturingScores();
|
|
291
|
-
_backendManager.StartSendingScores();
|
|
292
293
|
}
|
|
293
294
|
|
|
294
295
|
#if UNITY_WEBGL && !UNITY_EDITOR
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "app.hypergames.hypersdk",
|
|
3
|
-
"version": "1.8.
|
|
3
|
+
"version": "1.8.10",
|
|
4
4
|
"displayName": "HyperSDK",
|
|
5
5
|
"description": "Official Unity SDK for Hyper: multiplayer battles, leaderboards, deterministic RNG, session management, tutorials, and WebGL optimizations for production-ready games.",
|
|
6
6
|
"unity": "6000.0",
|