< Summary

Class:BuilderInWorld
Assembly:BuilderInWorld
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/BuilderMode/BuilderInWorld.cs
Covered lines:359
Uncovered lines:94
Coverable lines:453
Total lines:893
Line coverage:79.2% (359 of 453)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
BuilderInWorld()0%110100%
BuilderInWorld(...)0%2100%
Initialize()0%44096.55%
AskHeadersToKernel()0%220100%
InitReferences(...)0%2.022081.82%
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.043083.33%
BuilderProjectPanelInfo(...)0%2100%
CatalogReceived(...)0%220100%
CatalogLoaded()0%220100%
CatalogHeadersReceived(...)0%2.032080%
GetCatalog()0%7.734038.46%
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%5.015093.55%
InmediateExit()0%110100%
EnterBiwControllers()0%220100%
ExitBiwControllers()0%330100%
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%220100%
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/BuilderInWorld.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 BuilderInWorld : 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
 023    internal IBIWOutlinerController outlinerController => context.outlinerController;
 024    internal IBIWInputHandler inputHandler => context.inputHandler;
 025    internal IBIWPublishController publishController => context.publishController;
 026    internal IBIWCreatorController creatorController => context.creatorController;
 027    internal IBIWModeController modeController => context.modeController;
 028    internal IBIWFloorHandler floorHandler => context.floorHandler;
 029    internal IBIWEntityHandler entityHandler => context.entityHandler;
 030    internal IBIWActionController actionController => context.actionController;
 031    internal IBIWSaveController saveController => context.saveController;
 032    internal IBIWInputWrapper inputWrapper => context.inputWrapper;
 033    internal IBIWRaycastController raycastController => context.raycastController;
 034    internal IBIWGizmosController gizmosController => context.gizmosController;
 35
 36    private BuilderInWorldBridge builderInWorldBridge;
 37    private BuilderInWorldAudioHandler biwAudioHandler;
 38    internal BIWContext context;
 39
 2540    private readonly List<IBIWController> controllers = new List<IBIWController>();
 41
 42    internal ParcelScene sceneToEdit;
 43    private BiwSceneMetricsAnalyticsHelper sceneMetricsAnalyticsHelper;
 44
 45    private Material skyBoxMaterial;
 46
 047    public bool isBuilderInWorldActivated { get; internal set; } = false;
 48
 49    private InputAction_Trigger editModeChangeInputAction;
 50
 51    internal int checkerInsideSceneOptimizationCounter = 0;
 52    internal string sceneToEditId;
 53    internal bool catalogAdded = false;
 54    private bool sceneReady = false;
 55    private bool isInit = false;
 56    private Material previousSkyBoxMaterial;
 57    private Vector3 parcelUnityMiddlePoint;
 58    private bool previousAllUIHidden;
 59    private WebRequestAsyncOperation catalogAsyncOp;
 60    private bool isCatalogLoading = false;
 61    private bool areCatalogHeadersAsked = false;
 62    internal bool areCatalogHeadersReady = false;
 63    private float beginStartFlowTimeStamp = 0;
 64    private float startEditorTimeStamp = 0;
 65    internal bool isCatalogRequested = false;
 66    internal bool isEnteringEditMode = false;
 67    private bool activeFeature = false;
 68    private int catalogsReceivedAmount = 0;
 69
 70    internal IBuilderInWorldLoadingController initialLoadingController;
 71
 72    private UserProfile userProfile;
 73    internal Coroutine updateLandsWithAcessCoroutine;
 74    private Dictionary<string, string> catalogCallHeaders;
 75
 76    internal bool isWaitingForPermission = false;
 77    private bool alreadyAskedForLandPermissions = false;
 78    private Vector3 askPermissionLastPosition;
 79
 2580    public BuilderInWorld()
 81    {
 2582        context = new BIWContext();
 2583        context.Initialize(
 84            new BIWOutlinerController(),
 85            new BIWInputHandler(),
 86            new BIWInputWrapper(),
 87            new BIWPublishController(),
 88            new BIWCreatorController(),
 89            new BIWModeController(),
 90            new BIWFloorHandler(),
 91            new BIWEntityHandler(),
 92            new BIWActionController(),
 93            new BIWSaveController(),
 94            new BIWRaycastController(),
 95            new BIWGizmosController(),
 96            InitialSceneReferences.i.data
 97        );
 2598    }
 99
 0100    public BuilderInWorld (BIWContext context) { this.context = context; }
 101
 102    public override void Initialize()
 103    {
 25104        base.Initialize();
 105
 25106        if (isInit)
 0107            return;
 108
 25109        activeFeature = true;
 25110        isInit = true;
 111
 112        //We init the lands so we don't have a null reference
 25113        DataStore.i.builderInWorld.landsWithAccess.Set(new LandWithAccess[0]);
 114
 25115        BIWCatalogManager.Init();
 116
 25117        InitReferences(InitialSceneReferences.i.data);
 118
 25119        if (builderInWorldBridge != null)
 120        {
 25121            builderInWorldBridge.OnCatalogHeadersReceived += CatalogHeadersReceived;
 25122            builderInWorldBridge.OnBuilderProjectInfo += BuilderProjectPanelInfo;
 123        }
 124
 25125        InitHUD();
 126
 25127        BIWTeleportAndEdit.OnTeleportEnd += OnPlayerTeleportedToEditScene;
 128
 25129        ConfigureLoadingController();
 25130        InitControllers();
 131
 25132        CommonScriptableObjects.builderInWorldNotNecessaryUIVisibilityStatus.Set(true);
 133
 25134        userProfile = UserProfile.GetOwnUserProfile();
 135
 25136        if (string.IsNullOrEmpty(userProfile.userId))
 1137            userProfile.OnUpdate += OnUserProfileUpdate;
 138        else
 24139            AskHeadersToKernel();
 140
 141
 25142        isCatalogLoading = true;
 25143        BIWNFTController.i.Initialize();
 25144        BIWNFTController.i.OnNFTUsageChange += OnNFTUsageChange;
 145
 25146        editModeChangeInputAction = context.inputsReferencesAsset.editModeChangeInputAction;
 25147        editModeChangeInputAction.OnTriggered += ChangeEditModeStatusByShortcut;
 148
 25149        biwAudioHandler = UnityEngine.Object.Instantiate(context.projectReferencesAsset.audioPrefab, Vector3.zero, Quate
 25150        biwAudioHandler.Initialize(context);
 25151        biwAudioHandler.gameObject.SetActive(false);
 25152    }
 153
 154    private void AskHeadersToKernel()
 155    {
 27156        string ethAddress =  string.IsNullOrEmpty(userProfile.ethAddress) ? "default" : userProfile.ethAddress;
 27157        areCatalogHeadersAsked = true;
 27158        builderInWorldBridge.AskKernelForCatalogHeadersWithParams("get", "/assetPacks?owner=" + ethAddress);
 27159    }
 160
 161    public void InitReferences(InitialSceneReferences.Data sceneReferences)
 162    {
 25163        builderInWorldBridge = sceneReferences.builderInWorldBridge;
 25164        cursorGO = sceneReferences.cursorCanvas;
 25165        inputController = sceneReferences.inputController;
 166
 25167        List<GameObject> grounds = new List<GameObject>();
 168
 50169        for (int i = 0; i < sceneReferences.groundVisual.transform.transform.childCount; i++)
 170        {
 0171            grounds.Add(sceneReferences.groundVisual.transform.transform.GetChild(i).gameObject);
 172        }
 173
 25174        groundVisualsGO = grounds.ToArray();
 25175        skyBoxMaterial = context.projectReferencesAsset.skyBoxMaterial;
 25176    }
 177
 178    private void InitBuilderProjectPanel()
 179    {
 0180        if (HUDController.i.builderProjectsPanelController != null)
 0181            HUDController.i.builderProjectsPanelController.OnJumpInOrEdit += GetCatalog;
 0182    }
 183
 184    private void InitHUD()
 185    {
 25186        HUDConfiguration hudConfig = new HUDConfiguration();
 25187        hudConfig.active = true;
 25188        hudConfig.visible = false;
 25189        HUDController.i.CreateHudElement(hudConfig, HUDElementID.BUILDER_IN_WORLD_MAIN);
 25190        HUDController.i.OnBuilderProjectPanelCreation += InitBuilderProjectPanel;
 191
 25192        HUDController.i.builderInWorldMainHud.Initialize();
 193
 25194        HUDController.i.builderInWorldMainHud.OnTutorialAction += StartTutorial;
 25195        HUDController.i.builderInWorldMainHud.OnStartExitAction += StartExitMode;
 25196        HUDController.i.builderInWorldMainHud.OnLogoutAction += ExitEditMode;
 197
 25198        if (HUDController.i.builderProjectsPanelController != null)
 0199            HUDController.i.builderProjectsPanelController.OnJumpInOrEdit += GetCatalog;
 25200    }
 201
 202    public override void Dispose()
 203    {
 25204        base.Dispose();
 205
 25206        sceneMetricsAnalyticsHelper?.Dispose();
 207
 25208        if (userProfile != null)
 25209            userProfile.OnUpdate -= OnUserProfileUpdate;
 210
 25211        CoroutineStarter.Stop(updateLandsWithAcessCoroutine);
 212
 25213        if (sceneToEdit != null)
 13214            sceneToEdit.OnLoadingStateUpdated -= UpdateSceneLoadingProgress;
 215
 25216        Environment.i.world.sceneController.OnNewSceneAdded -= NewSceneAdded;
 25217        Environment.i.world.sceneController.OnReadyScene -= NewSceneReady;
 218
 25219        if (HUDController.i.builderInWorldMainHud != null)
 220        {
 25221            HUDController.i.builderInWorldMainHud.OnTutorialAction -= StartTutorial;
 25222            HUDController.i.builderInWorldMainHud.OnStartExitAction -= StartExitMode;
 25223            HUDController.i.builderInWorldMainHud.OnLogoutAction -= ExitEditMode;
 224        }
 225
 25226        BIWTeleportAndEdit.OnTeleportEnd -= OnPlayerTeleportedToEditScene;
 25227        DCLCharacterController.OnPositionSet -= ExitAfterCharacterTeleport;
 228
 25229        if (initialLoadingController != null)
 25230            initialLoadingController.Dispose();
 231
 25232        BIWNFTController.i.OnNFTUsageChange -= OnNFTUsageChange;
 233
 25234        BIWNFTController.i.Dispose();
 25235        builderInWorldBridge.OnCatalogHeadersReceived -= CatalogHeadersReceived;
 25236        builderInWorldBridge.OnBuilderProjectInfo -= BuilderProjectPanelInfo;
 237
 25238        floorHandler.OnAllParcelsFloorLoaded -= OnAllParcelsFloorLoaded;
 239
 25240        CleanItems();
 241
 25242        HUDController.i.OnBuilderProjectPanelCreation -= InitBuilderProjectPanel;
 25243        editModeChangeInputAction.OnTriggered -= ChangeEditModeStatusByShortcut;
 244
 25245        if (biwAudioHandler.gameObject != null)
 246        {
 25247            biwAudioHandler.Dispose();
 25248            UnityEngine.Object.Destroy(biwAudioHandler.gameObject);
 249        }
 250
 25251        context.Dispose();
 25252    }
 253
 254    public override void OnGUI()
 255    {
 1256        base.OnGUI();
 1257        if (!isBuilderInWorldActivated)
 0258            return;
 259
 28260        foreach (var controller in controllers)
 261        {
 13262            controller.OnGUI();
 263        }
 1264    }
 265
 266    public override void Update()
 267    {
 3268        base.Update();
 269
 3270        if (isCatalogLoading && catalogAsyncOp?.webRequest != null)
 0271            UpdateCatalogLoadingProgress(catalogAsyncOp.webRequest.downloadProgress * 100);
 272
 3273        if (!isBuilderInWorldActivated)
 1274            return;
 275
 54276        foreach (var controller in controllers)
 277        {
 25278            controller.Update();
 279        }
 280
 2281        if (checkerInsideSceneOptimizationCounter >= 60)
 282        {
 1283            if (Vector3.Distance(DCLCharacterController.i.characterPosition.unityPosition, parcelUnityMiddlePoint) >= DI
 1284                ExitEditMode();
 1285            checkerInsideSceneOptimizationCounter = 0;
 1286        }
 287        else
 288        {
 1289            checkerInsideSceneOptimizationCounter++;
 290        }
 1291    }
 292
 293    public override void LateUpdate()
 294    {
 1295        if (!isBuilderInWorldActivated)
 0296            return;
 297
 28298        foreach (var controller in controllers)
 299        {
 13300            controller.LateUpdate();
 301        }
 1302    }
 303
 304    private void OnNFTUsageChange()
 305    {
 0306        HUDController.i.builderInWorldMainHud.RefreshCatalogAssetPack();
 0307        HUDController.i.builderInWorldMainHud.RefreshCatalogContent();
 0308    }
 309
 310    internal void ActivateLandAccessBackgroundChecker()
 311    {
 3312        userProfile = UserProfile.GetOwnUserProfile();
 3313        if (!string.IsNullOrEmpty(userProfile.userId))
 314        {
 3315            if (updateLandsWithAcessCoroutine != null)
 0316                CoroutineStarter.Stop(updateLandsWithAcessCoroutine);
 3317            updateLandsWithAcessCoroutine = CoroutineStarter.Start(CheckLandsAccess());
 318        }
 3319    }
 320
 0321    private void BuilderProjectPanelInfo(string title, string description) { HUDController.i.builderInWorldMainHud.SetBu
 322
 323    internal void CatalogReceived(string catalogJson)
 324    {
 2325        catalogsReceivedAmount++;
 326
 2327        AssetCatalogBridge.i.AddFullSceneObjectCatalog(catalogJson);
 2328        if (catalogsReceivedAmount >= 2)
 329        {
 1330            isCatalogLoading = false;
 1331            CatalogLoaded();
 332        }
 2333    }
 334
 335    public void CatalogLoaded()
 336    {
 8337        catalogAdded = true;
 8338        if (HUDController.i.builderInWorldMainHud != null)
 8339            HUDController.i.builderInWorldMainHud.RefreshCatalogContent();
 8340        StartEditMode();
 8341    }
 342
 343    internal void CatalogHeadersReceived(string rawHeaders)
 344    {
 1345        catalogCallHeaders = JsonConvert.DeserializeObject<Dictionary<string, string>>(rawHeaders);
 1346        areCatalogHeadersReady = true;
 1347        if (isCatalogRequested)
 0348            GetCatalog();
 1349    }
 350
 351    internal void GetCatalog()
 352    {
 2353        if (catalogAdded)
 0354            return;
 355
 2356        if (areCatalogHeadersReady)
 357        {
 0358            string ethAddress = "";
 0359            var userProfile = UserProfile.GetOwnUserProfile();
 0360            if (userProfile != null)
 0361                ethAddress = userProfile.ethAddress;
 0362            catalogAsyncOp = BIWUtils.MakeGetCall(BIWUrlUtils.GetUrlCatalog(ethAddress), CatalogReceived, catalogCallHea
 0363            catalogAsyncOp = BIWUtils.MakeGetCall(BIWUrlUtils.GetUrlCatalog(""), CatalogReceived, catalogCallHeaders);
 0364        }
 365        else
 366        {
 2367            AskHeadersToKernel();
 368        }
 369
 2370        isCatalogRequested = true;
 2371    }
 372
 373    private void ConfigureLoadingController()
 374    {
 25375        initialLoadingController = new BuilderInWorldLoadingController();
 25376        initialLoadingController.Initialize();
 25377    }
 378
 379    private void InitControllers()
 380    {
 25381        InitController(entityHandler);
 25382        InitController(modeController);
 25383        InitController(publishController);
 25384        InitController(creatorController);
 25385        InitController(outlinerController);
 25386        InitController(floorHandler);
 25387        InitController(inputHandler);
 25388        InitController(saveController);
 25389        InitController(actionController);
 25390        InitController(inputWrapper);
 25391        InitController(raycastController);
 25392        InitController(gizmosController);
 25393    }
 394
 395    public void InitController(IBIWController controller)
 396    {
 307397        controller.Initialize(context);
 307398        controllers.Add(controller);
 307399    }
 400
 0401    private void StartTutorial() { TutorialController.i.SetBuilderInWorldTutorialEnabled(); }
 402
 403    public void CleanItems()
 404    {
 25405        if (HUDController.i.builderInWorldMainHud != null)
 25406            HUDController.i.builderInWorldMainHud.Dispose();
 407
 25408        Camera camera = Camera.main;
 409
 25410        if (camera != null)
 411        {
 25412            BIWOutline outliner = camera.GetComponent<BIWOutline>();
 25413            UnityEngine.Object.Destroy(outliner);
 414        }
 415
 25416        floorHandler?.CleanUp();
 25417        creatorController?.CleanUp();
 25418    }
 419
 420    public void ChangeEditModeStatusByShortcut(DCLAction_Trigger action)
 421    {
 1422        if (!activeFeature)
 0423            return;
 424
 1425        if (isEnteringEditMode)
 0426            return;
 427
 1428        if (isBuilderInWorldActivated)
 429        {
 0430            HUDController.i.builderInWorldMainHud.ExitStart();
 0431            return;
 432        }
 433
 1434        if (DataStore.i.builderInWorld.landsWithAccess.Get().Length == 0 && !alreadyAskedForLandPermissions)
 435        {
 1436            ActivateLandAccessBackgroundChecker();
 1437            ShowGenericNotification(BIWSettings.LAND_EDITION_WAITING_FOR_PERMISSIONS_MESSAGE, DCL.NotificationModel.Type
 1438            isWaitingForPermission = true;
 1439            askPermissionLastPosition = DCLCharacterController.i.characterPosition.unityPosition;
 1440        }
 441        else
 442        {
 0443            CheckSceneToEditByShorcut();
 444        }
 0445    }
 446
 447    internal void CheckSceneToEditByShorcut()
 448    {
 2449        FindSceneToEdit();
 450
 2451        if (!UserHasPermissionOnParcelScene(sceneToEdit))
 452        {
 1453            ShowGenericNotification(BIWSettings.LAND_EDITION_NOT_ALLOWED_BY_PERMISSIONS_MESSAGE);
 1454            return;
 455        }
 456
 1457        if (IsParcelSceneDeployedFromSDK(sceneToEdit))
 458        {
 0459            ShowGenericNotification(BIWSettings.LAND_EDITION_NOT_ALLOWED_BY_SDK_LIMITATION_MESSAGE);
 0460            return;
 461        }
 462
 1463        GetCatalog();
 1464        TryStartEnterEditMode(true, null, "Shortcut");
 1465    }
 466
 467    internal void NewSceneAdded(IParcelScene newScene)
 468    {
 1469        if (newScene.sceneData.id != sceneToEditId)
 0470            return;
 471
 1472        Environment.i.world.sceneController.OnNewSceneAdded -= NewSceneAdded;
 473
 1474        sceneToEdit = (ParcelScene)Environment.i.world.state.GetScene(sceneToEditId);
 1475        sceneMetricsAnalyticsHelper = new BiwSceneMetricsAnalyticsHelper(sceneToEdit);
 1476        sceneToEdit.OnLoadingStateUpdated += UpdateSceneLoadingProgress;
 1477    }
 478
 479    private void NewSceneReady(string id)
 480    {
 7481        if (sceneToEditId != id)
 0482            return;
 483
 7484        sceneToEdit.OnLoadingStateUpdated -= UpdateSceneLoadingProgress;
 7485        Environment.i.world.sceneController.OnReadyScene -= NewSceneReady;
 7486        sceneToEditId = null;
 7487        sceneReady = true;
 7488        CheckEnterEditMode();
 7489    }
 490
 491    internal bool UserHasPermissionOnParcelScene(ParcelScene sceneToCheck)
 492    {
 11493        if (BYPASS_LAND_OWNERSHIP_CHECK)
 10494            return true;
 495
 1496        List<Vector2Int> allParcelsWithAccess = DataStore.i.builderInWorld.landsWithAccess.Get().SelectMany(land => land
 2497        foreach (Vector2Int parcel in allParcelsWithAccess)
 498        {
 0499            if (sceneToCheck.sceneData.parcels.Any(currentParcel => currentParcel.x == parcel.x && currentParcel.y == pa
 0500                return true;
 501        }
 502
 1503        return false;
 0504    }
 505
 506    internal bool IsParcelSceneDeployedFromSDK(ParcelScene sceneToCheck)
 507    {
 13508        List<DeployedScene> allDeployedScenesWithAccess = DataStore.i.builderInWorld.landsWithAccess.Get().SelectMany(la
 21509        foreach (DeployedScene scene in allDeployedScenesWithAccess)
 510        {
 1511            if (scene.source != DeployedScene.Source.SDK)
 512                continue;
 513
 1514            List<Vector2Int> parcelsDeployedFromSDK = scene.parcels.ToList();
 3515            foreach (Vector2Int parcel in parcelsDeployedFromSDK)
 516            {
 2517                if (sceneToCheck.sceneData.parcels.Any(currentParcel => currentParcel.x == parcel.x && currentParcel.y =
 1518                    return true;
 519            }
 520        }
 521
 9522        return false;
 1523    }
 524
 525    private void CheckEnterEditMode()
 526    {
 7527        if (catalogAdded && sceneReady)
 7528            EnterEditMode();
 7529    }
 530
 0531    public void TryStartEnterEditMode() { TryStartEnterEditMode(true, null); }
 532
 0533    public void TryStartEnterEditMode(IParcelScene targetScene) { TryStartEnterEditMode(true, targetScene); }
 534
 535    public void TryStartEnterEditMode(bool activateCamera, IParcelScene targetScene = null , string source = "BuilderPan
 536    {
 8537        if (sceneToEditId != null)
 0538            return;
 539
 8540        FindSceneToEdit(targetScene);
 541
 8542        if (!UserHasPermissionOnParcelScene(sceneToEdit))
 543        {
 0544            ShowGenericNotification(BIWSettings.LAND_EDITION_NOT_ALLOWED_BY_PERMISSIONS_MESSAGE);
 0545            return;
 546        }
 8547        else if (IsParcelSceneDeployedFromSDK(sceneToEdit))
 548        {
 0549            ShowGenericNotification(BIWSettings.LAND_EDITION_NOT_ALLOWED_BY_SDK_LIMITATION_MESSAGE);
 0550            return;
 551        }
 552
 553        //If the scene is still not loaded, we return as we still can't enter in builder in world
 8554        if (sceneToEditId != null)
 0555            return;
 556
 8557        isEnteringEditMode = true;
 8558        previousAllUIHidden = CommonScriptableObjects.allUIHidden.Get();
 8559        NotificationsController.i.allowNotifications = false;
 8560        CommonScriptableObjects.allUIHidden.Set(true);
 8561        NotificationsController.i.allowNotifications = true;
 8562        inputController.inputTypeMode = InputTypeMode.BUILD_MODE_LOADING;
 8563        initialLoadingController.Show();
 8564        initialLoadingController.SetPercentage(0f);
 8565        DataStore.i.appMode.Set(AppMode.BUILDER_IN_WORLD_EDITION);
 8566        DataStore.i.virtualAudioMixer.sceneSFXVolume.Set(0f);
 8567        BIWAnalytics.StartEditorFlow(source);
 8568        beginStartFlowTimeStamp = Time.realtimeSinceStartup;
 569
 8570        biwAudioHandler.gameObject.SetActive(true);
 571        //Note (Adrian) this should handle different when we have the full flow of the feature
 8572        if (activateCamera)
 1573            modeController.ActivateCamera(sceneToEdit);
 574
 8575        if (catalogAdded)
 7576            StartEditMode();
 8577    }
 578
 579    private void StartEditMode()
 580    {
 15581        if (sceneToEdit == null)
 8582            return;
 583
 7584        isEnteringEditMode = true;
 585
 7586        Environment.i.platform.cullingController.Stop();
 587
 7588        sceneToEditId = sceneToEdit.sceneData.id;
 589
 590        // In this point we're sure that the catalog loading (the first half of our progress bar) has already finished
 7591        initialLoadingController.SetPercentage(50f);
 7592        Environment.i.world.sceneController.OnNewSceneAdded += NewSceneAdded;
 7593        Environment.i.world.sceneController.OnReadyScene += NewSceneReady;
 7594        Environment.i.world.blockersController.SetEnabled(false);
 595
 7596        builderInWorldBridge.StartKernelEditMode(sceneToEdit);
 7597    }
 598
 599    private void EnterEditMode()
 600    {
 7601        if (!initialLoadingController.isActive)
 0602            return;
 603
 7604        isEnteringEditMode = false;
 7605        BIWNFTController.i.ClearNFTs();
 606
 7607        ParcelSettings.VISUAL_LOADING_ENABLED = false;
 608
 7609        sceneToEdit.SetEditMode(true);
 7610        cursorGO.SetActive(false);
 7611        parcelUnityMiddlePoint = BIWUtils.CalculateUnityMiddlePoint(sceneToEdit);
 612
 7613        if (HUDController.i.builderInWorldMainHud != null)
 614        {
 7615            HUDController.i.builderInWorldMainHud.SetParcelScene(sceneToEdit);
 7616            HUDController.i.builderInWorldMainHud.RefreshCatalogContent();
 7617            HUDController.i.builderInWorldMainHud.RefreshCatalogAssetPack();
 7618            HUDController.i.builderInWorldMainHud.SetVisibilityOfCatalog(true);
 7619            HUDController.i.builderInWorldMainHud.SetVisibilityOfInspector(true);
 620        }
 621
 7622        CommonScriptableObjects.builderInWorldNotNecessaryUIVisibilityStatus.Set(false);
 7623        DataStore.i.builderInWorld.showTaskBar.Set(true);
 624
 7625        DCLCharacterController.OnPositionSet += ExitAfterCharacterTeleport;
 626
 7627        EnterBiwControllers();
 7628        Environment.i.world.sceneController.ActivateBuilderInWorldEditScene();
 629
 7630        initialLoadingController.SetPercentage(100f);
 631
 7632        if (IsNewScene())
 633        {
 0634            floorHandler.OnAllParcelsFloorLoaded -= OnAllParcelsFloorLoaded;
 0635            floorHandler.OnAllParcelsFloorLoaded += OnAllParcelsFloorLoaded;
 0636            SetupNewScene();
 0637        }
 638        else
 639        {
 7640            initialLoadingController.Hide(onHideAction: () =>
 641            {
 0642                inputController.inputTypeMode = InputTypeMode.BUILD_MODE;
 0643                HUDController.i.builderInWorldMainHud?.SetVisibility(true);
 0644                CommonScriptableObjects.allUIHidden.Set(previousAllUIHidden);
 0645                OpenNewProjectDetailsIfNeeded();
 0646            });
 647        }
 648
 7649        isBuilderInWorldActivated = true;
 650
 7651        previousSkyBoxMaterial = RenderSettings.skybox;
 7652        RenderSettings.skybox = skyBoxMaterial;
 653
 14654        foreach (var groundVisual in groundVisualsGO)
 655        {
 0656            groundVisual.SetActive(false);
 657        }
 658
 7659        startEditorTimeStamp = Time.realtimeSinceStartup;
 660
 7661        BIWAnalytics.AddSceneInfo(sceneToEdit.sceneData.basePosition, BIWUtils.GetLandOwnershipType(DataStore.i.builderI
 7662        BIWAnalytics.EnterEditor( Time.realtimeSinceStartup - beginStartFlowTimeStamp);
 7663    }
 664
 665    internal void OnAllParcelsFloorLoaded()
 666    {
 1667        if (!initialLoadingController.isActive)
 0668            return;
 669
 1670        floorHandler.OnAllParcelsFloorLoaded -= OnAllParcelsFloorLoaded;
 1671        initialLoadingController.Hide(onHideAction: () =>
 672        {
 0673            inputController.inputTypeMode = InputTypeMode.BUILD_MODE;
 0674            HUDController.i.builderInWorldMainHud.SetVisibility(true);
 0675            CommonScriptableObjects.allUIHidden.Set(previousAllUIHidden);
 0676            OpenNewProjectDetailsIfNeeded();
 0677        });
 1678    }
 679
 680    private void OpenNewProjectDetailsIfNeeded()
 681    {
 0682        if (builderInWorldBridge.builderProject.isNewEmptyProject)
 0683            modeController.OpenNewProjectDetails();
 0684    }
 685
 686    public void StartExitMode()
 687    {
 1688        if (saveController.GetSaveTimes() > 0)
 689        {
 1690            modeController.TakeSceneScreenshotForExit();
 691
 1692            if ( HUDController.i.builderInWorldMainHud != null)
 1693                HUDController.i.builderInWorldMainHud.ConfigureConfirmationModal(
 694                    BIWSettings.EXIT_MODAL_TITLE,
 695                    BIWSettings.EXIT_WITHOUT_PUBLISH_MODAL_SUBTITLE,
 696                    BIWSettings.EXIT_WITHOUT_PUBLISH_MODAL_CANCEL_BUTTON,
 697                    BIWSettings.EXIT_WITHOUT_PUBLISH_MODAL_CONFIRM_BUTTON);
 1698        }
 699        else
 700        {
 0701            HUDController.i.builderInWorldMainHud.ConfigureConfirmationModal(
 702                BIWSettings.EXIT_MODAL_TITLE,
 703                BIWSettings.EXIT_MODAL_SUBTITLE,
 704                BIWSettings.EXIT_MODAL_CANCEL_BUTTON,
 705                BIWSettings.EXIT_MODAL_CONFIRM_BUTTON);
 706        }
 0707    }
 708
 709    public void ExitEditMode()
 710    {
 4711        Environment.i.platform.cullingController.Start();
 712
 4713        floorHandler.OnAllParcelsFloorLoaded -= OnAllParcelsFloorLoaded;
 4714        initialLoadingController.Hide(true);
 4715        inputController.inputTypeMode = InputTypeMode.GENERAL;
 716
 4717        CommonScriptableObjects.builderInWorldNotNecessaryUIVisibilityStatus.Set(true);
 4718        DataStore.i.builderInWorld.showTaskBar.Set(true);
 719
 4720        ParcelSettings.VISUAL_LOADING_ENABLED = true;
 721
 4722        outlinerController.CancelAllOutlines();
 723
 4724        cursorGO.SetActive(true);
 725
 4726        if (sceneToEdit != null)
 4727            sceneToEdit.SetEditMode(false);
 728
 4729        DCLCharacterController.OnPositionSet -= ExitAfterCharacterTeleport;
 730
 4731        InmediateExit();
 732
 4733        if (HUDController.i.builderInWorldMainHud != null)
 734        {
 4735            HUDController.i.builderInWorldMainHud.ClearEntityList();
 4736            HUDController.i.builderInWorldMainHud.SetVisibility(false);
 737        }
 738
 4739        Environment.i.world.sceneController.DeactivateBuilderInWorldEditScene();
 4740        Environment.i.world.blockersController.SetEnabled(true);
 741
 4742        ExitBiwControllers();
 743
 8744        foreach (var groundVisual in groundVisualsGO)
 745        {
 0746            groundVisual.SetActive(true);
 747        }
 748
 4749        isBuilderInWorldActivated = false;
 4750        RenderSettings.skybox = previousSkyBoxMaterial;
 751
 4752        if (biwAudioHandler.gameObject != null)
 4753            biwAudioHandler.gameObject.SetActive(false);
 4754        DataStore.i.appMode.Set(AppMode.DEFAULT);
 4755        DataStore.i.virtualAudioMixer.sceneSFXVolume.Set(1f);
 4756        BIWAnalytics.ExitEditor(Time.realtimeSinceStartup - startEditorTimeStamp);
 4757    }
 758
 759    public void InmediateExit()
 760    {
 4761        CommonScriptableObjects.allUIHidden.Set(previousAllUIHidden);
 4762        builderInWorldBridge.ExitKernelEditMode(sceneToEdit);
 4763    }
 764
 765    public void EnterBiwControllers()
 766    {
 218767        foreach (var controller in controllers)
 768        {
 101769            controller.EnterEditMode(sceneToEdit);
 770        }
 771
 772        //Note: This audio should inside the controllers, it is here because it is still a monobehaviour
 8773        biwAudioHandler.EnterEditMode(sceneToEdit);
 8774    }
 775
 776    public void ExitBiwControllers()
 777    {
 106778        foreach (var controller in controllers)
 779        {
 49780            controller.ExitEditMode();
 781        }
 782
 4783        if (biwAudioHandler.gameObject != null)
 4784            biwAudioHandler.ExitEditMode();
 4785    }
 786
 7787    public bool IsNewScene() { return sceneToEdit.entities.Count <= 0; }
 788
 2789    public void SetupNewScene() { floorHandler.CreateDefaultFloor(); }
 790
 2791    internal void ExitAfterCharacterTeleport(DCLCharacterPosition position) { ExitEditMode(); }
 792
 793    public void FindSceneToEdit(IParcelScene targetScene)
 794    {
 8795        if (targetScene != null)
 796        {
 7797            var parcelSceneTarget = (ParcelScene)targetScene;
 7798            if (sceneToEdit != null && sceneToEdit != parcelSceneTarget)
 0799                actionController.Clear();
 800
 7801            sceneToEdit = parcelSceneTarget;
 7802        }
 803        else
 804        {
 1805            FindSceneToEdit();
 806        }
 1807    }
 808
 809    public IParcelScene FindSceneToEdit()
 810    {
 15811        foreach (IParcelScene scene in Environment.i.world.state.scenesSortedByDistance)
 812        {
 4813            if (WorldStateUtils.IsCharacterInsideScene(scene))
 814            {
 1815                ParcelScene parcelScene = (ParcelScene)scene;
 816
 1817                if (sceneToEdit != null && sceneToEdit != parcelScene)
 0818                    actionController.Clear();
 819
 1820                sceneToEdit = parcelScene;
 1821                return sceneToEdit;
 822            }
 823        }
 824
 3825        return null;
 1826    }
 827
 828    private void OnPlayerTeleportedToEditScene(Vector2Int coords)
 829    {
 0830        if (activeFeature)
 831        {
 0832            var targetScene = Environment.i.world.state.scenesSortedByDistance
 0833                .FirstOrDefault(scene => scene.sceneData.parcels.Contains(coords));
 0834            TryStartEnterEditMode(targetScene);
 835        }
 0836    }
 837
 0838    private void UpdateCatalogLoadingProgress(float catalogLoadingProgress) { initialLoadingController.SetPercentage(cat
 839
 0840    private void UpdateSceneLoadingProgress(float sceneLoadingProgress) { initialLoadingController.SetPercentage(50f + (
 841
 842    internal void OnUserProfileUpdate(UserProfile user)
 843    {
 2844        userProfile.OnUpdate -= OnUserProfileUpdate;
 845
 2846        if (!areCatalogHeadersAsked)
 1847            AskHeadersToKernel();
 2848    }
 849
 850    private IEnumerator CheckLandsAccess()
 851    {
 0852        while (true)
 853        {
 3854            UpdateLandsWithAccess();
 3855            yield return WaitForSecondsCache.Get(BIWSettings.REFRESH_LANDS_WITH_ACCESS_INTERVAL);
 856        }
 857    }
 858
 859    private void UpdateLandsWithAccess()
 860    {
 3861        if (isBuilderInWorldActivated)
 0862            return;
 863
 3864        DeployedScenesFetcher.FetchLandsFromOwner(
 865                Environment.i.platform.serviceProviders.catalyst,
 866                Environment.i.platform.serviceProviders.theGraph,
 867                userProfile.ethAddress,
 868                KernelConfig.i.Get().network,
 869                BIWSettings.CACHE_TIME_LAND,
 870                BIWSettings.CACHE_TIME_SCENES)
 871            .Then(lands =>
 872            {
 3873                DataStore.i.builderInWorld.landsWithAccess.Set(lands.ToArray(), true);
 3874                if (isWaitingForPermission && Vector3.Distance(askPermissionLastPosition, DCLCharacterController.i.chara
 875                {
 1876                    CheckSceneToEditByShorcut();
 877                }
 878
 3879                isWaitingForPermission = false;
 3880                alreadyAskedForLandPermissions = true;
 3881            });
 3882    }
 883
 884    private static void ShowGenericNotification(string message, DCL.NotificationModel.Type type = DCL.NotificationModel.
 885    {
 2886        DCL.NotificationModel.Model notificationModel = new DCL.NotificationModel.Model();
 2887        notificationModel.message = message;
 2888        notificationModel.type = type;
 2889        notificationModel.timer = timer;
 2890        if (HUDController.i.notificationHud != null)
 0891            HUDController.i.notificationHud.ShowNotification(notificationModel);
 2892    }
 893}

Methods/Properties

outlinerController()
inputHandler()
publishController()
creatorController()
modeController()
floorHandler()
entityHandler()
actionController()
saveController()
inputWrapper()
raycastController()
gizmosController()
BuilderInWorld()
BuilderInWorld(BIWContext)
isBuilderInWorldActivated()
isBuilderInWorldActivated(System.Boolean)
Initialize()
AskHeadersToKernel()
InitReferences(DCL.InitialSceneReferences/Data)
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, DCL.NotificationModel.Type, System.Single)