diff --git a/.efrocachemap b/.efrocachemap index 3e26e234..5f5cc3f9 100644 --- a/.efrocachemap +++ b/.efrocachemap @@ -420,10 +420,10 @@ "assets/build/ba_data/audio/zoeOw.ogg": "https://files.ballistica.net/cache/ba1/60/ad/38269b7f1c7dc20cb9a506cd0681", "assets/build/ba_data/audio/zoePickup01.ogg": "https://files.ballistica.net/cache/ba1/72/85/d6fc4d16b7081d91fba2850b5b10", "assets/build/ba_data/audio/zoeScream01.ogg": "https://files.ballistica.net/cache/ba1/e9/ae/1d674d0c086eaa0bd1c3b1db0505", - "assets/build/ba_data/data/langdata.json": "https://files.ballistica.net/cache/ba1/9b/ec/d11f3e0238ff648bce3657fe5d50", + "assets/build/ba_data/data/langdata.json": "https://files.ballistica.net/cache/ba1/95/9e/acc4a6b7b5cd457e4756ee399eb5", "assets/build/ba_data/data/languages/arabic.json": "https://files.ballistica.net/cache/ba1/92/43/36b34307575f6d6219bdf4898e18", "assets/build/ba_data/data/languages/belarussian.json": "https://files.ballistica.net/cache/ba1/61/03/89070ca765e06da3a419a579f503", - "assets/build/ba_data/data/languages/chinese.json": "https://files.ballistica.net/cache/ba1/96/96/1390940b8457b477113194acbb41", + "assets/build/ba_data/data/languages/chinese.json": "https://files.ballistica.net/cache/ba1/f5/32/293ca14171b8e7e7d38f377e87fb", "assets/build/ba_data/data/languages/chinesetraditional.json": "https://files.ballistica.net/cache/ba1/f7/b0/191439142c6d6da4a056edc98b38", "assets/build/ba_data/data/languages/croatian.json": "https://files.ballistica.net/cache/ba1/c9/73/01a1343af814131b1ee96af0b687", "assets/build/ba_data/data/languages/czech.json": "https://files.ballistica.net/cache/ba1/4e/8c/72ddb584856a15dfb11df95f9283", @@ -443,17 +443,17 @@ "assets/build/ba_data/data/languages/korean.json": "https://files.ballistica.net/cache/ba1/32/97/4c61425d7c200a5c4c9ae3a94a0e", "assets/build/ba_data/data/languages/malay.json": "https://files.ballistica.net/cache/ba1/b4/02/f686ce008312e74d5953a511c8b2", "assets/build/ba_data/data/languages/persian.json": "https://files.ballistica.net/cache/ba1/70/07/7864c07c7177dd751780ccc85b34", - "assets/build/ba_data/data/languages/polish.json": "https://files.ballistica.net/cache/ba1/38/31/fd930431c7612d0ab0e73e6bc74f", - "assets/build/ba_data/data/languages/portuguese.json": "https://files.ballistica.net/cache/ba1/cb/96/86bb139f20e126593f7fdba9e9e1", + "assets/build/ba_data/data/languages/polish.json": "https://files.ballistica.net/cache/ba1/83/71/27beb2a7a9d7036e142d48278888", + "assets/build/ba_data/data/languages/portuguese.json": "https://files.ballistica.net/cache/ba1/e3/e5/9bc33069464b08ba7ad6712de4be", "assets/build/ba_data/data/languages/romanian.json": "https://files.ballistica.net/cache/ba1/d7/06/9d70642d0a4d1e3b1c2149d7a17c", "assets/build/ba_data/data/languages/russian.json": "https://files.ballistica.net/cache/ba1/6c/62/06869ed55a656b6e51b4d22e6fa8", "assets/build/ba_data/data/languages/serbian.json": "https://files.ballistica.net/cache/ba1/4e/91/6f2a9a3ce733908e91377a6ddb9a", "assets/build/ba_data/data/languages/slovak.json": "https://files.ballistica.net/cache/ba1/20/a9/163d189884edf802636bf291e432", - "assets/build/ba_data/data/languages/spanish.json": "https://files.ballistica.net/cache/ba1/0b/21/a4d09ca1fea8bbf347ed7091c8a2", + "assets/build/ba_data/data/languages/spanish.json": "https://files.ballistica.net/cache/ba1/03/a9/0dad2892ceb7fded276235c4576a", "assets/build/ba_data/data/languages/swedish.json": "https://files.ballistica.net/cache/ba1/3b/9f/d40c1423d260784970fd7364ca30", "assets/build/ba_data/data/languages/tamil.json": "https://files.ballistica.net/cache/ba1/3d/83/e1bb0a664d1c14c41b1a083acf0d", "assets/build/ba_data/data/languages/thai.json": "https://files.ballistica.net/cache/ba1/d6/16/523c643358880b03b233ed88e557", - "assets/build/ba_data/data/languages/turkish.json": "https://files.ballistica.net/cache/ba1/63/c8/6cfbfd6702c80aa9df490e4629d7", + "assets/build/ba_data/data/languages/turkish.json": "https://files.ballistica.net/cache/ba1/4b/28/b62e4c928ee4ddb4120303cc5f62", "assets/build/ba_data/data/languages/ukrainian.json": "https://files.ballistica.net/cache/ba1/3e/b6/052f1faed0264bf7135feb5c4cc3", "assets/build/ba_data/data/languages/venetian.json": "https://files.ballistica.net/cache/ba1/a6/ed/416638d46950c9ab4f6155b9c334", "assets/build/ba_data/data/languages/vietnamese.json": "https://files.ballistica.net/cache/ba1/1f/ae/abe3f105b3c4b51f6b7942773305", @@ -4008,26 +4008,26 @@ "assets/src/ba_data/python/ba/_generated/__init__.py": "https://files.ballistica.net/cache/ba1/ee/e8/cad05aa531c7faf7ff7b96db7f6e", "assets/src/ba_data/python/ba/_generated/enums.py": "https://files.ballistica.net/cache/ba1/1c/77/ac670a5118abdf8a7687af0e159b", "ballisticacore-windows/Generic/BallisticaCore.ico": "https://files.ballistica.net/cache/ba1/89/c0/e32c7d2a35dc9aef57cc73b0911a", - "build/prefab/full/linux_arm64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/70/b7/3a20b7191d324711434f30fd9b02", - "build/prefab/full/linux_arm64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/06/97/a3e4cc8402d604a2fc162bf5e6d6", - "build/prefab/full/linux_arm64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/fb/2f/42d0109886a121a7afc5d39fefa2", - "build/prefab/full/linux_arm64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/7b/89/5dfaee14cdb96d023556e6bfb400", - "build/prefab/full/linux_x86_64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/04/fa/752e4447eba1ad78bda278d0f5b0", - "build/prefab/full/linux_x86_64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/5e/eb/a505aa3a5a64aaa121648cde5ef2", - "build/prefab/full/linux_x86_64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/01/b6/f4d23b0f064245f44baa111f7275", - "build/prefab/full/linux_x86_64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/9a/f5/a82d1fc4b5feaee3262c65afba92", - "build/prefab/full/mac_arm64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/a8/cd/0fe7195e99c956a4ec2021fa1706", - "build/prefab/full/mac_arm64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/02/81/5d11c0e3406184a7f34155efef9a", - "build/prefab/full/mac_arm64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/b1/cb/c74fc5c22e94d7ddbe103d267d95", - "build/prefab/full/mac_arm64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/6c/16/b3321c2d7f201c0292e78b765415", - "build/prefab/full/mac_x86_64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/51/7f/d82ef0ecf2ff3c385d9a6384c1b5", - "build/prefab/full/mac_x86_64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/ef/2d/2f1ed47bd3b0fc402ebf55f0749b", - "build/prefab/full/mac_x86_64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/ef/7e/c0c486eccf17619be6a8fc3b0a18", - "build/prefab/full/mac_x86_64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/e6/e4/93021ae27bb96d34f8d6e6a6b7e3", - "build/prefab/full/windows_x86_gui/debug/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/54/e1/fdb3d600adc946d8d0995b68ddea", - "build/prefab/full/windows_x86_gui/release/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/4c/0e/5d3cf72812c890870ef95365f47e", - "build/prefab/full/windows_x86_server/debug/dist/BallisticaCoreHeadless.exe": "https://files.ballistica.net/cache/ba1/d0/82/8feea3b851f2039445032af42386", - "build/prefab/full/windows_x86_server/release/dist/BallisticaCoreHeadless.exe": "https://files.ballistica.net/cache/ba1/1e/49/c5f7b924a1952633b9b3c80bec8a", + "build/prefab/full/linux_arm64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/8c/ba/e3fed2ce4cee676e9e9f33071661", + "build/prefab/full/linux_arm64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/53/2d/036a8e5802ba3b302803831dd5c2", + "build/prefab/full/linux_arm64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/a5/35/bb43a9c30ced38c754ac16857b64", + "build/prefab/full/linux_arm64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/5b/c9/1a742859dec04635826c66171892", + "build/prefab/full/linux_x86_64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/56/8b/1d95aba7586a0ad21b9507cac404", + "build/prefab/full/linux_x86_64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/a2/cf/6eee63abf3c21d7a73ac5cf85a63", + "build/prefab/full/linux_x86_64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/bc/6b/39c82a58c924b6d8a2e2e5ce5e06", + "build/prefab/full/linux_x86_64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/d1/79/cbe53392837c8bcef76bb8e61c49", + "build/prefab/full/mac_arm64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/9a/fd/61e4a477d5c444f25dcf1caad24b", + "build/prefab/full/mac_arm64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/d6/93/a7d6d7e042c27d5a0e6482fc078e", + "build/prefab/full/mac_arm64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/65/03/fe128d70d565a3d3d41b31ed843d", + "build/prefab/full/mac_arm64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/a4/61/8fa37aad1a0690fbff373c4028ae", + "build/prefab/full/mac_x86_64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/4e/90/e8a2fdf75bb4450e7ba7e2a4339b", + "build/prefab/full/mac_x86_64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/07/d5/28b51d35fde79940ae364b5734c5", + "build/prefab/full/mac_x86_64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/0d/88/f5012674b1418dc9453fdcd32433", + "build/prefab/full/mac_x86_64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/ca/2a/43bb057c80d37fa6ce833bfab9c9", + "build/prefab/full/windows_x86_gui/debug/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/0c/35/1431c88890c0a4150ed15aa39f08", + "build/prefab/full/windows_x86_gui/release/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/6c/26/b290f9ae9979a5036b7f29d8d67c", + "build/prefab/full/windows_x86_server/debug/dist/BallisticaCoreHeadless.exe": "https://files.ballistica.net/cache/ba1/db/e1/1e7210e97930a6c5e606cbc8ef33", + "build/prefab/full/windows_x86_server/release/dist/BallisticaCoreHeadless.exe": "https://files.ballistica.net/cache/ba1/36/c6/8eadaeb0f5b7d96e020f9d09c190", "build/prefab/lib/linux_arm64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/cb/3b/83e6150eebf4fa7b5e8a7b863219", "build/prefab/lib/linux_arm64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/44/70/2878a73f2d55849cd6a75e401575", "build/prefab/lib/linux_arm64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/24/49/4baca475df5c7f87e6ed17d46696", @@ -4044,14 +4044,14 @@ "build/prefab/lib/mac_x86_64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/b2/ee/b908410d85c763d5bca09a3bc893", "build/prefab/lib/mac_x86_64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/fd/24/8c51e5752064d4b487dff42a7ffa", "build/prefab/lib/mac_x86_64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/93/c6/40e9e47dd33c88646510212ff321", - "build/prefab/lib/windows/Debug_Win32/BallisticaCoreGenericInternal.lib": "https://files.ballistica.net/cache/ba1/ef/a2/14e74872b374012688990c193535", - "build/prefab/lib/windows/Debug_Win32/BallisticaCoreGenericInternal.pdb": "https://files.ballistica.net/cache/ba1/ef/f3/e7b36179c280d0a4c66e08992119", - "build/prefab/lib/windows/Debug_Win32/BallisticaCoreHeadlessInternal.lib": "https://files.ballistica.net/cache/ba1/20/a2/0bdab30629cb762ef6cf3dd044c1", - "build/prefab/lib/windows/Debug_Win32/BallisticaCoreHeadlessInternal.pdb": "https://files.ballistica.net/cache/ba1/bc/67/2c0feb94abe56912519b420f2f8e", - "build/prefab/lib/windows/Release_Win32/BallisticaCoreGenericInternal.lib": "https://files.ballistica.net/cache/ba1/8c/e8/7944feddd9ed00e1b27a81319681", - "build/prefab/lib/windows/Release_Win32/BallisticaCoreGenericInternal.pdb": "https://files.ballistica.net/cache/ba1/b7/97/90305c2ed5347c4e88faf4b61066", - "build/prefab/lib/windows/Release_Win32/BallisticaCoreHeadlessInternal.lib": "https://files.ballistica.net/cache/ba1/66/46/f6247f24e169407f0f4dd38f938f", - "build/prefab/lib/windows/Release_Win32/BallisticaCoreHeadlessInternal.pdb": "https://files.ballistica.net/cache/ba1/fa/b2/e1531030804f539d1ad173c0ce4a", + "build/prefab/lib/windows/Debug_Win32/BallisticaCoreGenericInternal.lib": "https://files.ballistica.net/cache/ba1/55/f8/b524f3c1e9b46be1174943e6d002", + "build/prefab/lib/windows/Debug_Win32/BallisticaCoreGenericInternal.pdb": "https://files.ballistica.net/cache/ba1/66/dd/c62b06140a9f57679f49e73bd7ad", + "build/prefab/lib/windows/Debug_Win32/BallisticaCoreHeadlessInternal.lib": "https://files.ballistica.net/cache/ba1/84/19/12a6ea442e0a512f1a70aeaf8088", + "build/prefab/lib/windows/Debug_Win32/BallisticaCoreHeadlessInternal.pdb": "https://files.ballistica.net/cache/ba1/3d/7e/269c583db498f613266e0b248fb0", + "build/prefab/lib/windows/Release_Win32/BallisticaCoreGenericInternal.lib": "https://files.ballistica.net/cache/ba1/2d/ba/a09314ca4a238b58c79f481b4bf1", + "build/prefab/lib/windows/Release_Win32/BallisticaCoreGenericInternal.pdb": "https://files.ballistica.net/cache/ba1/2b/5f/4ff300c943e2d218e66ea98fc159", + "build/prefab/lib/windows/Release_Win32/BallisticaCoreHeadlessInternal.lib": "https://files.ballistica.net/cache/ba1/32/0a/f5586c9a6bf15ea5ed63d6775347", + "build/prefab/lib/windows/Release_Win32/BallisticaCoreHeadlessInternal.pdb": "https://files.ballistica.net/cache/ba1/49/88/abf208e619fd9d61e521e367ac32", "src/ballistica/generated/python_embedded/binding.inc": "https://files.ballistica.net/cache/ba1/23/ce/68396b1b7ec6d2f8425902148140", "src/ballistica/generated/python_embedded/bootstrap.inc": "https://files.ballistica.net/cache/ba1/2d/4f/f4fe67827f36cd59cd5193333a02", "src/ballistica/generated/python_embedded/bootstrap_monolithic.inc": "https://files.ballistica.net/cache/ba1/ef/c1/aa5f1aa10af89f5c0b1e616355fd" diff --git a/CHANGELOG.md b/CHANGELOG.md index 773edb2d..b1479096 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,10 @@ -### 1.7.19 (build 20993, api 7, 2023-01-17) +### 1.7.19 (build 20995, api 7, 2023-01-18) - Fixes an issue where repeated curses could use incorrect countdown times (Thanks EraOSBeta!). - Last manual party connect port is now saved. Previously, it always assumed the port to be 43210 (Thanks ritiek!). - Added a plugin-settings window under the plugins UI for enabling/disabling, and setting whether plugins are auto-enabled (Thanks vishal332008!). - Missing maps are now cleanly filtered out of playlists instead of causing errors/hangs (Thanks imayushsaini!). +- Added in-game-ping option under advanced settings (Thanks imayushsaini!). +- `BA_DEVICE_NAME` environment variable can now be used to change the name the local device shows up as. Handy if running multiple servers so you can tell them apart in cloud-console/etc. (Thanks imayushsaini!). ### 1.7.18 (build 20989, api 7, 2023-01-16) - Reworked some low level asynchronous messaging functionality in efro.message and efro.rpc. Previously these were a little *too* asynchronous which could lead to messages being received in a different order than they were sent, which is not desirable. diff --git a/assets/src/ba_data/python/ba/_bootstrap.py b/assets/src/ba_data/python/ba/_bootstrap.py index 48f599b4..6f2ad232 100644 --- a/assets/src/ba_data/python/ba/_bootstrap.py +++ b/assets/src/ba_data/python/ba/_bootstrap.py @@ -47,7 +47,7 @@ def bootstrap() -> None: # Give a soft warning if we're being used with a different binary # version than we expect. - expected_build = 20993 + expected_build = 20995 running_build: int = env['build_number'] if running_build != expected_build: print( diff --git a/assets/src/ba_data/python/ba/_playlist.py b/assets/src/ba_data/python/ba/_playlist.py index fc26a912..f489f6f0 100644 --- a/assets/src/ba_data/python/ba/_playlist.py +++ b/assets/src/ba_data/python/ba/_playlist.py @@ -192,9 +192,8 @@ def filter_playlist( 'Import failed while scanning playlist \'%s\': %s', name, exc ) except Exception: - from ba import _error + logging.exception('Error in filter_playlist.') - _error.print_exception() return goodlist diff --git a/assets/src/ba_data/python/bastd/ui/settings/advanced.py b/assets/src/ba_data/python/bastd/ui/settings/advanced.py index e5018c92..65ea7085 100644 --- a/assets/src/ba_data/python/bastd/ui/settings/advanced.py +++ b/assets/src/ba_data/python/bastd/ui/settings/advanced.py @@ -134,7 +134,7 @@ class AdvancedSettingsWindow(ba.Window): parent=self._root_widget, position=(0, self._height - 52), size=(self._width, 25), - text=ba.Lstr(resource=self._r + '.titleText'), + text=ba.Lstr(resource=f'{self._r}.titleText'), color=app.ui.title_color, h_align='center', v_align='top', @@ -203,10 +203,10 @@ class AdvancedSettingsWindow(ba.Window): text='' if ba.app.lang.language == 'Test' else ba.Lstr( - resource=self._r + '.translationNoUpdateNeededText' + resource=f'{self._r}.translationNoUpdateNeededText' ) if up_to_date - else ba.Lstr(resource=self._r + '.translationUpdateNeededText'), + else ba.Lstr(resource=f'{self._r}.translationUpdateNeededText'), color=(0.2, 1.0, 0.2, 0.8) if up_to_date else (1.0, 0.2, 0.2, 0.8), @@ -214,10 +214,10 @@ class AdvancedSettingsWindow(ba.Window): else: ba.textwidget( edit=self._lang_status_text, - text=ba.Lstr(resource=self._r + '.translationFetchErrorText') + text=ba.Lstr(resource=f'{self._r}.translationFetchErrorText') if self._complete_langs_error else ba.Lstr( - resource=self._r + '.translationFetchingStatusText' + resource=f'{self._r}.translationFetchingStatusText' ), color=(1.0, 0.5, 0.2) if self._complete_langs_error @@ -267,7 +267,7 @@ class AdvancedSettingsWindow(ba.Window): ) ba.textwidget( - edit=self._title_text, text=ba.Lstr(resource=self._r + '.titleText') + edit=self._title_text, text=ba.Lstr(resource=f'{self._r}.titleText') ) this_button_width = 410 @@ -277,7 +277,7 @@ class AdvancedSettingsWindow(ba.Window): position=(self._sub_width / 2 - this_button_width / 2, v - 14), size=(this_button_width, 60), autoselect=True, - label=ba.Lstr(resource=self._r + '.enterPromoCodeText'), + label=ba.Lstr(resource=f'{self._r}.enterPromoCodeText'), text_scale=1.0, on_activate_call=self._on_promo_code_press, ) @@ -293,7 +293,7 @@ class AdvancedSettingsWindow(ba.Window): parent=self._subcontainer, position=(200, v + 10), size=(0, 0), - text=ba.Lstr(resource=self._r + '.languageText'), + text=ba.Lstr(resource=f'{self._r}.languageText'), maxwidth=150, scale=0.95, color=ba.app.ui.title_color, @@ -371,7 +371,7 @@ class AdvancedSettingsWindow(ba.Window): position=(self._sub_width * 0.5, v + 10), size=(0, 0), text=ba.Lstr( - resource=self._r + '.helpTranslateText', + resource=f'{self._r}.helpTranslateText', subs=[('${APP_NAME}', ba.Lstr(resource='titleText'))], ), maxwidth=self._sub_width * 0.9, @@ -389,7 +389,7 @@ class AdvancedSettingsWindow(ba.Window): position=(self._sub_width / 2 - this_button_width / 2, v - 24), size=(this_button_width, 60), label=ba.Lstr( - resource=self._r + '.translationEditorButtonText', + resource=f'{self._r}.translationEditorButtonText', subs=[('${APP_NAME}', ba.Lstr(resource='titleText'))], ), autoselect=True, @@ -422,7 +422,7 @@ class AdvancedSettingsWindow(ba.Window): maxwidth=430, textcolor=(0.8, 0.8, 0.8), value=lang_inform, - text=ba.Lstr(resource=self._r + '.translationInformMe'), + text=ba.Lstr(resource=f'{self._r}.translationInformMe'), on_value_change_call=ba.WeakCall(self._on_lang_inform_value_change), ) @@ -439,7 +439,7 @@ class AdvancedSettingsWindow(ba.Window): position=(50, v), size=(self._sub_width - 100, 30), configkey='Kick Idle Players', - displayname=ba.Lstr(resource=self._r + '.kickIdlePlayersText'), + displayname=ba.Lstr(resource=f'{self._r}.kickIdlePlayersText'), scale=1.0, maxwidth=430, ) @@ -450,7 +450,7 @@ class AdvancedSettingsWindow(ba.Window): position=(50, v), size=(self._sub_width - 100, 30), configkey='Show Ping', - displayname=ba.Lstr(value='Show InGame Ping'), + displayname=ba.Lstr(resource=f'{self._r}.showInGamePingText'), scale=1.0, maxwidth=430, ) @@ -461,7 +461,7 @@ class AdvancedSettingsWindow(ba.Window): position=(50, v), size=(self._sub_width - 100, 30), configkey='Disable Camera Shake', - displayname=ba.Lstr(resource=self._r + '.disableCameraShakeText'), + displayname=ba.Lstr(resource=f'{self._r}.disableCameraShakeText'), scale=1.0, maxwidth=430, ) @@ -475,7 +475,7 @@ class AdvancedSettingsWindow(ba.Window): size=(self._sub_width - 100, 30), configkey='Disable Camera Gyro', displayname=ba.Lstr( - resource=self._r + '.disableCameraGyroscopeMotionText' + resource=f'{self._r}.disableCameraGyroscopeMotionText' ), scale=1.0, maxwidth=430, @@ -491,7 +491,7 @@ class AdvancedSettingsWindow(ba.Window): configkey='Always Use Internal Keyboard', autoselect=True, displayname=ba.Lstr( - resource=self._r + '.alwaysUseInternalKeyboardText' + resource=f'{self._r}.alwaysUseInternalKeyboardText' ), scale=1.0, maxwidth=430, @@ -501,8 +501,9 @@ class AdvancedSettingsWindow(ba.Window): position=(90, v - 10), size=(0, 0), text=ba.Lstr( - resource=self._r - + '.alwaysUseInternalKeyboardDescriptionText' + resource=( + f'{self._r}.alwaysUseInternalKeyboardDescriptionText' + ) ), maxwidth=400, flatness=1.0, @@ -523,7 +524,7 @@ class AdvancedSettingsWindow(ba.Window): position=(self._sub_width / 2 - this_button_width / 2, v - 10), size=(this_button_width, 60), autoselect=True, - label=ba.Lstr(resource=self._r + '.moddingGuideText'), + label=ba.Lstr(resource=f'{self._r}.moddingGuideText'), text_scale=1.0, on_activate_call=ba.Call( ba.open_url, 'https://ballistica.net/wiki/modding-guide' @@ -556,7 +557,7 @@ class AdvancedSettingsWindow(ba.Window): position=(self._sub_width / 2 - this_button_width / 2, v - 10), size=(this_button_width, 60), autoselect=True, - label=ba.Lstr(resource=self._r + '.showUserModsText'), + label=ba.Lstr(resource=f'{self._r}.showUserModsText'), text_scale=1.0, on_activate_call=show_user_scripts, ) @@ -583,7 +584,7 @@ class AdvancedSettingsWindow(ba.Window): position=(self._sub_width / 2 - this_button_width / 2, v - 14), size=(this_button_width, 60), autoselect=True, - label=ba.Lstr(resource=self._r + '.vrTestingText'), + label=ba.Lstr(resource=f'{self._r}.vrTestingText'), text_scale=1.0, on_activate_call=self._on_vr_test_press, ) @@ -598,7 +599,7 @@ class AdvancedSettingsWindow(ba.Window): position=(self._sub_width / 2 - this_button_width / 2, v - 14), size=(this_button_width, 60), autoselect=True, - label=ba.Lstr(resource=self._r + '.netTestingText'), + label=ba.Lstr(resource=f'{self._r}.netTestingText'), text_scale=1.0, on_activate_call=self._on_net_test_press, ) @@ -611,7 +612,7 @@ class AdvancedSettingsWindow(ba.Window): position=(self._sub_width / 2 - this_button_width / 2, v - 14), size=(this_button_width, 60), autoselect=True, - label=ba.Lstr(resource=self._r + '.benchmarksText'), + label=ba.Lstr(resource=f'{self._r}.benchmarksText'), text_scale=1.0, on_activate_call=self._on_benchmark_press, ) @@ -633,7 +634,7 @@ class AdvancedSettingsWindow(ba.Window): def _show_restart_needed(self, value: Any) -> None: del value # Unused. ba.screenmessage( - ba.Lstr(resource=self._r + '.mustRestartText'), color=(1, 1, 0) + ba.Lstr(resource=f'{self._r}.mustRestartText'), color=(1, 1, 0) ) def _on_lang_inform_value_change(self, val: bool) -> None: diff --git a/src/ballistica/ballistica.cc b/src/ballistica/ballistica.cc index b4c024ee..873c6f88 100644 --- a/src/ballistica/ballistica.cc +++ b/src/ballistica/ballistica.cc @@ -32,7 +32,7 @@ namespace ballistica { // These are set automatically via script; don't modify them here. -const int kAppBuildNumber = 20993; +const int kAppBuildNumber = 20995; const char* kAppVersion = "1.7.19"; // Our standalone globals. diff --git a/src/ballistica/logic/connection/connection.cc b/src/ballistica/logic/connection/connection.cc index 2e34e0b0..cf7739a3 100644 --- a/src/ballistica/logic/connection/connection.cc +++ b/src/ballistica/logic/connection/connection.cc @@ -24,8 +24,8 @@ const int kPacketPruneTime = 10000; // How long to go between pruning our packets. const int kPacketPruneInterval = 1000; -// How long to go between updating current ping. -const int kPingUpdateInterval = 2000; +// How long to go between updating our ping measurement. +const int kPingMeasureInterval = 2000; Connection::Connection() { // NOLINTNEXTLINE(cppcoreguidelines-prefer-member-initializer) @@ -80,17 +80,16 @@ void Connection::HandleResends(millisecs_t real_time, // (prevents some un-necessary re-sending) uint8_t extra_bits = data[offset + 2]; - // Get a rough ping by looking at the previous packet and measuring its - // round-trip time if it has not yet been ack'ed. + // Ack packets and take the opportunity to measure ping. auto test_num = static_cast(their_next_in - 1u); auto j = out_messages_.find(test_num); if (j != out_messages_.end()) { ReliableMessageOut& msg(j->second); if (!msg.acked) { - // Dont update too fast. - if (real_time - last_ping_update_time_ > kPingUpdateInterval) { + // Periodically use this opportunity to measure ping. + if (real_time - last_ping_measure_time_ > kPingMeasureInterval) { current_ping_ = static_cast(real_time - msg.first_send_time); - last_ping_update_time_ = real_time; + last_ping_measure_time_ = real_time; } } msg.acked = true; @@ -388,15 +387,6 @@ void Connection::Update() { SendGamePacket(data); } - if (can_communicate() - && real_time - last_ping_update_time_ > kPingUpdateInterval + 1000) { - // Send a reliable message if ping not updated in a while. - - std::vector data(1); - data[0] = BA_PACKET_SIMPLE_PING; - SendReliableMessage(data); - } - // Occasionally prune our in and out messages. if (real_time - last_prune_time_ > kPacketPruneInterval) { last_prune_time_ = real_time; @@ -451,6 +441,9 @@ void Connection::HandleMessagePacket(const std::vector& buffer) { } break; } + case BA_MESSAGE_NULL: + // An empty message that can get thrown around for ping purposes. + break; default: { // Let's silently ignore these since we may be adding various // messages mid-protocol in a backwards-compatible way. diff --git a/src/ballistica/logic/connection/connection.h b/src/ballistica/logic/connection/connection.h index 60352ada..2f0e73ce 100644 --- a/src/ballistica/logic/connection/connection.h +++ b/src/ballistica/logic/connection/connection.h @@ -132,7 +132,7 @@ class Connection : public Object { bool errored_{}; millisecs_t last_prune_time_{}; millisecs_t last_ack_send_time_{}; - millisecs_t last_ping_update_time_{}; + millisecs_t last_ping_measure_time_{}; // These are explicitly 16 bit values. uint16_t next_out_message_num_ = kFirstConnectionStateNum; uint16_t next_out_unreliable_message_num_{}; diff --git a/src/ballistica/logic/connection/connection_to_host.cc b/src/ballistica/logic/connection/connection_to_host.cc index e1500402..88726023 100644 --- a/src/ballistica/logic/connection/connection_to_host.cc +++ b/src/ballistica/logic/connection/connection_to_host.cc @@ -18,6 +18,9 @@ namespace ballistica { +// How long to go between sending out null packets for pings. +const int kPingSendInterval = 2000; + ConnectionToHost::ConnectionToHost() = default; auto ConnectionToHost::GetAsUDP() -> ConnectionToHostUDP* { return nullptr; } @@ -47,7 +50,23 @@ ConnectionToHost::~ConnectionToHost() { } } -void ConnectionToHost::Update() { Connection::Update(); } +void ConnectionToHost::Update() { + millisecs_t real_time = GetRealTime(); + + // Send out null messages occasionally for ping measurement purposes. + // Note that we currently only do this from the client since we might not + // be sending things otherwise. The server on the other hand should be + // sending lots of messages to clients so no need to add to the load there. + if (can_communicate() + && real_time - last_ping_send_time_ > kPingSendInterval) { + std::vector data(1); + data[0] = BA_MESSAGE_NULL; + SendReliableMessage(data); + last_ping_send_time_ = real_time; + } + + Connection::Update(); +} // Seems we get a false alarm here. #pragma clang diagnostic push diff --git a/src/ballistica/logic/connection/connection_to_host.h b/src/ballistica/logic/connection/connection_to_host.h index 0f1b5c54..73a2c41f 100644 --- a/src/ballistica/logic/connection/connection_to_host.h +++ b/src/ballistica/logic/connection/connection_to_host.h @@ -38,6 +38,7 @@ class ConnectionToHost : public Connection { bool got_host_info_ = false; // can remove once back-compat protocol is > 29 bool ignore_old_attach_remote_player_packets_ = false; + millisecs_t last_ping_send_time_{}; // the client-session that we're driving Object::WeakRef client_session_; }; diff --git a/src/ballistica/networking/networking.h b/src/ballistica/networking/networking.h index 6554d5c5..b169c80a 100644 --- a/src/ballistica/networking/networking.h +++ b/src/ballistica/networking/networking.h @@ -74,6 +74,7 @@ namespace ballistica { #define BA_MESSAGE_SESSION_RESET 0 #define BA_MESSAGE_SESSION_COMMANDS 1 #define BA_MESSAGE_SESSION_DYNAMICS_CORRECTION 2 +#define BA_MESSAGE_NULL 3 #define BA_MESSAGE_REQUEST_REMOTE_PLAYER 4 #define BA_MESSAGE_ATTACH_REMOTE_PLAYER 5 // OBSOLETE (use the _2 version) #define BA_MESSAGE_DETACH_REMOTE_PLAYER 6