protected override void Execute(List <GameEntity> entities) { LogKilledEntities(entities); switch (alivePlayersAndBotsGroup.count) { case 0: //последние игроки погибли в одном кадре matchRemover.MarkMatchAsFinished(matchId); break; case 1: //есть победитель matchRemover.MarkMatchAsFinished(matchId); break; } if (alivePlayersGroup.count == 0) { //живых игроков не осталось. остались только боты //чем закончится драка ботов неинтересно матч можно завершать log.Info("Живые игроки в матче кончились."); matchRemover.MarkMatchAsFinished(matchId); } }
protected override void Execute(List <InputEntity> entities) { log.Warn("Вызов реактивной системы для преждевременном удалении игрока из матча"); foreach (var inputEntity in entities) { var temporaryId = inputEntity.player.id; var playerEntity = gameContext.GetEntityWithPlayer(temporaryId); if (playerEntity == null || !playerEntity.hasAccount) { log.Warn($"Попытка удалить несуществующего (удалённого?) игрока из матча {nameof(temporaryId)} {temporaryId}"); } var accountId = playerEntity.account.id; log.Warn($"преждевременное удаление игрока из матча {nameof(temporaryId)} {temporaryId} {nameof(accountId)} {accountId}"); TurnIntoBot(temporaryId); SendDeathMessage(accountId, temporaryId); } if (alivePlayersGroup.count == 0) { //живых игроков не осталось. остались только боты //чем закончится драка ботов неинтересно матч можно завершать log.Info("Живые игроки в матче кончились."); matchRemover.MarkMatchAsFinished(matchId); } }
public void FinishAllMatches() { //TODO возможно lock поможет от одновременного вызова систем lock (matchRemover) { foreach (var match in matchStorage.GetAllMatches()) { matchRemover.MarkMatchAsFinished(match.matchId); } matchRemover.DeleteFinishedMatches(); } //Жду, чтобы rudp о удалении матчей точно дошли до игроков Task.Delay(1500).Wait(); }