Пример #1
0
 public void JoinLobbyAsServer()
 {
     chosenRole = Role.Server;
     WaitSpinnerService.Enable(this);
     OnlineService.SetTargetRole(OnlineRole.Server); // connect as server
     _requestTimeoutRemaining = _specificDefinition.onlineRolePickTimeout;
 }
Пример #2
0
        public virtual void SetOnlineUser(ForumApp forum)
        {
            List <OnlineUser> results     = new List <OnlineUser>();
            List <OnlineUser> onlineUsers = OnlineService.GetAll();// Online.Instance.OnlineUsers;
            int memberCount = 0;

            foreach (OnlineUser info in onlineUsers)
            {
                if (this.isInCurrentForum(info, forum))
                {
                    results.Add(info);
                    if (info.UserId > 0)
                    {
                        memberCount++;
                    }
                }
            }

            if (results.Count > forum.OnlinePeakCount)
            {
                forum.OnlinePeakCount = results.Count;
                forum.OnlinePeakTime  = DateTime.Now;
                db.update(forum, new string[] { "OnlinePeakCount", "OnlinePeakTime" });
            }
            forum.OnlineUser        = results;
            forum.OnlineMemberCount = memberCount;
        }
        public bool DoOperationFlash(ICoreObject target, out int errorCode, out int errorServiceID, IDiagFlashJob job)
        {
            bool flag = false;

            errorCode      = 0;
            errorServiceID = 0;
            if (target != null)
            {
                IOnlineItemAccess onlineItemProxy = OnlineService.FindOnlineItemProxy(target);
                if (onlineItemProxy != null)
                {
                    try
                    {
                        onlineItemProxy.DoOperation("Flash", job);
                        flag = true;
                    }
                    catch (OnlineException ex)
                    {
                        errorCode      = ex.ErrorCode;
                        errorServiceID = ex.ErrorServiceID;
                    }
                    catch (NotSupportedException ex)
                    {
                        errorCode      = 0;
                        errorServiceID = 241;
                    }
                }
            }
            return(flag);
        }
Пример #4
0
        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            // リバースプロキシ対応
            app.UseForwardedHeaders(new ForwardedHeadersOptions
            {
                ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
            });

            app.UseStaticFiles();

            // CORSを有効にする
            app.UseCors(builder => builder
                        .WithOrigins("http://localhost:8080", "http://127.0.0.1:8080", "https://sangoku.kmycode.net", "https://sangokukmy-legacy.netlify.com")
                        .AllowAnyMethod()
                        .AllowAnyHeader()
                        .WithExposedHeaders("WWW-Authenticate"));

            // データベースの初期化
            using (var context = new MainContext())
            {
                context.Database.Migrate();
            }

            // 更新処理を開始する
            MlService.Logger = _logger;
            GameUpdater.BeginUpdate(_logger);
            OnlineService.BeginWatch(_logger);

            app.UseMvc();
        }
Пример #5
0
        public List <User> GetRecentToMakeFriends(int userId, int count, List <int> friendIds)
        {
            List <OnlineUser> all = OnlineService.GetAll();

            String ids    = "";
            int    icount = 1;

            foreach (OnlineUser info in all)
            {
                if (icount > count)
                {
                    break;
                }

                if (info.UserId > 0 && info.UserId != userId && friendIds.Contains(info.UserId) == false)
                {
                    ids += info.UserId + ",";
                    count++;
                }
            }
            ids = ids.TrimEnd(',');

            if (strUtil.IsNullOrEmpty(ids))
            {
                return(new List <User>());
            }
            return(db.find <User>("Id in (" + ids + ")").list());
        }
