improve jitter handle and fix item pickup desync spam

This commit is contained in:
RandomityGuy 2024-05-02 13:04:12 +05:30
parent f59348808d
commit df8aca4cbe
5 changed files with 33 additions and 20 deletions

View file

@ -1293,21 +1293,25 @@ class MarbleWorld extends Scheduler {
advanceTimeState.ticks = ourLastMoveTime; advanceTimeState.ticks = ourLastMoveTime;
// if (marbleNeedsPrediction & (1 << Net.clientId) > 0) { // Only for our clients pls // if (marbleNeedsPrediction & (1 << Net.clientId) > 0) { // Only for our clients pls
// if (qm != null) { // if (qm != null) {
// var mvs = qm.powerupStates.copy(); // var mvs = qm.powerupStates.copy();
for (pw in marble.level.powerUps) { for (pw in marble.level.powerUps) {
// var val = mvs.shift(); // var val = mvs.shift();
// if (pw.lastPickUpTime != val) // if (pw.lastPickUpTime != val)
// Console.log('Revert powerup pickup: ${pw.lastPickUpTime} -> ${val}'); // Console.log('Revert powerup pickup: ${pw.lastPickUpTime} -> ${val}');
pw.lastPickUpTime = powerupPredictions.getState(pw.netIndex);
if (pw.pickupClient != -1 && marbleNeedsPrediction & (1 << pw.pickupClient) > 0)
pw.lastPickUpTime = powerupPredictions.getState(pw.netIndex);
} }
var huntMode:HuntMode = cast this.gameMode; var huntMode:HuntMode = cast this.gameMode;
if (@:privateAccess huntMode.activeGemSpawnGroup != null) { if (@:privateAccess huntMode.activeGemSpawnGroup != null) {
for (activeGem in @:privateAccess huntMode.activeGemSpawnGroup) { for (activeGem in @:privateAccess huntMode.activeGemSpawnGroup) {
huntMode.setGemHiddenStatus(activeGem, gemPredictions.getState(activeGem)); var g = @:privateAccess huntMode.gemSpawnPoints[activeGem].gem;
if (g != null && g.pickUpClient != -1 && marbleNeedsPrediction & (1 << g.pickUpClient) > 0)
huntMode.setGemHiddenStatus(activeGem, gemPredictions.getState(activeGem));
} }
} }
// } // }
// } // }
ackLag = ourQueuedMoves.length; ackLag = ourQueuedMoves.length;

View file

@ -369,6 +369,9 @@ class HuntMode extends NullMode {
@:privateAccess level.playGui.incrementPlayerScore(packet.clientId, packet.scoreIncr); @:privateAccess level.playGui.incrementPlayerScore(packet.clientId, packet.scoreIncr);
} }
if (this.level.isMultiplayer && Net.isClient) {
gem.pickUpClient = @:privateAccess marble.connection == null ? Net.clientId : @:privateAccess marble.connection.id;
}
} }
function setupGems() { function setupGems() {

View file

@ -47,7 +47,7 @@ class MoveManager {
var maxMoves = 45; var maxMoves = 45;
var serverTargetMoveListSize = 3; var serverTargetMoveListSize = 3;
var serverMaxMoveListSize = 5; var serverMaxMoveListSize = 8;
var serverAvgMoveListSize = 3.0; var serverAvgMoveListSize = 3.0;
var serverSmoothMoveAvg = 0.15; var serverSmoothMoveAvg = 0.15;
var serverMoveListSizeSlack = 1.0; var serverMoveListSizeSlack = 1.0;
@ -179,12 +179,12 @@ class MoveManager {
&& queuedMoves.length < serverTargetMoveListSize && queuedMoves.length < serverTargetMoveListSize
&& queuedMoves.length != 0) { && queuedMoves.length != 0) {
serverAvgMoveListSize = Math.max(Std.int(serverAvgMoveListSize + serverMoveListSizeSlack + 0.5), queuedMoves.length); serverAvgMoveListSize = Math.max(Std.int(serverAvgMoveListSize + serverMoveListSizeSlack + 0.5), queuedMoves.length);
serverAbnormalMoveCount++; // serverAbnormalMoveCount++;
if (serverAbnormalMoveCount > 3) { // if (serverAbnormalMoveCount > 3) {
serverTargetMoveListSize += 1; // serverTargetMoveListSize += 1;
if (serverTargetMoveListSize > serverMaxMoveListSize) // if (serverTargetMoveListSize > serverMaxMoveListSize)
serverTargetMoveListSize = serverMaxMoveListSize; // serverTargetMoveListSize = serverMaxMoveListSize;
} // }
// Send null move // Send null move
return null; return null;
} }
@ -196,14 +196,14 @@ class MoveManager {
queuedMoves.pop(); queuedMoves.pop();
} }
serverAvgMoveListSize = serverTargetMoveListSize; serverAvgMoveListSize = serverTargetMoveListSize;
serverAbnormalMoveCount++; // serverAbnormalMoveCount++;
if (serverAbnormalMoveCount > 3) { // if (serverAbnormalMoveCount > 3) {
serverTargetMoveListSize -= 1; // serverTargetMoveListSize -= 1;
if (serverTargetMoveListSize < serverDefaultMinTargetMoveListSize) // if (serverTargetMoveListSize < serverDefaultMinTargetMoveListSize)
serverTargetMoveListSize = serverDefaultMinTargetMoveListSize; // serverTargetMoveListSize = serverDefaultMinTargetMoveListSize;
} else { // } else {
serverAbnormalMoveCount = 0; // serverAbnormalMoveCount = 0;
} // }
} }
} }
if (queuedMoves.length == 0) { if (queuedMoves.length == 0) {

View file

@ -13,6 +13,7 @@ class Gem extends DtsObject {
public var pickedUp:Bool; public var pickedUp:Bool;
public var netIndex:Int; public var netIndex:Int;
public var pickUpClient:Int = -1;
var gemColor:String; var gemColor:String;
@ -76,6 +77,7 @@ class Gem extends DtsObject {
override function reset() { override function reset() {
this.pickedUp = false; this.pickedUp = false;
this.pickUpClient = -1;
this.setOpacity(1); this.setOpacity(1);
} }

View file

@ -56,6 +56,10 @@ abstract class PowerUp extends DtsObject {
pickupTicks = pickupPacket.serverTicks; pickupTicks = pickupPacket.serverTicks;
} }
if (level.isMultiplayer && Net.isClient) {
pickupClient = @:privateAccess marble.connection != null ? @:privateAccess marble.connection.id : Net.clientId;
}
this.lastPickUpTime = timeState.currentAttemptTime; this.lastPickUpTime = timeState.currentAttemptTime;
if (this.autoUse) if (this.autoUse)
this.use(marble, timeState); this.use(marble, timeState);