< Summary

Class:BIWMainController
Assembly:BuilderInWorld
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/BuilderMode/BIWMainController.cs
Covered lines:359
Uncovered lines:77
Coverable lines:436
Total lines:870
Line coverage:82.3% (359 of 436)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
BIWMainController()0%110100%
Initialize()0%33096.3%
InitReferences(...)0%2.012084.62%
CreateControllers()0%110100%
InitBuilderProjectPanel()0%6200%
InitHUD()0%22091.67%
Dispose()0%770100%
OnGUI()0%3.023087.5%
Update()0%9.029093.75%
LateUpdate()0%3.033085.71%
OnNFTUsageChange()0%2100%
ActivateLandAccessBackgroundChecker()0%3.473062.5%
BuilderProjectPanelInfo(...)0%2100%
CatalogReceived(...)0%110100%
CatalogLoaded()0%220100%
CatalogHeadersReceived(...)0%2.032080%
GetCatalog()0%3.213071.43%
ConfigureLoadingController()0%110100%
InitControllers()0%110100%
InitController(...)0%110100%
StartTutorial()0%2100%
CleanItems()0%550100%
ChangeEditModeStatusByShortcut(...)0%8.36060%
CheckSceneToEditByShorcut()0%3.073080%
NewSceneAdded(...)0%2.012085.71%
NewSceneReady(...)0%2.012087.5%
UserHasPermissionOnParcelScene(...)0%6.65060%
IsParcelSceneDeployedFromSDK(...)0%660100%
CheckEnterEditMode()0%330100%
TryStartEnterEditMode()0%2100%
TryStartEnterEditMode(...)0%2100%
TryStartEnterEditMode(...)0%7.437079.31%
StartEditMode()0%220100%
EnterEditMode()0%5.175081.08%
OnAllParcelsFloorLoaded()0%2.032080%
OpenNewProjectDetailsIfNeeded()0%6200%
StartExitMode()0%3.213071.43%
ExitEditMode()0%44093.33%
InmediateExit()0%110100%
EnterBiwControllers()0%220100%
ExitBiwControllers()0%220100%
IsNewScene()0%110100%
SetupNewScene()0%110100%
ExitAfterCharacterTeleport(...)0%110100%
FindSceneToEdit(...)0%4.034087.5%
FindSceneToEdit()0%5.025090.91%
OnPlayerTeleportedToEditScene(...)0%6200%
UpdateCatalogLoadingProgress(...)0%2100%
UpdateSceneLoadingProgress(...)0%2100%
OnUserProfileUpdate(...)0%110100%
CheckLandsAccess()0%3.333066.67%
UpdateLandsWithAccess()0%2.062075%
ShowGenericNotification(...)0%2.012085.71%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/BuilderMode/BIWMainController.cs

