private void RollBackEntityIfNeed(GameContext context, GameContext serverContext, IMatcher <GameEntity> matcher, TakeKeyMethod takeKeyMethod, RollBackMethod rollBackMethod) { var serverEntities = new List <GameEntity>(serverContext.GetEntities(matcher)); var localEntities = new List <GameEntity>(context.GetEntities(matcher)); foreach (var serverEntity in serverEntities) { if (serverEntity.isDestroyed) { continue; } bool FindPredicate(GameEntity x) => takeKeyMethod(x) == takeKeyMethod(serverEntity); var localEntity = localEntities.Find(FindPredicate); if (localEntity == null || !CompareEntityUtility.Equals(localEntity, serverEntity, localBuffer, serverBuffer)) { localEntity = rollBackMethod(_context, localEntity, serverEntity); if (localEntity.isMover) { Debug.LogWarningFormat( $"Mover校验失败,进行覆盖 ID: {localEntity.moverID.value} curTick: {_backGameContext.tick.CurrentTick}"); } else if (localEntity.hasIce) { Debug.LogWarningFormat( $"Ice校验失败,进行覆盖 Owner:{localEntity.ice.Owner} curTick: {_backGameContext.tick.CurrentTick}"); } } localEntity.isWasSynced = true; } }
private bool SameEntices(IMatcher <GameEntity> matcher, TakeKeyMethod takeKeyMethod, GameContext backGameContext, GameContext tmpGameContext) { var serverEntices = new List <GameEntity>(backGameContext.GetEntities(matcher)); var localEntices = new List <GameEntity>(tmpGameContext.GetEntities(matcher)); foreach (var serverEntity in serverEntices) { if (serverEntity.isDestroyed) { continue; } bool FindPredicate(GameEntity x) => takeKeyMethod(x) == takeKeyMethod(serverEntity); var localEntity = localEntices.Find(FindPredicate); if (localEntity == null) { return(false); } if (!CompareEntityUtility.Equals(localEntity, serverEntity, localBuffer, serverBuffer)) { return(false); } } return(true); }