mirror of
https://github.com/genxium/DelayNoMore
synced 2025-10-09 00:26:39 +00:00
Drafted peer inputFrameUpsync broadcasting mechanism.
This commit is contained in:
@@ -846,6 +846,33 @@ batchInputFrameIdRange=[${batch[0].inputFrameId}, ${batch[batch.length - 1].inpu
|
||||
self.chaserRenderFrameId = renderFrameId1;
|
||||
},
|
||||
|
||||
onPeerInputFrameUpsync(peerJoinIndex, batch /* []*pb.InputFrameDownsync */ ) {
|
||||
// TODO: find some kind of synchronization mechanism against "getOrPrefabInputFrameUpsync"!
|
||||
// See `<proj-root>/ConcerningEdgeCases.md` for why this method exists.
|
||||
if (null == batch) {
|
||||
return;
|
||||
}
|
||||
const self = this;
|
||||
if (!self.recentInputCache) {
|
||||
return;
|
||||
}
|
||||
if (ALL_BATTLE_STATES.IN_SETTLEMENT == self.battleState) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (let k in batch) {
|
||||
const inputFrameDownsync = batch[k];
|
||||
const inputFrameDownsyncId = inputFrameDownsync.inputFrameId;
|
||||
if (inputFrameDownsyncId <= self.lastAllConfirmedInputFrameId) {
|
||||
continue;
|
||||
}
|
||||
self.getOrPrefabInputFrameUpsync(inputFrameDownsyncId); // Make sure that inputFrame exists locally
|
||||
const existingInputFrame = self.recentInputCache.GetByFrameId(inputFrameDownsyncId);
|
||||
existingInputFrame.InputList[peerJoinIndex - 1] = inputFrameDownsync.inputList[peerJoinIndex - 1]; // No need to change "confirmedList", leave it to "onInputFrameDownsyncBatch" -- we're just helping prediction here
|
||||
self.recentInputCache.SetByFrameId(existingInputFrame, inputFrameDownsyncId);
|
||||
}
|
||||
},
|
||||
|
||||
onPlayerAdded(rdf /* pb.RoomDownsyncFrame */ ) {
|
||||
const self = this;
|
||||
// Update the "finding player" GUI and show it if not previously present
|
||||
|
@@ -11,6 +11,7 @@ window.DOWNSYNC_MSG_ACT_HB_REQ = 1;
|
||||
window.DOWNSYNC_MSG_ACT_INPUT_BATCH = 2;
|
||||
window.DOWNSYNC_MSG_ACT_BATTLE_STOPPED = 3;
|
||||
window.DOWNSYNC_MSG_ACT_FORCED_RESYNC = 4;
|
||||
window.DOWNSYNC_MSG_ACT_PEER_INPUT_BATCH = 5;
|
||||
|
||||
window.sendSafely = function(msgStr) {
|
||||
/**
|
||||
@@ -65,6 +66,7 @@ window.handleHbRequirements = function(resp) {
|
||||
}
|
||||
|
||||
if (window.handleBattleColliderInfo) {
|
||||
window.initSecondarySession(null, window.boundRoomId);
|
||||
window.handleBattleColliderInfo(resp.bciFrame);
|
||||
}
|
||||
};
|
||||
@@ -130,8 +132,6 @@ window.initPersistentSessionClient = function(onopenCb, expectedRoomId) {
|
||||
}
|
||||
}
|
||||
|
||||
const currentHistoryState = window.history && window.history.state ? window.history.state : {};
|
||||
|
||||
const clientSession = new WebSocket(urlToConnect);
|
||||
clientSession.binaryType = 'arraybuffer'; // Make 'event.data' of 'onmessage' an "ArrayBuffer" instead of a "Blob"
|
||||
|
||||
@@ -240,3 +240,56 @@ window.clearLocalStorageAndBackToLoginScene = function(shouldRetainBoundRoomIdIn
|
||||
cc.director.loadScene('login');
|
||||
};
|
||||
|
||||
// For secondary ws session
|
||||
window.initSecondarySession = function(onopenCb, boundRoomId) {
|
||||
if (window.secondarySession && window.secondarySession.readyState == WebSocket.OPEN) {
|
||||
if (null != onopenCb) {
|
||||
onopenCb();
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
const selfPlayerStr = cc.sys.localStorage.getItem("selfPlayer");
|
||||
const selfPlayer = null == selfPlayerStr ? null : JSON.parse(selfPlayerStr);
|
||||
const intAuthToken = null == selfPlayer ? "" : selfPlayer.intAuthToken;
|
||||
|
||||
let urlToConnect = backendAddress.PROTOCOL.replace('http', 'ws') + '://' + backendAddress.HOST + ":" + backendAddress.PORT + "/tsrhtSecondary?isSecondary=true&intAuthToken=" + intAuthToken + "&boundRoomId=" + boundRoomId;
|
||||
|
||||
const clientSession = new WebSocket(urlToConnect);
|
||||
clientSession.binaryType = 'arraybuffer'; // Make 'event.data' of 'onmessage' an "ArrayBuffer" instead of a "Blob"
|
||||
|
||||
clientSession.onopen = function(evt) {
|
||||
console.warn("The secondary WS clientSession is opened.");
|
||||
window.secondarySession = clientSession;
|
||||
if (null == onopenCb) return;
|
||||
onopenCb();
|
||||
};
|
||||
|
||||
clientSession.onmessage = function(evt) {
|
||||
if (null == evt || null == evt.data) {
|
||||
return;
|
||||
}
|
||||
try {
|
||||
const resp = window.pb.protos.WsResp.decode(new Uint8Array(evt.data));
|
||||
//console.log(`Got non-empty onmessage decoded: resp.act=${resp.act}`);
|
||||
switch (resp.act) {
|
||||
case window.DOWNSYNC_MSG_ACT_PEER_INPUT_BATCH:
|
||||
mapIns.onPeerInputFrameUpsync(resp.peerJoinIndex, resp.inputFrameDownsyncBatch);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
} catch (e) {
|
||||
console.error("Secondary ws session, unexpected error when parsing data of:", evt.data, e);
|
||||
}
|
||||
};
|
||||
|
||||
clientSession.onerror = function(evt) {
|
||||
console.error("Secondary ws session, error caught on the WS clientSession: ", evt);
|
||||
};
|
||||
|
||||
clientSession.onclose = function(evt) {
|
||||
// [WARNING] The callback "onclose" might be called AFTER the webpage is refreshed with "1001 == evt.code".
|
||||
console.warn(`Secondary ws session is closed: evt=${JSON.stringify(evt)}, evt.code=${evt.code}`);
|
||||
};
|
||||
};
|
||||
|
@@ -2360,6 +2360,7 @@ $root.protos = (function() {
|
||||
* @interface IInputFrameUpsync
|
||||
* @property {number|null} [inputFrameId] InputFrameUpsync inputFrameId
|
||||
* @property {number|Long|null} [encoded] InputFrameUpsync encoded
|
||||
* @property {number|null} [joinIndex] InputFrameUpsync joinIndex
|
||||
*/
|
||||
|
||||
/**
|
||||
@@ -2393,6 +2394,14 @@ $root.protos = (function() {
|
||||
*/
|
||||
InputFrameUpsync.prototype.encoded = $util.Long ? $util.Long.fromBits(0,0,true) : 0;
|
||||
|
||||
/**
|
||||
* InputFrameUpsync joinIndex.
|
||||
* @member {number} joinIndex
|
||||
* @memberof protos.InputFrameUpsync
|
||||
* @instance
|
||||
*/
|
||||
InputFrameUpsync.prototype.joinIndex = 0;
|
||||
|
||||
/**
|
||||
* Creates a new InputFrameUpsync instance using the specified properties.
|
||||
* @function create
|
||||
@@ -2421,6 +2430,8 @@ $root.protos = (function() {
|
||||
writer.uint32(/* id 1, wireType 0 =*/8).int32(message.inputFrameId);
|
||||
if (message.encoded != null && Object.hasOwnProperty.call(message, "encoded"))
|
||||
writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.encoded);
|
||||
if (message.joinIndex != null && Object.hasOwnProperty.call(message, "joinIndex"))
|
||||
writer.uint32(/* id 3, wireType 0 =*/24).int32(message.joinIndex);
|
||||
return writer;
|
||||
};
|
||||
|
||||
@@ -2463,6 +2474,10 @@ $root.protos = (function() {
|
||||
message.encoded = reader.uint64();
|
||||
break;
|
||||
}
|
||||
case 3: {
|
||||
message.joinIndex = reader.int32();
|
||||
break;
|
||||
}
|
||||
default:
|
||||
reader.skipType(tag & 7);
|
||||
break;
|
||||
@@ -2504,6 +2519,9 @@ $root.protos = (function() {
|
||||
if (message.encoded != null && message.hasOwnProperty("encoded"))
|
||||
if (!$util.isInteger(message.encoded) && !(message.encoded && $util.isInteger(message.encoded.low) && $util.isInteger(message.encoded.high)))
|
||||
return "encoded: integer|Long expected";
|
||||
if (message.joinIndex != null && message.hasOwnProperty("joinIndex"))
|
||||
if (!$util.isInteger(message.joinIndex))
|
||||
return "joinIndex: integer expected";
|
||||
return null;
|
||||
};
|
||||
|
||||
@@ -2530,6 +2548,8 @@ $root.protos = (function() {
|
||||
message.encoded = object.encoded;
|
||||
else if (typeof object.encoded === "object")
|
||||
message.encoded = new $util.LongBits(object.encoded.low >>> 0, object.encoded.high >>> 0).toNumber(true);
|
||||
if (object.joinIndex != null)
|
||||
message.joinIndex = object.joinIndex | 0;
|
||||
return message;
|
||||
};
|
||||
|
||||
@@ -2553,6 +2573,7 @@ $root.protos = (function() {
|
||||
object.encoded = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;
|
||||
} else
|
||||
object.encoded = options.longs === String ? "0" : 0;
|
||||
object.joinIndex = 0;
|
||||
}
|
||||
if (message.inputFrameId != null && message.hasOwnProperty("inputFrameId"))
|
||||
object.inputFrameId = message.inputFrameId;
|
||||
@@ -2561,6 +2582,8 @@ $root.protos = (function() {
|
||||
object.encoded = options.longs === String ? String(message.encoded) : message.encoded;
|
||||
else
|
||||
object.encoded = options.longs === String ? $util.Long.prototype.toString.call(message.encoded) : options.longs === Number ? new $util.LongBits(message.encoded.low >>> 0, message.encoded.high >>> 0).toNumber(true) : message.encoded;
|
||||
if (message.joinIndex != null && message.hasOwnProperty("joinIndex"))
|
||||
object.joinIndex = message.joinIndex;
|
||||
return object;
|
||||
};
|
||||
|
||||
@@ -3513,6 +3536,7 @@ $root.protos = (function() {
|
||||
* @property {protos.RoomDownsyncFrame|null} [rdf] WsResp rdf
|
||||
* @property {Array.<protos.InputFrameDownsync>|null} [inputFrameDownsyncBatch] WsResp inputFrameDownsyncBatch
|
||||
* @property {protos.BattleColliderInfo|null} [bciFrame] WsResp bciFrame
|
||||
* @property {number|null} [peerJoinIndex] WsResp peerJoinIndex
|
||||
*/
|
||||
|
||||
/**
|
||||
@@ -3579,6 +3603,14 @@ $root.protos = (function() {
|
||||
*/
|
||||
WsResp.prototype.bciFrame = null;
|
||||
|
||||
/**
|
||||
* WsResp peerJoinIndex.
|
||||
* @member {number} peerJoinIndex
|
||||
* @memberof protos.WsResp
|
||||
* @instance
|
||||
*/
|
||||
WsResp.prototype.peerJoinIndex = 0;
|
||||
|
||||
/**
|
||||
* Creates a new WsResp instance using the specified properties.
|
||||
* @function create
|
||||
@@ -3616,6 +3648,8 @@ $root.protos = (function() {
|
||||
$root.protos.InputFrameDownsync.encode(message.inputFrameDownsyncBatch[i], writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();
|
||||
if (message.bciFrame != null && Object.hasOwnProperty.call(message, "bciFrame"))
|
||||
$root.protos.BattleColliderInfo.encode(message.bciFrame, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim();
|
||||
if (message.peerJoinIndex != null && Object.hasOwnProperty.call(message, "peerJoinIndex"))
|
||||
writer.uint32(/* id 7, wireType 0 =*/56).int32(message.peerJoinIndex);
|
||||
return writer;
|
||||
};
|
||||
|
||||
@@ -3676,6 +3710,10 @@ $root.protos = (function() {
|
||||
message.bciFrame = $root.protos.BattleColliderInfo.decode(reader, reader.uint32());
|
||||
break;
|
||||
}
|
||||
case 7: {
|
||||
message.peerJoinIndex = reader.int32();
|
||||
break;
|
||||
}
|
||||
default:
|
||||
reader.skipType(tag & 7);
|
||||
break;
|
||||
@@ -3739,6 +3777,9 @@ $root.protos = (function() {
|
||||
if (error)
|
||||
return "bciFrame." + error;
|
||||
}
|
||||
if (message.peerJoinIndex != null && message.hasOwnProperty("peerJoinIndex"))
|
||||
if (!$util.isInteger(message.peerJoinIndex))
|
||||
return "peerJoinIndex: integer expected";
|
||||
return null;
|
||||
};
|
||||
|
||||
@@ -3780,6 +3821,8 @@ $root.protos = (function() {
|
||||
throw TypeError(".protos.WsResp.bciFrame: object expected");
|
||||
message.bciFrame = $root.protos.BattleColliderInfo.fromObject(object.bciFrame);
|
||||
}
|
||||
if (object.peerJoinIndex != null)
|
||||
message.peerJoinIndex = object.peerJoinIndex | 0;
|
||||
return message;
|
||||
};
|
||||
|
||||
@@ -3804,6 +3847,7 @@ $root.protos = (function() {
|
||||
object.act = 0;
|
||||
object.rdf = null;
|
||||
object.bciFrame = null;
|
||||
object.peerJoinIndex = 0;
|
||||
}
|
||||
if (message.ret != null && message.hasOwnProperty("ret"))
|
||||
object.ret = message.ret;
|
||||
@@ -3820,6 +3864,8 @@ $root.protos = (function() {
|
||||
}
|
||||
if (message.bciFrame != null && message.hasOwnProperty("bciFrame"))
|
||||
object.bciFrame = $root.protos.BattleColliderInfo.toObject(message.bciFrame, options);
|
||||
if (message.peerJoinIndex != null && message.hasOwnProperty("peerJoinIndex"))
|
||||
object.peerJoinIndex = message.peerJoinIndex;
|
||||
return object;
|
||||
};
|
||||
|
||||
@@ -3862,6 +3908,7 @@ $root.protos = (function() {
|
||||
* @property {number|Long|null} [unconfirmedMask] InputsBufferSnapshot unconfirmedMask
|
||||
* @property {Array.<protos.InputFrameDownsync>|null} [toSendInputFrameDownsyncs] InputsBufferSnapshot toSendInputFrameDownsyncs
|
||||
* @property {boolean|null} [shouldForceResync] InputsBufferSnapshot shouldForceResync
|
||||
* @property {number|null} [peerJoinIndex] InputsBufferSnapshot peerJoinIndex
|
||||
*/
|
||||
|
||||
/**
|
||||
@@ -3912,6 +3959,14 @@ $root.protos = (function() {
|
||||
*/
|
||||
InputsBufferSnapshot.prototype.shouldForceResync = false;
|
||||
|
||||
/**
|
||||
* InputsBufferSnapshot peerJoinIndex.
|
||||
* @member {number} peerJoinIndex
|
||||
* @memberof protos.InputsBufferSnapshot
|
||||
* @instance
|
||||
*/
|
||||
InputsBufferSnapshot.prototype.peerJoinIndex = 0;
|
||||
|
||||
/**
|
||||
* Creates a new InputsBufferSnapshot instance using the specified properties.
|
||||
* @function create
|
||||
@@ -3945,6 +4000,8 @@ $root.protos = (function() {
|
||||
$root.protos.InputFrameDownsync.encode(message.toSendInputFrameDownsyncs[i], writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
|
||||
if (message.shouldForceResync != null && Object.hasOwnProperty.call(message, "shouldForceResync"))
|
||||
writer.uint32(/* id 4, wireType 0 =*/32).bool(message.shouldForceResync);
|
||||
if (message.peerJoinIndex != null && Object.hasOwnProperty.call(message, "peerJoinIndex"))
|
||||
writer.uint32(/* id 5, wireType 0 =*/40).int32(message.peerJoinIndex);
|
||||
return writer;
|
||||
};
|
||||
|
||||
@@ -3997,6 +4054,10 @@ $root.protos = (function() {
|
||||
message.shouldForceResync = reader.bool();
|
||||
break;
|
||||
}
|
||||
case 5: {
|
||||
message.peerJoinIndex = reader.int32();
|
||||
break;
|
||||
}
|
||||
default:
|
||||
reader.skipType(tag & 7);
|
||||
break;
|
||||
@@ -4050,6 +4111,9 @@ $root.protos = (function() {
|
||||
if (message.shouldForceResync != null && message.hasOwnProperty("shouldForceResync"))
|
||||
if (typeof message.shouldForceResync !== "boolean")
|
||||
return "shouldForceResync: boolean expected";
|
||||
if (message.peerJoinIndex != null && message.hasOwnProperty("peerJoinIndex"))
|
||||
if (!$util.isInteger(message.peerJoinIndex))
|
||||
return "peerJoinIndex: integer expected";
|
||||
return null;
|
||||
};
|
||||
|
||||
@@ -4088,6 +4152,8 @@ $root.protos = (function() {
|
||||
}
|
||||
if (object.shouldForceResync != null)
|
||||
message.shouldForceResync = Boolean(object.shouldForceResync);
|
||||
if (object.peerJoinIndex != null)
|
||||
message.peerJoinIndex = object.peerJoinIndex | 0;
|
||||
return message;
|
||||
};
|
||||
|
||||
@@ -4114,6 +4180,7 @@ $root.protos = (function() {
|
||||
} else
|
||||
object.unconfirmedMask = options.longs === String ? "0" : 0;
|
||||
object.shouldForceResync = false;
|
||||
object.peerJoinIndex = 0;
|
||||
}
|
||||
if (message.refRenderFrameId != null && message.hasOwnProperty("refRenderFrameId"))
|
||||
object.refRenderFrameId = message.refRenderFrameId;
|
||||
@@ -4129,6 +4196,8 @@ $root.protos = (function() {
|
||||
}
|
||||
if (message.shouldForceResync != null && message.hasOwnProperty("shouldForceResync"))
|
||||
object.shouldForceResync = message.shouldForceResync;
|
||||
if (message.peerJoinIndex != null && message.hasOwnProperty("peerJoinIndex"))
|
||||
object.peerJoinIndex = message.peerJoinIndex;
|
||||
return object;
|
||||
};
|
||||
|
||||
|
Reference in New Issue
Block a user