#LineLine coverage
 1using DCL;
 2using DCL.Configuration;
 3using DCL.Controllers;
 4using DCL.Tutorial;
 5using Newtonsoft.Json;
 6using System;
 7using System.Collections;
 8using System.Collections.Generic;
 9using System.Linq;
 10using UnityEngine;
 11using Environment = DCL.Environment;
 12
 13public class BIWMainController : PluginFeature
 14{
 15    internal static bool BYPASS_LAND_OWNERSHIP_CHECK = false;
 16    private const float DISTANCE_TO_DISABLE_BUILDER_IN_WORLD = 45f;
 17    private const float MAX_DISTANCE_STOP_TRYING_TO_ENTER = 16;
 18
 19    private GameObject cursorGO;
 20    private InputController inputController;
 21    private GameObject[] groundVisualsGO;
 22
 23    internal BIWOutlinerController outlinerController;
 24    internal BIWInputHandler inputHandler;
 25    internal BIWPublishController publishController;
 26    internal BIWCreatorController creatorController;
 27    internal BIWModeController modeController;
 28    internal BIWFloorHandler floorHandler;
 29    internal BIWEntityHandler entityHandler;
 30    internal BIWActionController actionController;
 31    internal BIWSaveController saveController;
 32    internal BIWInputWrapper inputWrapper;
 33    internal BIWRaycastController raycastController;
 34    internal BIWGizmosController gizmosController;
 35
 36    private BuilderInWorldBridge builderInWorldBridge;
 37    private BuilderInWorldAudioHandler biwAudioHandler;
 38    private BIWContext context;
 39
 2640    private readonly List<IBIWController> controllers = new List<IBIWController>();
 41
 42    internal ParcelScene sceneToEdit;
 43
 44    private Material skyBoxMaterial;
 45
 046    public bool isBuilderInWorldActivated { get; internal set; } = false;
 47
 48    private InputAction_Trigger editModeChangeInputAction;
 49
 50    internal int checkerInsideSceneOptimizationCounter = 0;
 51    internal string sceneToEditId;
 52    internal bool catalogAdded = false;
 53    private bool sceneReady = false;
 54    private bool isInit = false;
 55    private Material previousSkyBoxMaterial;
 56    private Vector3 parcelUnityMiddlePoint;
 57    private bool previousAllUIHidden;
 58    private WebRequestAsyncOperation catalogAsyncOp;
 59    private bool isCatalogLoading = false;
 60    internal bool areCatalogHeadersReady = false;
 61    private float beginStartFlowTimeStamp = 0;
 62    private float startEditorTimeStamp = 0;
 63    internal bool isCatalogRequested = false;
 64    internal bool isEnteringEditMode = false;
 65    private bool activeFeature = false;
 66
 67    internal IBuilderInWorldLoadingController initialLoadingController;
 68
 69    private UserProfile userProfile;
 70    internal Coroutine updateLandsWithAcessCoroutine;
 71    private Dictionary<string, string> catalogCallHeaders;
 72
 73    internal bool isWaitingForPermission = false;
 74    private bool alreadyAskedForLandPermissions = false;
 75    private Vector3 askPermissionLastPosition;
 76
 77    public override void Initialize()
 78    {
 2679        base.Initialize();
 80
 2681        if (isInit)
 082            return;
 83
 2684        activeFeature = true;
 2685        isInit = true;
 86
 87        //We init the lands so we don't have a null reference
 2688        DataStore.i.builderInWorld.landsWithAccess.Set(new LandWithAccess[0]);
 89
 2690        BIWCatalogManager.Init();
 91
 2692        CreateControllers();
 2693        InitReferences(InitialSceneReferences.i);
 94
 2695        if (builderInWorldBridge != null)
 96        {
 2697            builderInWorldBridge.OnCatalogHeadersReceived += CatalogHeadersReceived;
 2698            builderInWorldBridge.OnBuilderProjectInfo += BuilderProjectPanelInfo;
 99        }
 100
 26101        InitHUD();
 102
 26103        BIWTeleportAndEdit.OnTeleportEnd += OnPlayerTeleportedToEditScene;
 104
 26105        ConfigureLoadingController();
 26106        InitControllers();
 107
 26108        CommonScriptableObjects.builderInWorldNotNecessaryUIVisibilityStatus.Set(true);
 109
 26110        builderInWorldBridge.AskKernelForCatalogHeaders();
 111
 26112        isCatalogLoading = true;
 26113        BIWNFTController.i.Initialize();
 26114        BIWNFTController.i.OnNFTUsageChange += OnNFTUsageChange;
 115
 26116        editModeChangeInputAction = context.inputsReferencesAsset.editModeChangeInputAction;
 26117        editModeChangeInputAction.OnTriggered += ChangeEditModeStatusByShortcut;
 118
 26119        biwAudioHandler = GameObject.Instantiate(context.projectReferencesAsset.audioPrefab, Vector3.zero, Quaternion.id
 26120        biwAudioHandler.Init(context);
 26121        biwAudioHandler.gameObject.SetActive(false);
 26122    }
 123
 124    public void InitReferences(InitialSceneReferences initalReference)
 125    {
 126
 26127        builderInWorldBridge = initalReference.builderInWorldBridge;
 26128        cursorGO = initalReference.cursorCanvas;
 26129        inputController = initalReference.inputController;
 130
 26131        List<GameObject> grounds = new List<GameObject>();
 52132        for (int i = 0; i < InitialSceneReferences.i.groundVisual.transform.transform.childCount; i++)
 133        {
 0134            grounds.Add(InitialSceneReferences.i.groundVisual.transform.transform.GetChild(i).gameObject);
 135        }
 26136        groundVisualsGO = grounds.ToArray();
 137
 26138        context = new BIWContext();
 26139        context.Init(
 140            outlinerController,
 141            inputHandler,
 142            inputWrapper,
 143            publishController,
 144            creatorController,
 145            modeController,
 146            floorHandler,
 147            entityHandler,
 148            actionController,
 149            saveController,
 150            raycastController,
 151            gizmosController,
 152            InitialSceneReferences.i
 153        );
 154
 26155        skyBoxMaterial = context.projectReferencesAsset.skyBoxMaterial;
 26156    }
 157
 158    private void CreateControllers()
 159    {
 26160        outlinerController = new BIWOutlinerController();
 26161        inputHandler = new BIWInputHandler();
 26162        publishController = new BIWPublishController();
 26163        creatorController = new BIWCreatorController();
 26164        modeController = new BIWModeController();
 26165        floorHandler = new BIWFloorHandler();
 26166        entityHandler = new BIWEntityHandler();
 26167        actionController = new BIWActionController();
 26168        saveController = new BIWSaveController();
 26169        inputWrapper = new BIWInputWrapper();
 26170        raycastController = new BIWRaycastController();
 26171        gizmosController = new BIWGizmosController();
 26172    }
 173
 174    private void InitBuilderProjectPanel()
 175    {
 0176        if (HUDController.i.builderProjectsPanelController != null)
 0177            HUDController.i.builderProjectsPanelController.OnJumpInOrEdit += GetCatalog;
 0178    }
 179
 180    private void InitHUD()
 181    {
 26182        HUDConfiguration hudConfig = new HUDConfiguration();
 26183        hudConfig.active = true;
 26184        hudConfig.visible = false;
 26185        HUDController.i.CreateHudElement(hudConfig, HUDElementID.BUILDER_IN_WORLD_MAIN);
 26186        HUDController.i.OnBuilderProjectPanelCreation += InitBuilderProjectPanel;
 187
 26188        HUDController.i.builderInWorldMainHud.Initialize();
 189
 26190        HUDController.i.builderInWorldMainHud.OnTutorialAction += StartTutorial;
 26191        HUDController.i.builderInWorldMainHud.OnStartExitAction += StartExitMode;
 26192        HUDController.i.builderInWorldMainHud.OnLogoutAction += ExitEditMode;
 193
 26194        if (HUDController.i.builderProjectsPanelController != null)
 0195            HUDController.i.builderProjectsPanelController.OnJumpInOrEdit += GetCatalog;
 26196    }
 197
 198    public override void Dispose()
 199    {
 27200        base.Dispose();
 201
 27202        if (userProfile != null)
 3203            userProfile.OnUpdate -= OnUserProfileUpdate;
 204
 27205        CoroutineStarter.Stop(updateLandsWithAcessCoroutine);
 206
 27207        if (sceneToEdit != null)
 12208            sceneToEdit.OnLoadingStateUpdated -= UpdateSceneLoadingProgress;
 209
 27210        Environment.i.world.sceneController.OnNewSceneAdded -= NewSceneAdded;
 27211        Environment.i.world.sceneController.OnReadyScene -= NewSceneReady;
 212
 213
 27214        if (HUDController.i.builderInWorldMainHud != null)
 215        {
 27216            HUDController.i.builderInWorldMainHud.OnTutorialAction -= StartTutorial;
 27217            HUDController.i.builderInWorldMainHud.OnStartExitAction -= StartExitMode;
 27218            HUDController.i.builderInWorldMainHud.OnLogoutAction -= ExitEditMode;
 219        }
 220
 27221        BIWTeleportAndEdit.OnTeleportEnd -= OnPlayerTeleportedToEditScene;
 27222        DCLCharacterController.OnPositionSet -= ExitAfterCharacterTeleport;
 223
 27224        if (initialLoadingController != null)
 27225            initialLoadingController.Dispose();
 226
 27227        BIWNFTController.i.OnNFTUsageChange -= OnNFTUsageChange;
 228
 27229        BIWNFTController.i.Dispose();
 27230        builderInWorldBridge.OnCatalogHeadersReceived -= CatalogHeadersReceived;
 27231        builderInWorldBridge.OnBuilderProjectInfo -= BuilderProjectPanelInfo;
 232
 27233        floorHandler.OnAllParcelsFloorLoaded -= OnAllParcelsFloorLoaded;
 234
 27235        CleanItems();
 236
 27237        HUDController.i.OnBuilderProjectPanelCreation -= InitBuilderProjectPanel;
 27238        editModeChangeInputAction.OnTriggered -= ChangeEditModeStatusByShortcut;
 239
 27240        biwAudioHandler.Dispose();
 27241        if (biwAudioHandler.gameObject != null)
 27242            GameObject.Destroy(biwAudioHandler.gameObject);
 243
 720244        foreach (var controller in controllers)
 245        {
 333246            controller.Dispose();
 247        }
 248
 27249        context.Dispose();
 27250    }
 251
 252    public override void OnGUI()
 253    {
 1254        base.OnGUI();
 1255        if (!isBuilderInWorldActivated)
 0256            return;
 257
 28258        foreach (var controller in controllers)
 259        {
 13260            controller.OnGUI();
 261        }
 1262    }
 263
 264    public override void Update()
 265    {
 3266        base.Update();
 267
 3268        if (isCatalogLoading && catalogAsyncOp?.webRequest != null)
 0269            UpdateCatalogLoadingProgress(catalogAsyncOp.webRequest.downloadProgress * 100);
 270
 3271        if (!isBuilderInWorldActivated)
 1272            return;
 273
 54274        foreach (var controller in controllers)
 275        {
 25276            controller.Update();
 277        }
 278
 2279        if (checkerInsideSceneOptimizationCounter >= 60)
 280        {
 1281            if (Vector3.Distance(DCLCharacterController.i.characterPosition.unityPosition, parcelUnityMiddlePoint) >= DI
 1282                ExitEditMode();
 1283            checkerInsideSceneOptimizationCounter = 0;
 1284        }
 285        else
 286        {
 1287            checkerInsideSceneOptimizationCounter++;
 288        }
 1289    }
 290
 291    public override void LateUpdate()
 292    {
 1293        if (!isBuilderInWorldActivated)
 0294            return;
 295
 28296        foreach (var controller in controllers)
 297        {
 13298            controller.LateUpdate();
 299        }
 1300    }
 301
 302    private void OnNFTUsageChange()
 303    {
 0304        HUDController.i.builderInWorldMainHud.RefreshCatalogAssetPack();
 0305        HUDController.i.builderInWorldMainHud.RefreshCatalogContent();
 0306    }
 307
 308    internal void ActivateLandAccessBackgroundChecker()
 309    {
 3310        userProfile = UserProfile.GetOwnUserProfile();
 3311        if (!string.IsNullOrEmpty(userProfile.userId))
 312        {
 3313            if (updateLandsWithAcessCoroutine != null)
 0314                CoroutineStarter.Stop(updateLandsWithAcessCoroutine);
 3315            updateLandsWithAcessCoroutine = CoroutineStarter.Start(CheckLandsAccess());
 3316        }
 317        else
 318        {
 0319            userProfile.OnUpdate += OnUserProfileUpdate;
 320        }
 0321    }
 322
 0323    private void BuilderProjectPanelInfo(string title, string description) { HUDController.i.builderInWorldMainHud.SetBu
 324
 325    internal void CatalogReceived(string catalogJson)
 326    {
 1327        isCatalogLoading = false;
 1328        AssetCatalogBridge.i.AddFullSceneObjectCatalog(catalogJson);
 1329        CatalogLoaded();
 1330    }
 331
 332    public void CatalogLoaded()
 333    {
 8334        catalogAdded = true;
 8335        if (HUDController.i.builderInWorldMainHud != null)
 8336            HUDController.i.builderInWorldMainHud.RefreshCatalogContent();
 8337        StartEditMode();
 8338    }
 339
 340    internal void CatalogHeadersReceived(string rawHeaders)
 341    {
 1342        catalogCallHeaders = JsonConvert.DeserializeObject<Dictionary<string, string>>(rawHeaders);
 1343        areCatalogHeadersReady = true;
 1344        if (isCatalogRequested)
 0345            GetCatalog();
 1346    }
 347
 348    internal void GetCatalog()
 349    {
 2350        if (catalogAdded)
 0351            return;
 352
 2353        if (areCatalogHeadersReady)
 0354            catalogAsyncOp = BIWUtils.MakeGetCall(BIWUrlUtils.GetUrlCatalog(), CatalogReceived, catalogCallHeaders);
 355        else
 2356            builderInWorldBridge.AskKernelForCatalogHeaders();
 357
 2358        isCatalogRequested = true;
 2359    }
 360
 361    private void ConfigureLoadingController()
 362    {
 26363        initialLoadingController = new BuilderInWorldLoadingController();
 26364        initialLoadingController.Initialize();
 26365    }
 366
 367    private void InitControllers()
 368    {
 26369        InitController(entityHandler);
 26370        InitController(modeController);
 26371        InitController(publishController);
 26372        InitController(creatorController);
 26373        InitController(outlinerController);
 26374        InitController(floorHandler);
 26375        InitController(inputHandler);
 26376        InitController(saveController);
 26377        InitController(actionController);
 26378        InitController(inputWrapper);
 26379        InitController(raycastController);
 26380        InitController(gizmosController);
 26381    }
 382
 383    public void InitController(IBIWController controller)
 384    {
 320385        controller.Init(context);
 320386        controllers.Add(controller);
 320387    }
 388
 0389    private void StartTutorial() { TutorialController.i.SetBuilderInWorldTutorialEnabled(); }
 390
 391    public void CleanItems()
 392    {
 27393        if (HUDController.i.builderInWorldMainHud != null)
 27394            HUDController.i.builderInWorldMainHud.Dispose();
 395
 27396        if (Camera.main != null)
 397        {
 27398            BIWOutline outliner = Camera.main.GetComponent<BIWOutline>();
 27399            GameObject.Destroy(outliner);
 400        }
 401
 27402        floorHandler?.Clean();
 27403        creatorController?.Clean();
 27404    }
 405
 406    public void ChangeEditModeStatusByShortcut(DCLAction_Trigger action)
 407    {
 1408        if (!activeFeature)
 0409            return;
 410
 1411        if (isEnteringEditMode)
 0412            return;
 413
 1414        if (isBuilderInWorldActivated)
 415        {
 0416            HUDController.i.builderInWorldMainHud.ExitStart();
 0417            return;
 418        }
 419
 1420        if (DataStore.i.builderInWorld.landsWithAccess.Get().Length == 0 && !alreadyAskedForLandPermissions)
 421        {
 1422            ActivateLandAccessBackgroundChecker();
 1423            ShowGenericNotification(BIWSettings.LAND_EDITION_WAITING_FOR_PERMISSIONS_MESSAGE, NotificationFactory.Type.G
 1424            isWaitingForPermission = true;
 1425            askPermissionLastPosition = DCLCharacterController.i.characterPosition.unityPosition;
 1426        }
 427        else
 428        {
 0429            CheckSceneToEditByShorcut();
 430        }
 0431    }
 432
 433    internal void CheckSceneToEditByShorcut()
 434    {
 2435        FindSceneToEdit();
 436
 2437        if (!UserHasPermissionOnParcelScene(sceneToEdit))
 438        {
 1439            ShowGenericNotification(BIWSettings.LAND_EDITION_NOT_ALLOWED_BY_PERMISSIONS_MESSAGE);
 1440            return;
 441        }
 1442        if (IsParcelSceneDeployedFromSDK(sceneToEdit))
 443        {
 0444            ShowGenericNotification(BIWSettings.LAND_EDITION_NOT_ALLOWED_BY_SDK_LIMITATION_MESSAGE);
 0445            return;
 446        }
 447
 1448        GetCatalog();
 1449        TryStartEnterEditMode(true, null, "Shortcut");
 1450    }
 451
 452    internal void NewSceneAdded(IParcelScene newScene)
 453    {
 1454        if (newScene.sceneData.id != sceneToEditId)
 0455            return;
 456
 1457        Environment.i.world.sceneController.OnNewSceneAdded -= NewSceneAdded;
 458
 1459        sceneToEdit = (ParcelScene)Environment.i.world.state.GetScene(sceneToEditId);
 1460        sceneToEdit.metricsController = new BIWSceneMetricsController(sceneToEdit);
 1461        sceneToEdit.OnLoadingStateUpdated += UpdateSceneLoadingProgress;
 1462    }
 463
 464    private void NewSceneReady(string id)
 465    {
 7466        if (sceneToEditId != id)
 0467            return;
 468
 7469        sceneToEdit.OnLoadingStateUpdated -= UpdateSceneLoadingProgress;
 7470        Environment.i.world.sceneController.OnReadyScene -= NewSceneReady;
 7471        sceneToEditId = null;
 7472        sceneReady = true;
 7473        CheckEnterEditMode();
 7474    }
 475
 476    internal bool UserHasPermissionOnParcelScene(ParcelScene sceneToCheck)
 477    {
 11478        if (BYPASS_LAND_OWNERSHIP_CHECK)
 10479            return true;
 480
 1481        List<Vector2Int> allParcelsWithAccess = DataStore.i.builderInWorld.landsWithAccess.Get().SelectMany(land => land
 2482        foreach (Vector2Int parcel in allParcelsWithAccess)
 483        {
 0484            if (sceneToCheck.sceneData.parcels.Any(currentParcel => currentParcel.x == parcel.x && currentParcel.y == pa
 0485                return true;
 486        }
 487
 1488        return false;
 0489    }
 490
 491    internal bool IsParcelSceneDeployedFromSDK(ParcelScene sceneToCheck)
 492    {
 13493        List<DeployedScene> allDeployedScenesWithAccess = DataStore.i.builderInWorld.landsWithAccess.Get().SelectMany(la
 21494        foreach (DeployedScene scene in allDeployedScenesWithAccess)
 495        {
 1496            if (scene.source != DeployedScene.Source.SDK)
 497                continue;
 498
 1499            List<Vector2Int> parcelsDeployedFromSDK = scene.parcels.ToList();
 3500            foreach (Vector2Int parcel in parcelsDeployedFromSDK)
 501            {
 2502                if (sceneToCheck.sceneData.parcels.Any(currentParcel => currentParcel.x == parcel.x && currentParcel.y =
 1503                    return true;
 504            }
 505        }
 506
 9507        return false;
 1508    }
 509
 510    private void CheckEnterEditMode()
 511    {
 7512        if (catalogAdded && sceneReady)
 7513            EnterEditMode();
 7514    }
 515
 0516    public void TryStartEnterEditMode() { TryStartEnterEditMode(true, null); }
 517
 0518    public void TryStartEnterEditMode(IParcelScene targetScene) { TryStartEnterEditMode(true, targetScene); }
 519
 520    public void TryStartEnterEditMode(bool activateCamera, IParcelScene targetScene = null , string source = "BuilderPan
 521    {
 8522        if (sceneToEditId != null)
 0523            return;
 524
 8525        FindSceneToEdit(targetScene);
 526
 8527        if (!UserHasPermissionOnParcelScene(sceneToEdit))
 528        {
 0529            ShowGenericNotification(BIWSettings.LAND_EDITION_NOT_ALLOWED_BY_PERMISSIONS_MESSAGE);
 0530            return;
 531        }
 8532        else if (IsParcelSceneDeployedFromSDK(sceneToEdit))
 533        {
 0534            ShowGenericNotification(BIWSettings.LAND_EDITION_NOT_ALLOWED_BY_SDK_LIMITATION_MESSAGE);
 0535            return;
 536        }
 537
 538        //If the scene is still not loaded, we return as we still can't enter in builder in world
 8539        if (sceneToEditId != null)
 0540            return;
 541
 8542        isEnteringEditMode = true;
 8543        previousAllUIHidden = CommonScriptableObjects.allUIHidden.Get();
 8544        NotificationsController.i.allowNotifications = false;
 8545        CommonScriptableObjects.allUIHidden.Set(true);
 8546        NotificationsController.i.allowNotifications = true;
 8547        inputController.inputTypeMode = InputTypeMode.BUILD_MODE_LOADING;
 8548        initialLoadingController.Show();
 8549        initialLoadingController.SetPercentage(0f);
 8550        DataStore.i.appMode.Set(AppMode.BUILDER_IN_WORLD_EDITION);
 8551        DataStore.i.virtualAudioMixer.sceneSFXVolume.Set(0f);
 8552        BIWAnalytics.StartEditorFlow(source);
 8553        beginStartFlowTimeStamp = Time.realtimeSinceStartup;
 554
 8555        biwAudioHandler.gameObject.SetActive(true);
 556        //Note (Adrian) this should handle different when we have the full flow of the feature
 8557        if (activateCamera)
 1558            modeController.ActivateCamera(sceneToEdit);
 559
 8560        if (catalogAdded)
 7561            StartEditMode();
 8562    }
 563
 564    private void StartEditMode()
 565    {
 15566        if (sceneToEdit == null)
 8567            return;
 568
 7569        isEnteringEditMode = true;
 570
 7571        Environment.i.platform.cullingController.Stop();
 572
 7573        sceneToEditId = sceneToEdit.sceneData.id;
 574
 575        // In this point we're sure that the catalog loading (the first half of our progress bar) has already finished
 7576        initialLoadingController.SetPercentage(50f);
 7577        Environment.i.world.sceneController.OnNewSceneAdded += NewSceneAdded;
 7578        Environment.i.world.sceneController.OnReadyScene += NewSceneReady;
 7579        Environment.i.world.blockersController.SetEnabled(false);
 580
 7581        builderInWorldBridge.StartKernelEditMode(sceneToEdit);
 7582    }
 583
 584    private void EnterEditMode()
 585    {
 7586        if (!initialLoadingController.isActive)
 0587            return;
 588
 7589        isEnteringEditMode = false;
 7590        BIWNFTController.i.ClearNFTs();
 591
 7592        ParcelSettings.VISUAL_LOADING_ENABLED = false;
 593
 7594        sceneToEdit.SetEditMode(true);
 7595        cursorGO.SetActive(false);
 7596        parcelUnityMiddlePoint = BIWUtils.CalculateUnityMiddlePoint(sceneToEdit);
 597
 7598        if (HUDController.i.builderInWorldMainHud != null)
 599        {
 7600            HUDController.i.builderInWorldMainHud.SetParcelScene(sceneToEdit);
 7601            HUDController.i.builderInWorldMainHud.RefreshCatalogContent();
 7602            HUDController.i.builderInWorldMainHud.RefreshCatalogAssetPack();
 7603            HUDController.i.builderInWorldMainHud.SetVisibilityOfCatalog(true);
 7604            HUDController.i.builderInWorldMainHud.SetVisibilityOfInspector(true);
 605        }
 606
 7607        CommonScriptableObjects.builderInWorldNotNecessaryUIVisibilityStatus.Set(false);
 7608        DataStore.i.builderInWorld.showTaskBar.Set(true);
 609
 7610        DCLCharacterController.OnPositionSet += ExitAfterCharacterTeleport;
 611
 7612        EnterBiwControllers();
 7613        Environment.i.world.sceneController.ActivateBuilderInWorldEditScene();
 614
 7615        initialLoadingController.SetPercentage(100f);
 616
 7617        if (IsNewScene())
 618        {
 0619            floorHandler.OnAllParcelsFloorLoaded -= OnAllParcelsFloorLoaded;
 0620            floorHandler.OnAllParcelsFloorLoaded += OnAllParcelsFloorLoaded;
 0621            SetupNewScene();
 0622        }
 623        else
 624        {
 7625            initialLoadingController.Hide(onHideAction: () =>
 626            {
 0627                inputController.inputTypeMode = InputTypeMode.BUILD_MODE;
 0628                HUDController.i.builderInWorldMainHud?.SetVisibility(true);
 0629                CommonScriptableObjects.allUIHidden.Set(previousAllUIHidden);
 0630                OpenNewProjectDetailsIfNeeded();
 0631            });
 632        }
 633
 7634        isBuilderInWorldActivated = true;
 635
 7636        previousSkyBoxMaterial = RenderSettings.skybox;
 7637        RenderSettings.skybox = skyBoxMaterial;
 638
 14639        foreach (var groundVisual in groundVisualsGO)
 640        {
 0641            groundVisual.SetActive(false);
 642        }
 7643        startEditorTimeStamp = Time.realtimeSinceStartup;
 644
 7645        BIWAnalytics.AddSceneInfo(sceneToEdit.sceneData.basePosition, BIWUtils.GetLandOwnershipType(DataStore.i.builderI
 7646        BIWAnalytics.EnterEditor( Time.realtimeSinceStartup - beginStartFlowTimeStamp);
 7647    }
 648
 649    internal void OnAllParcelsFloorLoaded()
 650    {
 1651        if (!initialLoadingController.isActive)
 0652            return;
 653
 1654        floorHandler.OnAllParcelsFloorLoaded -= OnAllParcelsFloorLoaded;
 1655        initialLoadingController.Hide(onHideAction: () =>
 656        {
 0657            inputController.inputTypeMode = InputTypeMode.BUILD_MODE;
 0658            HUDController.i.builderInWorldMainHud.SetVisibility(true);
 0659            CommonScriptableObjects.allUIHidden.Set(previousAllUIHidden);
 0660            OpenNewProjectDetailsIfNeeded();
 0661        });
 1662    }
 663
 664    private void OpenNewProjectDetailsIfNeeded()
 665    {
 0666        if (builderInWorldBridge.builderProject.isNewEmptyProject)
 0667            modeController.OpenNewProjectDetails();
 0668    }
 669
 670    public void StartExitMode()
 671    {
 1672        if (saveController.GetSaveTimes() > 0)
 673        {
 1674            modeController.TakeSceneScreenshotForExit();
 675
 1676            if ( HUDController.i.builderInWorldMainHud != null)
 1677                HUDController.i.builderInWorldMainHud.ConfigureConfirmationModal(
 678                    BIWSettings.EXIT_MODAL_TITLE,
 679                    BIWSettings.EXIT_WITHOUT_PUBLISH_MODAL_SUBTITLE,
 680                    BIWSettings.EXIT_WITHOUT_PUBLISH_MODAL_CANCEL_BUTTON,
 681                    BIWSettings.EXIT_WITHOUT_PUBLISH_MODAL_CONFIRM_BUTTON);
 1682        }
 683        else
 684        {
 0685            HUDController.i.builderInWorldMainHud.ConfigureConfirmationModal(
 686                BIWSettings.EXIT_MODAL_TITLE,
 687                BIWSettings.EXIT_MODAL_SUBTITLE,
 688                BIWSettings.EXIT_MODAL_CANCEL_BUTTON,
 689                BIWSettings.EXIT_MODAL_CONFIRM_BUTTON);
 690        }
 0691    }
 692
 693    public void ExitEditMode()
 694    {
 4695        Environment.i.platform.cullingController.Start();
 696
 4697        floorHandler.OnAllParcelsFloorLoaded -= OnAllParcelsFloorLoaded;
 4698        initialLoadingController.Hide(true);
 4699        inputController.inputTypeMode = InputTypeMode.GENERAL;
 700
 4701        CommonScriptableObjects.builderInWorldNotNecessaryUIVisibilityStatus.Set(true);
 4702        DataStore.i.builderInWorld.showTaskBar.Set(true);
 703
 4704        ParcelSettings.VISUAL_LOADING_ENABLED = true;
 705
 4706        outlinerController.CancelAllOutlines();
 707
 4708        cursorGO.SetActive(true);
 709
 4710        if (sceneToEdit != null)
 4711            sceneToEdit.SetEditMode(false);
 712
 4713        DCLCharacterController.OnPositionSet -= ExitAfterCharacterTeleport;
 714
 4715        InmediateExit();
 716
 4717        if (HUDController.i.builderInWorldMainHud != null)
 718        {
 4719            HUDController.i.builderInWorldMainHud.ClearEntityList();
 4720            HUDController.i.builderInWorldMainHud.SetVisibility(false);
 721        }
 722
 4723        Environment.i.world.sceneController.DeactivateBuilderInWorldEditScene();
 4724        Environment.i.world.blockersController.SetEnabled(true);
 725
 4726        ExitBiwControllers();
 727
 8728        foreach (var groundVisual in groundVisualsGO)
 729        {
 0730            groundVisual.SetActive(true);
 731        }
 732
 4733        isBuilderInWorldActivated = false;
 4734        RenderSettings.skybox = previousSkyBoxMaterial;
 735
 4736        biwAudioHandler.gameObject.SetActive(false);
 4737        DataStore.i.appMode.Set(AppMode.DEFAULT);
 4738        DataStore.i.virtualAudioMixer.sceneSFXVolume.Set(1f);
 4739        BIWAnalytics.ExitEditor(Time.realtimeSinceStartup - startEditorTimeStamp);
 4740    }
 741
 742    public void InmediateExit()
 743    {
 4744        CommonScriptableObjects.allUIHidden.Set(previousAllUIHidden);
 4745        builderInWorldBridge.ExitKernelEditMode(sceneToEdit);
 4746    }
 747
 748    public void EnterBiwControllers()
 749    {
 192750        foreach (var controller in controllers)
 751        {
 89752            controller.EnterEditMode(sceneToEdit);
 753        }
 754        //Note: This audio should inside the controllers, it is here because it is still a monobehaviour
 7755        biwAudioHandler.EnterEditMode(sceneToEdit);
 7756    }
 757
 758    public void ExitBiwControllers()
 759    {
 106760        foreach (var controller in controllers)
 761        {
 49762            controller.ExitEditMode();
 763        }
 764
 4765        biwAudioHandler.ExitEditMode();
 4766    }
 767
 7768    public bool IsNewScene() { return sceneToEdit.entities.Count <= 0; }
 769
 2770    public void SetupNewScene() { floorHandler.CreateDefaultFloor(); }
 771
 2772    internal void ExitAfterCharacterTeleport(DCLCharacterPosition position) { ExitEditMode(); }
 773
 774    public void FindSceneToEdit(IParcelScene targetScene)
 775    {
 8776        if (targetScene != null)
 777        {
 7778            var parcelSceneTarget = (ParcelScene)targetScene;
 7779            if (sceneToEdit != null && sceneToEdit != parcelSceneTarget)
 0780                actionController.Clear();
 781
 7782            sceneToEdit = parcelSceneTarget;
 7783        }
 784        else
 785        {
 1786            FindSceneToEdit();
 787        }
 1788    }
 789
 790    public IParcelScene FindSceneToEdit()
 791    {
 15792        foreach (IParcelScene scene in Environment.i.world.state.scenesSortedByDistance)
 793        {
 4794            if (WorldStateUtils.IsCharacterInsideScene(scene))
 795            {
 1796                ParcelScene parcelScene = (ParcelScene)scene;
 797
 1798                if (sceneToEdit != null && sceneToEdit != parcelScene)
 0799                    actionController.Clear();
 800
 1801                sceneToEdit = parcelScene;
 1802                return sceneToEdit;
 803            }
 804        }
 3805        return null;
 1806    }
 807
 808    private void OnPlayerTeleportedToEditScene(Vector2Int coords)
 809    {
 0810        if (activeFeature)
 811        {
 0812            var targetScene = Environment.i.world.state.scenesSortedByDistance
 0813                                         .FirstOrDefault(scene => scene.sceneData.parcels.Contains(coords));
 0814            TryStartEnterEditMode(targetScene);
 815        }
 0816    }
 817
 0818    private void UpdateCatalogLoadingProgress(float catalogLoadingProgress) { initialLoadingController.SetPercentage(cat
 819
 0820    private void UpdateSceneLoadingProgress(float sceneLoadingProgress) { initialLoadingController.SetPercentage(50f + (
 821
 822    internal void OnUserProfileUpdate(UserProfile user)
 823    {
 1824        userProfile.OnUpdate -= OnUserProfileUpdate;
 1825        updateLandsWithAcessCoroutine = CoroutineStarter.Start(CheckLandsAccess());
 1826    }
 827
 828    private IEnumerator CheckLandsAccess()
 829    {
 0830        while (true)
 831        {
 4832            UpdateLandsWithAccess();
 4833            yield return WaitForSecondsCache.Get(BIWSettings.REFRESH_LANDS_WITH_ACCESS_INTERVAL);
 834        }
 835    }
 836
 837    private void UpdateLandsWithAccess()
 838    {
 4839        if (isBuilderInWorldActivated)
 0840            return;
 841
 4842        DeployedScenesFetcher.FetchLandsFromOwner(
 843                                 Environment.i.platform.serviceProviders.catalyst,
 844                                 Environment.i.platform.serviceProviders.theGraph,
 845                                 userProfile.ethAddress,
 846                                 KernelConfig.i.Get().network,
 847                                 BIWSettings.CACHE_TIME_LAND,
 848                                 BIWSettings.CACHE_TIME_SCENES)
 849                             .Then(lands =>
 850                             {
 4851                                 DataStore.i.builderInWorld.landsWithAccess.Set(lands.ToArray(), true);
 4852                                 if (isWaitingForPermission && Vector3.Distance(askPermissionLastPosition, DCLCharacterC
 853                                 {
 1854                                     CheckSceneToEditByShorcut();
 855                                 }
 4856                                 isWaitingForPermission = false;
 4857                                 alreadyAskedForLandPermissions = true;
 4858                             });
 4859    }
 860
 861    private static void ShowGenericNotification(string message, NotificationFactory.Type type = NotificationFactory.Type
 862    {
 2863        Notification.Model notificationModel = new Notification.Model();
 2864        notificationModel.message = message;
 2865        notificationModel.type = type;
 2866        notificationModel.timer = timer;
 2867        if (HUDController.i.notificationHud != null)
 0868            HUDController.i.notificationHud.ShowNotification(notificationModel);
 2869    }
 870}

Methods/Properties

BIWMainController()
isBuilderInWorldActivated()
isBuilderInWorldActivated(System.Boolean)
Initialize()
InitReferences(DCL.InitialSceneReferences)
CreateControllers()
InitBuilderProjectPanel()
InitHUD()
Dispose()
OnGUI()
Update()
LateUpdate()
OnNFTUsageChange()
ActivateLandAccessBackgroundChecker()
BuilderProjectPanelInfo(System.String, System.String)
CatalogReceived(System.String)
CatalogLoaded()
CatalogHeadersReceived(System.String)
GetCatalog()
ConfigureLoadingController()
InitControllers()
InitController(IBIWController)
StartTutorial()
CleanItems()
ChangeEditModeStatusByShortcut(DCLAction_Trigger)
CheckSceneToEditByShorcut()
NewSceneAdded(DCL.Controllers.IParcelScene)
NewSceneReady(System.String)
UserHasPermissionOnParcelScene(DCL.Controllers.ParcelScene)
IsParcelSceneDeployedFromSDK(DCL.Controllers.ParcelScene)
CheckEnterEditMode()
TryStartEnterEditMode()
TryStartEnterEditMode(DCL.Controllers.IParcelScene)
TryStartEnterEditMode(System.Boolean, DCL.Controllers.IParcelScene, System.String)
StartEditMode()
EnterEditMode()
OnAllParcelsFloorLoaded()
OpenNewProjectDetailsIfNeeded()
StartExitMode()
ExitEditMode()
InmediateExit()
EnterBiwControllers()
ExitBiwControllers()
IsNewScene()
SetupNewScene()
ExitAfterCharacterTeleport(DCLCharacterPosition)
FindSceneToEdit(DCL.Controllers.IParcelScene)
FindSceneToEdit()
OnPlayerTeleportedToEditScene(UnityEngine.Vector2Int)
UpdateCatalogLoadingProgress(System.Single)
UpdateSceneLoadingProgress(System.Single)
OnUserProfileUpdate(UserProfile)
CheckLandsAccess()
UpdateLandsWithAccess()
ShowGenericNotification(System.String, NotificationFactory/Type, System.Single)