private void _atackReport(IDbConnection connection, TmpAtackModel am) { _calcDangerLevel(UnixTime.ToTimestamp(am.DefendorPlanet.LastActive), am.BattleTime, am.DefendorPlanet); am.Battle = new BattleFleetsCalculator(am.SourceUser.Fleet, am.DefendorUser.Fleet); am.Battle.SetUnitMods(am.SourceUser.UnitMods, am.DefendorUser.UnitMods); am.BattleLog = am.Battle.Battle(am.DefendorPlanet.Turels.Level ?? 0); var status = am.BattleLog.Last().BattleResult; var isWin = status == BattleResult.AtackerWin; am.SourceUser.Report = am.Battle.Source; am.DefendorUser.Report = am.Battle.Target; am.ReportDataModel = _uReportService.AddOrUpdate(connection, new UserReportDataModel { TaskId = am.TaskItem.Id, BattleTime = am.BattleTime, //todo Сбрасывать ресурсы? Resources = MaterialResource.ConvertStorageToMaterial(am.DefendorPlanet.Resources).ConvertToInt(), RoundsLog = am.BattleLog, DefenderUserId = am.DefendorUser.User.Id, DefenderUserName = am.DefendorUser.User.Nickname, DefenderDeleteReport = !am.AtackerIsSkagry, DefenderSummaryReport = am.DefendorUser.Report, AtackerResultStatus = status, AtackerWin = isWin, AtackerUserId = am.SourceUser.User.Id, AtackerUserName = am.SourceUser.User.Nickname, AtackerSummaryReport = am.SourceUser.Report, AtackerIsSkagry = am.AtackerIsSkagry, AtackerDeleteReport = am.AtackerIsSkagry }); }
private void _atackUserVsNpc(IDbConnection connection, TmpAtackModel am) { am.SourceUser.Fleet = am.TaskItem.SourceFleet; am.SourceUser.Premium = _storeService.GetPremiumWorkModel(connection, am.SourceUser.User.Id); am.SourceUser.Mother = _motherRunner.RunUser(connection, _mothershipService.GetMother(connection, am.SourceUser.User.Id), am.SourceUser.Premium, _mothershipService, _motherJumpService); var allianceUser = _allianceService.GetAllianceUserByUserId(connection, am.SourceUser.User.Id); am.SourceUser.AllianceTech = _allianceService.GetAllianceTech(connection, allianceUser.AllianceId); am.SourceUser.UnitMods = BattleStatCalculationService.GetUnitStatsAndMods(connection, am.SourceUser.Mother, am.SourceUser.AllianceTech, _confederationService, _storeService); am.DefendorUser.Fleet = am.DefendorPlanet.Hangar; am.DefendorUser.Mother = am.Npc.NpcMother; am.DefendorUser.UnitMods = BattleStatCalculationService.CreateSkagryMods(am.Npc); _atackReport(connection, am); //atacker user win if (am.ReportDataModel.AtackerWin) { am.OnAtackerWin(connection, _gDetailPlanetService, _allianceService); //calc cc by damage am.SourceUser.Alliance = _allianceService.GetAllianceById(connection, allianceUser.AllianceId, false); am.NewTotalWinnerUserCc = _updateCc(connection, _calcCc(am.DefendorUser.Report, false), am.SourceUser); } //defendor npc win else { am.FinalizeDefendorWin(connection, _gDetailPlanetService); } am.FinalizeAtack(connection, _uTaskService); }
private void _atackNpcVsUser(IDbConnection connection, TmpAtackModel am) { //todo можно ввести зеркало с атки по деф планете для кол ва юнитов am.SourceUser.Fleet = am.TaskItem.SourceFleet.CloneDeep(); am.SourceUser.Mother = am.Npc.NpcMother; am.SourceUser.Alliance = am.Npc.NpcAlliance; am.SourceUser.UnitMods = BattleStatCalculationService.CreateSkagryMods(am.Npc); am.DefendorUser.Fleet = am.DefendorPlanet.Hangar; am.DefendorUser.Mother = _motherRunner.RunUser(connection, _mothershipService.GetMother(connection, am.DefendorUser.User.Id), am.DefendorUser.Premium, _mothershipService, _motherJumpService); am.DefendorUser.AllianceTech = _allianceService.GetAllianceTech(connection, am.DefendorPlanet.AllianceId); am.DefendorUser.UnitMods = BattleStatCalculationService.GetUnitStatsAndMods(connection, am.DefendorUser.Mother, am.DefendorUser.AllianceTech, _confederationService, _storeService); _atackReport(connection, am); //atacker npc win if (am.ReportDataModel.AtackerWin) { am.OnAtackerWin(connection, _gDetailPlanetService, _allianceService); } //defendor user win else { am.DefendorUser.Alliance = _allianceService.GetAllianceById(connection, am.DefendorUser.AllianceTech.Id, false); //calc cc by damage am.NewTotalWinnerUserCc = _updateCc(connection, _calcCc(am.SourceUser.Report, true), am.DefendorUser); am.FinalizeDefendorWin(connection, _gDetailPlanetService); } am.FinalizeAtack(connection, _uTaskService); }
private void _atackUserVsUser(IDbConnection connection, TmpAtackModel am) { am.SourceUser.Fleet = am.TaskItem.SourceFleet; am.SourceUser.Premium = _storeService.GetPremiumWorkModel(connection, am.SourceUser.User.Id); am.SourceUser.Mother = _motherRunner.RunUser(connection, _mothershipService.GetMother(connection, am.SourceUser.User.Id), am.SourceUser.Premium, _mothershipService, _motherJumpService); var sourceAllianceUser = _allianceService.GetAllianceUserByUserId(connection, am.SourceUser.User.Id); am.SourceUser.AllianceTech = _allianceService.GetAllianceTech(connection, sourceAllianceUser.AllianceId); am.SourceUser.UnitMods = BattleStatCalculationService.GetUnitStatsAndMods(connection, am.SourceUser.Mother, am.SourceUser.AllianceTech, _confederationService, _storeService); am.DefendorUser.Fleet = am.DefendorPlanet.Hangar; am.DefendorUser.Mother = _motherRunner.RunUser(connection, _mothershipService.GetMother(connection, am.DefendorUser.User.Id), am.DefendorUser.Premium, _mothershipService, _motherJumpService); am.DefendorUser.AllianceTech = _allianceService.GetAllianceTech(connection, am.DefendorPlanet.AllianceId); am.DefendorUser.UnitMods = BattleStatCalculationService.GetUnitStatsAndMods(connection, am.DefendorUser.Mother, am.DefendorUser.AllianceTech, _confederationService, _storeService); _atackReport(connection, am); //atacker win if (am.ReportDataModel.AtackerWin) { am.OnAtackerWin(connection, _gDetailPlanetService, _allianceService); am.SourceUser.Alliance = _allianceService.GetAllianceById(connection, sourceAllianceUser.AllianceId, false); var battlePvp = _calcBattlePvp(am.SourceUser.Report, am.DefendorUser.Report, am.ReportDataModel.AtackerResultStatus); am.SourceUser.Alliance.PvpRating += battlePvp; am.SourceUser.Alliance = _allianceService.AddOrUpdate(connection, am.SourceUser.Alliance); am.SourceUser.User.PvpPoint += battlePvp; am.SourceUser.User = _gameUserService.AddOrUpdate(connection, am.SourceUser.User); } //defendor win else { am.FinalizeDefendorWin(connection, _gDetailPlanetService); } am.FinalizeAtack(connection, _uTaskService); }
private void _atack(IDbConnection connection, TmpAtackModel atackModel) { //todo нет проверок на null будует блокировка если будет любое исключение if (atackModel.SourceUser.User.IsNpc) { atackModel.AtackerIsSkagry = true; _atackNpcVsUser(connection, atackModel); _npcTaskRunner.RemovePlanetFromActivatedPlanets(atackModel.TaskItem.TargetPlanetId); } else if (atackModel.DefendorUser.User.IsNpc) { _atackUserVsNpc(connection, atackModel); } else if (!atackModel.SourceUser.User.IsNpc && !atackModel.DefendorUser.User.IsNpc) { _atackUserVsUser(connection, atackModel); } else { throw new NotImplementedException(); } }
public void RunTaskItem(IDbConnection connection, int taskId) { if (taskId == 0) { return; } var taskItem = _uTaskService.GetByTaskId(connection, taskId, true); if (taskItem == null) { _demonLog.CrateAndSave("UserTaskDataModel", "TaskRunner.RunTaskItem.taskItemIsNull", new { TaskId = taskId }, taskId); return; } if (taskItem.TaskEnd) { return; } lock (_runTaskItemLocker) { var currUtcTime = DateTime.UtcNow; var curTime = UnixTime.ToTimestamp(currUtcTime); var endTime = taskItem.DateActivate + taskItem.Duration; var timers = TimerExecutor.GetTaskTimersByTaskId(taskItem.Id); if (timers.Count > 1) { _demonLog.CrateAndSave("UserTaskDataModel", "TaskRunner.RunTaskItem.multipleTimers_", new { TaskId = taskId }, taskId); return; } var timer = timers.FirstOrDefault(); if (timer == null) { var delay = endTime - curTime; if (delay > 0) { _onUserTaskCreated(delay, taskItem.Id, taskItem.SourceUserId, taskItem.TargetPlanetId); return; } } else if (!timer.InProgress || timer.IsDisposed) { return; } taskItem = _uTaskService.SetUpdateInProgress(connection, taskItem); #region Body try { var targetPlanetId = taskItem.TargetPlanetId; var targetPlanetSrc = _gDetailPlanetService.GetPlanet(connection, targetPlanetId); var defenderUser = _gameUserService.GetGameUser(connection, targetPlanetSrc.UserId); var defendorPremium = _storeService.GetPremiumWorkModel(connection, defenderUser.Id); var defendorPlanet = _planetRunner.RunSinglePlanet(connection, targetPlanetSrc, defendorPremium, _gDetailPlanetService); //result.TimeOver = true; //var user = taskItem.user; UserDataModel sourceUser = null; var npc = NpcHelper.GetNpcByName(Npc.SkagyName); if (taskItem.SourceUserId == defenderUser.Id) { taskItem.IsAtack = false; taskItem.IsTransfer = true; sourceUser = defenderUser; } else { taskItem.IsAtack = true; taskItem.IsTransfer = false; if (taskItem.SourceUserId == npc.NpcUser.Id) { sourceUser = npc.NpcUser; } else { sourceUser = _gameUserService.GetGameUser(connection, taskItem.SourceUserId); } } #region IsAtack if (taskItem.IsAtack) { var atackModel = new TmpAtackModel { TaskItem = taskItem, SourceUser = new TmpAtackItem { User = sourceUser }, DefendorUser = new TmpAtackItem { User = defenderUser, Premium = defendorPremium }, DefendorPlanet = defendorPlanet, Npc = npc, BattleTime = curTime, BattleDtTime = currUtcTime }; _atack(connection, atackModel); var ti = atackModel.TaskItem.CloneDeep(); var report = atackModel.ReportDataModel.CloneDeep(); int?newTotalWinnerUserCc = atackModel.NewTotalWinnerUserCc; Task.Factory.StartNew(() => { _uTaskService.NotyfyTaskFinished(ti, report, newTotalWinnerUserCc); }); return; } #endregion #region IsTransfer defendorPlanet.Hangar = UnitList.CalculateNewUnits(taskItem.SourceFleet, defendorPlanet.Hangar, true); _gDetailPlanetService.AddOrUpdate(connection, defendorPlanet); taskItem.TaskEnd = true; _uTaskService.UnlockUpdateInProgress(connection, taskItem.Id); var updatedTask = _uTaskService.AddOrUpdate(connection, taskItem); Task.Factory.StartNew(() => { _uTaskService.NotyfyTaskFinished(updatedTask); }); #endregion } catch (Exception e) { _demonLog.CrateAndSave("UserTaskDataModel", "TaskRunner.RunTaskItem.ExceptionTaskItemData", taskItem, taskItem.Id); _demonLog.CrateAndSave("Exception", "TaskRunner.RunTaskItem.ExceptionData", e, taskItem.Id); _uTaskService.UnlockUpdateInProgress(connection, taskItem.Id); throw; } } #endregion }