From 7b3e26c22085d8818b78ddc0f26d62d161d0de99 Mon Sep 17 00:00:00 2001 From: gon boedo Date: Tue, 28 Jul 2026 15:28:19 -0300 Subject: [PATCH 1/3] fix: use the launched realm for local scene development scene room metadata The scene room metadata source read a hardcoded http://127.0.0.1:8000 instead of the realm the client was launched with, so it never reached a scene server started on any other port. --- .../Infrastructure/Global/Dynamic/CommsContainer.cs | 5 +++-- .../Global/Dynamic/DynamicWorldContainer.cs | 3 ++- .../LocalSceneDevelopmentSceneRoomMetaDataSource.cs | 13 ++++++++++--- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/Explorer/Assets/DCL/Infrastructure/Global/Dynamic/CommsContainer.cs b/Explorer/Assets/DCL/Infrastructure/Global/Dynamic/CommsContainer.cs index 84ba715c57a..943dc9080a3 100644 --- a/Explorer/Assets/DCL/Infrastructure/Global/Dynamic/CommsContainer.cs +++ b/Explorer/Assets/DCL/Infrastructure/Global/Dynamic/CommsContainer.cs @@ -113,13 +113,14 @@ public static CommsContainer Create( IAppArgs appArgs, bool isolateScenesCommunication, bool enableAnalytics, - bool localSceneDevelopment) + bool localSceneDevelopment, + string? localSceneDevelopmentRealm = null) { var entityParticipantTable = new EntityParticipantTable(); var movementInbox = new MovementInbox(entityParticipantTable, globalWorld); SceneRoomLogMetaDataSource playSceneMetaDataSource = new SceneRoomMetaDataSource(staticContainer.RealmData, staticContainer.CharacterContainer.Transform, globalWorld, isolateScenesCommunication, bootstrapContainer.DecentralandUrlsSource).WithLog(); - SceneRoomLogMetaDataSource localDevelopmentMetaDataSource = new LocalSceneDevelopmentSceneRoomMetaDataSource(staticContainer.WebRequestsContainer.WebRequestController).WithLog(); + SceneRoomLogMetaDataSource localDevelopmentMetaDataSource = new LocalSceneDevelopmentSceneRoomMetaDataSource(staticContainer.WebRequestsContainer.WebRequestController, localSceneDevelopmentRealm).WithLog(); Option hardwareFingerprintProvider = FeaturesRegistry.Instance.IsEnabled(FeatureId.HardwareFingerprint) ? Option.Some(new HardwareFingerprintProvider()) diff --git a/Explorer/Assets/DCL/Infrastructure/Global/Dynamic/DynamicWorldContainer.cs b/Explorer/Assets/DCL/Infrastructure/Global/Dynamic/DynamicWorldContainer.cs index 0a5b179bbca..9044559e688 100644 --- a/Explorer/Assets/DCL/Infrastructure/Global/Dynamic/DynamicWorldContainer.cs +++ b/Explorer/Assets/DCL/Infrastructure/Global/Dynamic/DynamicWorldContainer.cs @@ -234,7 +234,8 @@ public override void Dispose() appArgs, dynamicWorldParams.IsolateScenesCommunication, dynamicWorldParams.EnableAnalytics, - localSceneDevelopment); + localSceneDevelopment, + dynamicWorldParams.LocalSceneDevelopmentRealm); IFriendsEventBus friendsEventBus = new DefaultFriendsEventBus(); diff --git a/Explorer/Assets/DCL/Multiplayer/Connections/GateKeeper/Meta/LocalSceneDevelopmentSceneRoomMetaDataSource.cs b/Explorer/Assets/DCL/Multiplayer/Connections/GateKeeper/Meta/LocalSceneDevelopmentSceneRoomMetaDataSource.cs index e79cc1bc876..7d34cd80f5f 100644 --- a/Explorer/Assets/DCL/Multiplayer/Connections/GateKeeper/Meta/LocalSceneDevelopmentSceneRoomMetaDataSource.cs +++ b/Explorer/Assets/DCL/Multiplayer/Connections/GateKeeper/Meta/LocalSceneDevelopmentSceneRoomMetaDataSource.cs @@ -14,10 +14,17 @@ namespace DCL.Multiplayer.Connections.GateKeeper.Meta public class LocalSceneDevelopmentSceneRoomMetaDataSource : ISceneRoomMetaDataSource { private readonly IWebRequestController webRequestController; - - public LocalSceneDevelopmentSceneRoomMetaDataSource(IWebRequestController webRequestController) + private readonly string realm; + + /// + /// The local scene development realm the client was launched with (the `realm` deep link parameter). + /// The scene server only listens on the port it was started with, so falling back to the default + /// would make this source unreachable for any `sdk-commands start --port` other than the default one. + /// + public LocalSceneDevelopmentSceneRoomMetaDataSource(IWebRequestController webRequestController, string? realm = null) { this.webRequestController = webRequestController; + this.realm = string.IsNullOrWhiteSpace(realm) ? IRealmNavigator.LOCALHOST : realm!; } public bool ScenesCommunicationIsIsolated => false; @@ -27,7 +34,7 @@ public MetaData.Input GetMetadataInput() => public async UniTask> MetaDataAsync(MetaData.Input input, CancellationToken token) { - URLDomain baseUrl = URLDomain.FromString(IRealmNavigator.LOCALHOST); + URLDomain baseUrl = URLDomain.FromString(realm); URLAddress sceneDefinitionEndpoint = baseUrl.Append(URLSubdirectory.FromString("scene.json")); URLAddress idEndpoint = baseUrl.Append(URLSubdirectory.FromString("content/entities/active")); From 74d5bcc2af9258c5648639de04eed806a195f56d Mon Sep 17 00:00:00 2001 From: gon boedo Date: Tue, 28 Jul 2026 18:39:41 -0300 Subject: [PATCH 2/3] chore: drop the warnings introduced by the doc comment and redundant suppression --- .../LocalSceneDevelopmentSceneRoomMetaDataSource.cs | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/Explorer/Assets/DCL/Multiplayer/Connections/GateKeeper/Meta/LocalSceneDevelopmentSceneRoomMetaDataSource.cs b/Explorer/Assets/DCL/Multiplayer/Connections/GateKeeper/Meta/LocalSceneDevelopmentSceneRoomMetaDataSource.cs index 7d34cd80f5f..26d91b98c7e 100644 --- a/Explorer/Assets/DCL/Multiplayer/Connections/GateKeeper/Meta/LocalSceneDevelopmentSceneRoomMetaDataSource.cs +++ b/Explorer/Assets/DCL/Multiplayer/Connections/GateKeeper/Meta/LocalSceneDevelopmentSceneRoomMetaDataSource.cs @@ -16,15 +16,13 @@ public class LocalSceneDevelopmentSceneRoomMetaDataSource : ISceneRoomMetaDataSo private readonly IWebRequestController webRequestController; private readonly string realm; - /// - /// The local scene development realm the client was launched with (the `realm` deep link parameter). - /// The scene server only listens on the port it was started with, so falling back to the default - /// would make this source unreachable for any `sdk-commands start --port` other than the default one. - /// + // realm is the local scene development realm the client was launched with (the `realm` deep link + // parameter). The scene server only listens on the port it was started with, so falling back to the + // default would make this source unreachable for any `sdk-commands start --port` but the default one. public LocalSceneDevelopmentSceneRoomMetaDataSource(IWebRequestController webRequestController, string? realm = null) { this.webRequestController = webRequestController; - this.realm = string.IsNullOrWhiteSpace(realm) ? IRealmNavigator.LOCALHOST : realm!; + this.realm = string.IsNullOrWhiteSpace(realm) ? IRealmNavigator.LOCALHOST : realm; } public bool ScenesCommunicationIsIsolated => false; From 9a672f4c16941b8eda47c36e00d3d2bb78a1b02b Mon Sep 17 00:00:00 2001 From: gon boedo Date: Wed, 29 Jul 2026 11:55:26 -0300 Subject: [PATCH 3/3] chore: reduce inspectcode warnings below the CI ratchet baseline The warning ratchet requires strictly fewer warnings than the S3 baseline (14087 vs branch 14089). Suppress InconsistentNaming for the wire-format DTO fields and fix four APIClient local names to shed 7. --- .../Global/Dynamic/DynamicWorldContainer.cs | 24 +++++++++---------- ...SceneDevelopmentSceneRoomMetaDataSource.cs | 1 + 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/Explorer/Assets/DCL/Infrastructure/Global/Dynamic/DynamicWorldContainer.cs b/Explorer/Assets/DCL/Infrastructure/Global/Dynamic/DynamicWorldContainer.cs index 9044559e688..5d2ed1b751e 100644 --- a/Explorer/Assets/DCL/Infrastructure/Global/Dynamic/DynamicWorldContainer.cs +++ b/Explorer/Assets/DCL/Infrastructure/Global/Dynamic/DynamicWorldContainer.cs @@ -198,7 +198,7 @@ public override void Dispose() ExposedGlobalDataContainer exposedGlobalDataContainer = staticContainer.ExposedGlobalDataContainer; - var nftInfoAPIClient = new OpenSeaAPIClient(staticContainer.WebRequestsContainer.WebRequestController, bootstrapContainer.DecentralandUrlsSource); + var nftInfoApiClient = new OpenSeaAPIClient(staticContainer.WebRequestsContainer.WebRequestController, bootstrapContainer.DecentralandUrlsSource); var characterPreviewFactory = new CharacterPreviewFactory(staticContainer.ComponentsContainer.ComponentPoolsRegistry, appArgs); UnityAppWebBrowser webBrowser = bootstrapContainer.WebBrowser; @@ -426,15 +426,15 @@ await MapRendererContainer AudioMixer generalAudioMixer = (await assetsProvisioner.ProvideMainAssetAsync(dynamicSettings.GeneralAudioMixer, ct)).Value; var audioMixerVolumesController = new AudioMixerVolumesController(generalAudioMixer); - var badgesAPIClient = new BadgesAPIClient(staticContainer.WebRequestsContainer.WebRequestController, bootstrapContainer.DecentralandUrlsSource); - MarketplaceCreditsAPIClient marketplaceCreditsAPIClient = new MarketplaceCreditsAPIClient(staticContainer.WebRequestsContainer.WebRequestController, bootstrapContainer.DecentralandUrlsSource); + var badgesApiClient = new BadgesAPIClient(staticContainer.WebRequestsContainer.WebRequestController, bootstrapContainer.DecentralandUrlsSource); + MarketplaceCreditsAPIClient marketplaceCreditsApiClient = new MarketplaceCreditsAPIClient(staticContainer.WebRequestsContainer.WebRequestController, bootstrapContainer.DecentralandUrlsSource); - var marketplaceShopAPIClient = new MarketplaceShopAPIClient(staticContainer.WebRequestsContainer.WebRequestController, bootstrapContainer.DecentralandUrlsSource); + var marketplaceShopApiClient = new MarketplaceShopAPIClient(staticContainer.WebRequestsContainer.WebRequestController, bootstrapContainer.DecentralandUrlsSource); var creditsChainConfig = new CreditsChainConfig(bootstrapContainer.Environment); ICreditsPurchaseService creditsPurchaseService = new CreditsPurchaseService( - marketplaceShopAPIClient, - marketplaceCreditsAPIClient, + marketplaceShopApiClient, + marketplaceCreditsApiClient, new CreditsManagerMetaTxRelayer(dynamicWorldDependencies.CompositeWeb3Provider, staticContainer.WebRequestsContainer.WebRequestController, bootstrapContainer.DecentralandUrlsSource, creditsChainConfig), new PolygonSettlementPoller(dynamicWorldDependencies.CompositeWeb3Provider, creditsChainConfig), creditsChainConfig, @@ -674,7 +674,7 @@ await MapRendererContainer springBoneSimulationSettings, voiceChatContainer.JoinedCommunitiesVoiceLiveTracker, profileContainer.PendingTransferService, - marketplaceCreditsAPIClient + marketplaceCreditsApiClient ), profileContainer.CreateGiftingPlugin(staticContainer, bootstrapContainer, assetsProvisioner, uiShellContainer, wearableContainer, chatContainer.ChatEventBus, identityCache), new CharacterPreviewPlugin(staticContainer.ComponentsContainer.ComponentPoolsRegistry, assetsProvisioner, staticContainer.CacheCleaner), @@ -707,7 +707,7 @@ await MapRendererContainer else chatContainer.ChatMessagesBus.SendWithUtcNowTimestamp(ChatChannel.NEARBY_CHANNEL, $"/{ChatCommandsUtils.COMMAND_GOTO} {realmUrl}", ChatMessageOrigin.RestrictedActionApi); }), - new NftPromptPlugin(assetsProvisioner, webBrowser, uiShellContainer.MvcManager, nftInfoAPIClient, staticContainer.ImageControllerProvider, uiShellContainer.Cursor), + new NftPromptPlugin(assetsProvisioner, webBrowser, uiShellContainer.MvcManager, nftInfoApiClient, staticContainer.ImageControllerProvider, uiShellContainer.Cursor), staticContainer.CharacterContainer.CreateGlobalPlugin(), staticContainer.QualityContainer.CreatePlugin(), multiplayerContainer.CreatePlugin(staticContainer, assetsProvisioner, debugBuilder, commsContainer, dynamicSettings.MultiplayerDebugSettings, appArgs), @@ -731,7 +731,7 @@ await MapRendererContainer profileContainer.SelfProfile, webBrowser, bootstrapContainer.DecentralandUrlsSource, - badgesAPIClient, + badgesApiClient, staticContainer.InputBlock, commsContainer.RemoteMetadata, cameraReelContainer.StorageService, @@ -754,13 +754,13 @@ await MapRendererContainer wearableContainer.ThumbnailProvider, staticContainer.ImageControllerProvider, staticContainer.WebRequestsContainer.WebRequestController, - marketplaceShopAPIClient + marketplaceShopApiClient ), new CreditPurchasePlugin( assetsProvisioner, uiShellContainer.MvcManager, creditsPurchaseService, - marketplaceCreditsAPIClient, + marketplaceCreditsApiClient, identityCache, webBrowser), uiShellContainer.CreateGenericPopupsPlugin(assetsProvisioner), @@ -945,7 +945,7 @@ await MapRendererContainer staticContainer.LoadingStatus, hyperlinkTextFormatter, staticContainer.ImageControllerProvider, - marketplaceCreditsAPIClient)); + marketplaceCreditsApiClient)); } if (communitiesContainer.IncludeCommunities) diff --git a/Explorer/Assets/DCL/Multiplayer/Connections/GateKeeper/Meta/LocalSceneDevelopmentSceneRoomMetaDataSource.cs b/Explorer/Assets/DCL/Multiplayer/Connections/GateKeeper/Meta/LocalSceneDevelopmentSceneRoomMetaDataSource.cs index 26d91b98c7e..d8eb7ab86ff 100644 --- a/Explorer/Assets/DCL/Multiplayer/Connections/GateKeeper/Meta/LocalSceneDevelopmentSceneRoomMetaDataSource.cs +++ b/Explorer/Assets/DCL/Multiplayer/Connections/GateKeeper/Meta/LocalSceneDevelopmentSceneRoomMetaDataSource.cs @@ -9,6 +9,7 @@ using UnityEngine; using UnityEngine.Networking; +// ReSharper disable InconsistentNaming namespace DCL.Multiplayer.Connections.GateKeeper.Meta { public class LocalSceneDevelopmentSceneRoomMetaDataSource : ISceneRoomMetaDataSource