コード例 #1
0
        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
            });
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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);
        }
コード例 #5
0
        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();
            }
        }
コード例 #6
0
        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
        }