Пример #6
0
        IEnumerator WaitForOnlineServiceInit()
        {
            // wait for authenticating,
            // always wait 1 frame
            do
            {
                yield return(null);
            } while (!OnlineService.IsAuthenicated);

            OnSignIn?.Invoke(OnlineService);

            // authenticated, now load inventory
            OnlineService.Load();

            // wait for load
            do
            {
                yield return(null);
            } while (!OnlineService.IsLoaded);

            // load data to inventory
            DataSystem.LoadInventory(CurrentPlayer.Inventory, OnlineService.LoadedData, out lastLoadedInventoryData);

            OnGameInit?.Invoke(this);
        }
        public void CheckOnlineService()
        {
            var    settings   = new MockSettings();
            var    service    = new OnlineService();
            object result     = null;
            var    connection = new OnlineServiceConnection(settings,
                                                            () => { throw new ConnectionTimedOut(); });

            connection.Connected +=
                () => connection.Send(new LoginRequest(LoadApiKeyFromRegistry(), "LogoApp"));
            connection.DataReceived += message => result = message;
            service.Connect("CurrentUser", connection);
            Thread.Sleep(500);
            Console.WriteLine("User Name: " + service.UserName);
            CheckService(service, "LogoApp", result);
            Assert.IsFalse(service.IsDeveloper);
            bool hasProjectChanged = false;

            service.ProjectChanged += () => hasProjectChanged = true;
            service.ChangeProject("Asteroids");
            Thread.Sleep(500);
            Assert.IsTrue(hasProjectChanged);
            CheckService(service, "Asteroids", result);
            Assert.IsFalse(service.IsDeveloper);
        }
Пример #8
0
        public async Task <Result> DeleteGroup(int id)
        {
            IsBusy = true;
            var res = await OnlineService.DeleteGroupAsync(id);

            IsBusy = false;
            return(res);
        }
Пример #9
0
        private void ThreadProc_OperatorCardActivation()
        {
            try
            {
                Thread.Sleep(100);  // wait for progres bar

                if (_kiosk.Testing) // สำหรับทดสอบสร้างหน้าต่างเท่านั้น
                {
                    using (DB_Manager.CardAndCarManagement opm = new DB_Manager.CardAndCarManagement())
                    {
                        Thread.Sleep(1000);
                        string carTag = string.Empty;
                        if (!opm.GetCarTag(_kiosk.rfidReader.LastID.Replace(" ", ""), out carTag))
                        {
                            Helper.ShowNewPage(_kiosk, this, PageName.Warning_OptCarTagInfoNotFound);
                        }
                        else
                        {
                            _kiosk.CurrentCarTag = carTag;
                            using (DB_Manager.BO23TestManagement tm = new DB_Manager.BO23TestManagement())
                            { _kiosk.CurrentOnlineDSBO23 = tm.GetBO23(_kiosk.CurrentCarTag); }
                            Helper.ShowNewPage(_kiosk, this, PageName.OptBO23);
                        }
                    }
                }
                else
                {
                    using (DB_Manager.CardAndCarManagement opm = new DB_Manager.CardAndCarManagement())
                    {
                        string carTag = string.Empty;
                        if (!opm.GetCarTag(_kiosk.rfidReader.LastID.Replace(" ", ""), out carTag))
                        {
                            Helper.ShowNewPage(_kiosk, this, PageName.Warning_OptCarTagInfoNotFound);
                        }
                        else
                        {
                            _kiosk.CurrentCarTag = carTag;
                            ServiceReference1.SearchModel result;
                            if (OnlineService.SearchBO23(_kiosk.OrgCode, _kiosk.CurrentCarTag, out result))
                            {
                                _kiosk.CurrentOnlineDSBO23 = result.ds;
                                Helper.ShowNewPage(_kiosk, this, PageName.OptBO23);
                            }
                            else
                            {
                                Helper.ShowNewPage(_kiosk, this, PageName.Warning_OptCarTagInfoNotFound);
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                _kiosk.log.AppendText(ex.Message);
                System.Diagnostics.Debug.WriteLine(ex.Message);
                Helper.ShowNewPage(_kiosk, this, PageName.Error_Systematic);
            }
        }
Пример #10
0
    static IEnumerator StartServer(QuickStartSettings settings)
    {
        LoadingScreenUIController.DisplayedStatus = "Waiting for online services...";

        OnlineService.SetTargetRole(OnlineRole.Server);
        while (OnlineService.IsChangingRole ||
               OnlineService.CurrentRole != OnlineRole.Server ||
               OnlineService.ServerInterface == null)
        {
            yield return(null);
        }

        if (string.IsNullOrEmpty(settings.serverName))
        {
            LoadingScreenUIController.DisplayedStatus = "Loading...";
            GameStateManager.TransitionToState(Assets.lobbyServer);
        }
        else
        {
            // Create session

            int success = -1; // -1 -> waiting for result    0 -> failure        1 -> success

            LoadingScreenUIController.DisplayedStatus = "Creating session ...";
            OnlineService.ServerInterface.CreateSession(settings.serverName, (bool r, string message) =>
            {
                if (r)
                {
                    success = 1;
                }
                else
                {
                    success = 0;
                }
            });

            // wait for creation result
            while (success == -1)
            {
                yield return(null);
            }


            if (success == 0)
            {
                string message = "Failed server quickstart. Could not create session [" + settings.serverName + "].";
                DebugScreenMessage.DisplayMessage(message);
                Log.Error(message);
                GameStateManager.TransitionToState(Assets.rootMenu);
            }
            else
            {
                // success!
                LoadingScreenUIController.DisplayedStatus = "Loading ...";
                GameStateManager.TransitionToState(Assets.inGameServer, new GameStateParamLevelName(settings.level));
            }
        }
    }
Пример #11
0
        public ICoreObject GetOnlineObject(
            ICoreObject offlineObject,
            bool initializeState,
            OnlineCreateMode mode)
        {
            ICoreObject ico = OnlineService.GetOnlineObject(offlineObject, initializeState, mode);

            return(ico);
        }
Пример #12
0
        public async Task <Result> AddNewUser()
        {
            IsBusy = true;
            var user = new User {
                Name = "new user", Role = User.UserRole.Student, ID = 111
            };
            var res = await OnlineService.CreateUserAsync(user);

            IsBusy = false;
            return(res);
        }
Пример #13
0
        public void SolutionFilePathCanBeLoadedFromSettings()
        {
            var settings   = new FileSettings();
            var service    = new OnlineService();
            var connection = new OnlineServiceConnection(settings,
                                                         () => { throw new ConnectionTimedOut(); });

            service.Connect("CurrentUser", connection);
            service.ChangeProject("DeltaEngine.Tutorials");
            Thread.Sleep(1000);
            Assert.AreEqual(TutorialsSolutionFilePath, service.CurrentContentProjectSolutionFilePath);
        }
Пример #14
0
        public async Task <Result> GetTrainings(int userId = -1)
        {
            IsBusy = true;
            if (userId == -1)
            {
                userId = UserViewModel.Instance.User.ID;
            }
            var res = await OnlineService.GetTrainingsAsync(userId);

            IsBusy = false;
            return(res);
        }
Пример #15
0
    static IEnumerator StartLocal(QuickStartSettings settings)
    {
        LoadingScreenUIController.DisplayedStatus = "Loading...";

        OnlineService.SetTargetRole(OnlineRole.None);
        while (OnlineService.IsChangingRole ||
               OnlineService.CurrentRole != OnlineRole.None)
        {
            yield return(null);
        }

        GameStateManager.TransitionToState(Assets.inGameLocal, new GameStateParamLevelName(settings.level));
    }
Пример #16
0
		public void AbsoluteSolutionFilePathDependsOnTheSelectedContentProject()
		{
			var settings = new MockSettings();
			var service = new OnlineService();
			var connection = new OnlineServiceConnection(settings,
				() => { throw new ConnectionTimedOut(); });
			service.Connect("CurrentUser", connection);
			Assert.AreEqual("", service.CurrentContentProjectSolutionFilePath);
			service.ChangeProject("LogoApp");
			Thread.Sleep(1000);
			AssertSolutionFilePath(GetSamplesSlnPath(), service);
			service.ChangeProject("DeltaEngine.Tutorials");
			Thread.Sleep(1000);
			AssertSolutionFilePath(GetTutorialsSlnPath(), service);
		}
Пример #17
0
        public async Task <Result> AddNewGroup(string name)
        {
            if (string.IsNullOrWhiteSpace(name))
            {
                return(new Result(false, StringService.Instance.Error, StringService.Instance.NameIsRequired));
            }
            IsBusy = true;
            var group = new Group {
                Name = name, TeacherID = user.ID
            };
            var res = await OnlineService.AddGroupAsync(group);

            IsBusy = false;
            return(res);
        }
Пример #18
0
        public void AbsoluteSolutionFilePathDependsOnTheSelectedContentProject()
        {
            var settings   = new MockSettings();
            var service    = new OnlineService();
            var connection = new OnlineServiceConnection(settings,
                                                         () => { throw new ConnectionTimedOut(); });

            service.Connect("CurrentUser", connection);
            Assert.AreEqual("", service.CurrentContentProjectSolutionFilePath);
            service.ChangeProject("LogoApp");
            Thread.Sleep(1000);
            AssertSolutionFilePath(GetSamplesSlnPath(), service);
            service.ChangeProject("DeltaEngine.Tutorials");
            Thread.Sleep(1000);
            AssertSolutionFilePath(GetTutorialsSlnPath(), service);
        }
Пример #19
0
        public void SolutionFilePathIsStoredInSettingsFileWithProjectName()
        {
            var settings   = new FileSettings();
            var service    = new OnlineService();
            var connection = new OnlineServiceConnection(settings,
                                                         () => { throw new ConnectionTimedOut(); });

            service.Connect("CurrentUser", connection);
            service.ChangeProject("DeltaEngine.Tutorials");
            Thread.Sleep(1000);
            service.CurrentContentProjectSolutionFilePath = TutorialsSolutionFilePath;
            var projects = Settings.Current.GetValue("ContentProjects", new Dictionary <string, string>());

            Assert.GreaterOrEqual(projects.Count, 1);
            settings.Save();
        }
Пример #20
0
        public async Task SetStatusAsync(
            [FromRoute] string status = null)
        {
            var s = status == "active" ? OnlineStatus.Active : status == "inactive" ? OnlineStatus.Inactive : OnlineStatus.Offline;

            if (s == OnlineStatus.Offline)
            {
                ErrorCode.InvalidParameterError.Throw();
            }

            using (var repo = MainRepository.WithRead())
            {
                var chara = await repo.Character.GetByIdAsync(this.AuthData.CharacterId).GetOrErrorAsync(ErrorCode.CharacterNotFoundError);

                await OnlineService.SetAsync(chara, s);
            }
        }
Пример #21
0
        public async Task <Result> AddFeedback(string feedbackValue)
        {
            if (string.IsNullOrWhiteSpace(feedbackValue))
            {
                return(new Result(false, StringService.Instance.Error, StringService.Instance.NameIsRequired));
            }
            IsBusy = true;
            var feedback = new Feedback {
                Date        = DateTime.Today,
                Description = feedbackValue,
                StudentID   = currentStudent.ID
            };
            var res = await OnlineService.AddFeedbackAsync(feedback);

            IsBusy = false;
            return(res);
        }
Пример #22
0
        void ProcessPlayerDeath(GameScore score)
        {
            State = GameState.Menu;

            OnScoreSet?.Invoke(score, Inventory.PlayerStats.Score_Best);

            // add money
            CurrentPlayer.Inventory.Money += score.Money;

            OnlineService?.ReportProgress(GPGSIds.leaderboard_score, score.ActualScorePoints);
            OnlineService?.ReportProgress(GPGSIds.leaderboard_cash, score.Money);

            UpdateScoreAchievements();

            // scale down time
            StartCoroutine(WaitForGameEnd());

            OnPlayerDeath?.Invoke(CurrentPlayer);
        }
Пример #23
0
        public void OnlineAll()
        {
            ctx.Page.Title = "所有在线用户";

            DataPage <OnlineUser> users = DataPage <OnlineUser> .GetPage(OnlineService.GetAll(), 70); // 已排序

            set("onlineCount", users.RecordCount);

            IBlock block = getBlock("onlines");

            foreach (OnlineUser user in users.Results)
            {
                bindUserSingle(block, user);

                block.Next();
            }


            set("page", users.PageBar);
        }
Пример #24
0
        public void OnlineUser()
        {
            ctx.Page.Title = lang("onlineUsers");

            DataPage <OnlineUser> users = DataPage <OnlineUser> .GetPage(OnlineService.GetLoggerUser(), 70);

            bindOnlineInfos(users.Results);

            int userCount  = users.RecordCount;
            int totalCount = OnlineService.GetAll().Count;
            int guestCount = totalCount - userCount;

            set("userCount", userCount);
            set("totalCount", totalCount);
            set("guestCount", guestCount);

            set("allOnlinLink", to(OnlineAll));

            set("page", users.PageBar);
        }
Пример #25
0
        public void OnlineAll()
        {
            WebUtils.pageTitle(this, "所有在线用户");

            //DataPage<OnlineUser> users = cdb.findPage<OnlineUser>( 70 ); // 此处未排序
            DataPage <OnlineUser> users = DataPage <OnlineUser> .GetPage(OnlineService.GetAll(), 70); // 已排序

            set("onlineCount", users.RecordCount);

            IBlock block = getBlock("onlines");

            foreach (OnlineUser user in users.Results)
            {
                String lblValue = "【" + lang("ipAddress") + "】" + user.Ip +
                                  "\n【" + lang("osInfo") + "】" + user.Agent +
                                  "\n【" + lang("startTime") + "】" + user.StartTime.ToString() +
                                  "\n【" + lang("lastActive") + "】" + user.LastActive.ToString() +
                                  "\n【" + lang("clocation") + "】" + user.Location;


                if (user.UserId > 0)
                {
                    block.Set("u.Name", user.UserName);
                    block.Set("u.Face", user.UserPicUrl);
                    block.Set("u.Link", user.UserUrl);
                }
                else
                {
                    block.Set("u.Name", UserFactory.Guest.Name);
                    block.Set("u.Face", UserFactory.Guest.PicSmall);
                    block.Set("u.Link", "javascript:;");
                }

                block.Set("u.Info", lblValue);

                block.Next();
            }


            set("page", users.PageBar);
        }
Пример #26
0
        private void ThreadProc_CarTagChecking()
        {
            try
            {
                Thread.Sleep(100); // wait for progres bar
                ServiceReference1.SearchModel result;
                if (OnlineService.SearchBO23(_kiosk.OrgCode, _kiosk.CurrentCarTag, out result))
                {
                    _kiosk.CurrentOnlineDSBO23 = result.ds;
                    Helper.ShowNewPage(_kiosk, this, PageName.OptBO23);
                }
                else
                {
                    if (_kiosk.Testing) // สำหรับทดสอบสร้างหน้าต่างเท่านั้น
                    {
                        using (DB_Manager.BO23TestManagement tm = new DB_Manager.BO23TestManagement())
                        { _kiosk.CurrentOnlineDSBO23 = tm.GetBO23(_kiosk.CurrentCarTag); }
                        Helper.ShowNewPage(_kiosk, this, PageName.OptBO23);
                        return;
                    }
                    else
                    {
                        Helper.ShowNewPage(_kiosk, this, PageName.Warning_OptCarTagInfoNotFound);
                    }
                }
            }
            catch (Exception ex)
            {
                if (_kiosk.Testing) // สำหรับทดสอบสร้างหน้าต่างเท่านั้น
                {
                    using (DB_Manager.BO23TestManagement tm = new DB_Manager.BO23TestManagement())
                    { _kiosk.CurrentOnlineDSBO23 = tm.GetBO23(_kiosk.CurrentCarTag); }
                    Helper.ShowNewPage(_kiosk, this, PageName.OptBO23);
                    return;
                }

                _kiosk.log.AppendText(ex.Message);
                System.Diagnostics.Debug.WriteLine(ex.Message);
                Helper.ShowNewPage(_kiosk, this, PageName.Error_Systematic);
            }
        }
Пример #27
0
		public void CheckOnlineService()
		{
			var settings = new MockSettings();
			var service = new OnlineService();
			object result = null;
			var connection = new OnlineServiceConnection(settings,
				() => { throw new ConnectionTimedOut(); });
			connection.Connected +=
				() => connection.Send(new LoginRequest(LoadApiKeyFromRegistry(), "LogoApp"));
			connection.DataReceived += message => result = message;
			service.Connect("CurrentUser", connection);
			Thread.Sleep(500);
			Console.WriteLine("User Name: " + service.UserName);
			CheckService(service, "LogoApp", result);
			Assert.IsFalse(service.IsDeveloper);
			bool hasProjectChanged = false;
			service.ProjectChanged += () => hasProjectChanged = true;
			service.ChangeProject("Asteroids");
			Thread.Sleep(500);
			Assert.IsTrue(hasProjectChanged);
			CheckService(service, "Asteroids", result);
			Assert.IsFalse(service.IsDeveloper);
		}
Пример #28
0
        void InitSystems()
        {
            SettingsInitializer.Init(SettingsSystem, Settings, audioManager, audioSettingsHandler, timeController);

            InitPlayer();

            // inventory is loaded, init shop system
            Shop.Init(Inventory);

            // all systems initialized, sign up to events
            SignToEvents();

            // at last, init object and particle pools
            InitPools();

            if (OnlineService != null)
            {
                OnlineService.Activate();
                OnlineService.SignIn();

                StartCoroutine(WaitForOnlineServiceInit());
            }
        }
Пример #29
0
 private void btnSave_Click(object sender, RoutedEventArgs e)
 {
     try
     {
         if (OnlineService.SearchCarTag(txtCarTag.Text))
         {
             using (DB_Manager.CardAndCarManagement ccm = new DB_Manager.CardAndCarManagement())
             {
                 DataTable dt;
                 dt = DB_Manager.CardAndCarManagement.FormatDataTable();
                 DataRow dr = dt.NewRow();
                 dt.Rows.Add(dr);
                 dt.Rows[0]["RFIDCode"]       = txtRFID.Text;
                 dt.Rows[0]["CarTag"]         = txtCarTag.Text;
                 dt.Rows[0]["CarDescription"] = "-";
                 try { dt.Rows[0]["ExpiryDate"] = dpExpireDate.SelectedDate; }
                 catch { }
                 dt.Rows[0]["IsActive"] = "ACTIVE";
                 dt.Rows[0]["Comment"]  = "-";
                 int    resCode;
                 string resDesc;
                 ccm.Insert(dt.Rows[0], out resCode, out resDesc);
             }
         }
         else
         {
             _kiosk.log.AppendText("SearchCarTag:" + txtCarTag.Text + " false.");
             System.Diagnostics.Debug.WriteLine("SearchCarTag:" + txtCarTag.Text + " false.");
         }
     }
     catch (Exception ex)
     {
         _kiosk.log.AppendText(ex.Message);
         System.Diagnostics.Debug.WriteLine(ex.Message);
     }
 }
Пример #30
0
		public void SolutionFilePathCanBeLoadedFromSettings()
		{
			var settings = new FileSettings();
			var service = new OnlineService();
			var connection = new OnlineServiceConnection(settings,
				() => { throw new ConnectionTimedOut(); });
			service.Connect("CurrentUser", connection);
			service.ChangeProject("DeltaEngine.Tutorials");
			Thread.Sleep(1000);
			Assert.AreEqual(TutorialsSolutionFilePath, service.CurrentContentProjectSolutionFilePath);
		}
Пример #31
0
		private static void CheckService(OnlineService service, string projectName, object message)
		{
			Assert.AreEqual(projectName, service.ProjectName);
			Assert.AreNotEqual(ProjectPermissions.None, service.Permissions);
			Assert.IsInstanceOf<SetProject>(message);
		}
Пример #32
0
 private static void CheckService(OnlineService service, string projectName, object message)
 {
     Assert.AreEqual(projectName, service.ProjectName);
     Assert.AreNotEqual(ProjectPermissions.None, service.Permissions);
     Assert.IsInstanceOf <SetProject>(message);
 }
Пример #33
0
		public void SolutionFilePathIsStoredInSettingsFileWithProjectName()
		{
			var settings = new FileSettings();
			var service = new OnlineService();
			var connection = new OnlineServiceConnection(settings,
				() => { throw new ConnectionTimedOut(); });
			service.Connect("CurrentUser", connection);
			service.ChangeProject("DeltaEngine.Tutorials");
			Thread.Sleep(1000);
			service.CurrentContentProjectSolutionFilePath = TutorialsSolutionFilePath;
			var projects = Settings.Current.GetValue("ContentProjects", new Dictionary<string, string>());
			Assert.GreaterOrEqual(projects.Count, 1);
			settings.Save();
		}
Пример #34
0
 private void Shop_OnAmmoBuy(AmmunitionType index, int price)
 {
     OnlineService?.ReportProgress(GPGSIds.achievement_first_purchase, 100);
 }
Пример #35
0
 void UpdateScoreAchievements()
 {
     OnlineService?.ReportProgress(GPGSIds.achievement_ten_thoudsand, Inventory.PlayerStats.Combat_TotalShots);
 }