< Summary

Class:DCL.Components.CameraModeArea
Assembly:DCL.Components.CameraModeArea
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Components/CameraModeArea/CameraModeArea.cs
Covered lines:65
Uncovered lines:20
Coverable lines:85
Total lines:214
Line coverage:76.4% (65 of 85)
Covered branches:0
Total branches:0
Covered methods:25
Total methods:35
Method coverage:71.4% (25 of 35)

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
Model()0%110100%
GetDataFromJSON(...)0%110100%
GetDataFromPb(...)0%20400%
CameraModeArea()0%110100%
CameraModeArea()0%110100%
get_cameraMode()0%110100%
get_entity()0%2100%
get_scene()0%2100%
get_componentName()0%110100%
UpdateFromPb(...)0%2100%
UpdateFromJSON(...)0%110100%
UpdateFromModel(...)0%2100%
ApplyChanges(...)0%2100%
RaiseOnAppliedChanges()0%2100%
IsValid()0%2100%
GetModel()0%2100%
GetClassId()0%110100%
GetTransform()0%110100%
Cleanup()0%110100%
Initialize(...)0%330100%
OnModelUpdated(...)0%440100%
Initialize(...)0%110100%
Update()0%440100%
Dispose()0%110100%
IsValidCameraMode(...)0%220100%
IsPlayerInsideArea()0%7.017093.33%
OnAreaDisabled()0%220100%
OnOwnPlayerChange(...)0%2100%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Components/CameraModeArea/CameraModeArea.cs

#LineLine coverage
 1using System;
 2using System.Collections;
 3using DCL.CameraTool;
 4using DCL.Configuration;
 5using DCL.Controllers;
 6using DCL.Helpers;
 7using DCL.Models;
 8using UnityEngine;
 9using Decentraland.Sdk.Ecs6;
 10using MainScripts.DCL.Components;
 11
 12namespace DCL.Components
 13{
 14    public class CameraModeArea : IEntityComponent, ICameraModeArea
 15    {
 16        [Serializable]
 17        public class Model : BaseModel
 18        {
 19            [Serializable]
 20            public class Area
 21            {
 22                public Vector3 box;
 23            }
 24
 2225            public Area area = new ();
 2226            public CameraMode.ModeId cameraMode = CameraMode.ModeId.ThirdPerson;
 27
 28            public override BaseModel GetDataFromJSON(string json) =>
 129                Utils.SafeFromJson<Model>(json);
 30
 31            public override BaseModel GetDataFromPb(ComponentBodyPayload pbModel)
 32            {
 033                if (pbModel.PayloadCase != ComponentBodyPayload.PayloadOneofCase.CameraModeArea)
 034                    return Utils.SafeUnimplemented<CameraModeArea, Model>(expected: ComponentBodyPayload.PayloadOneofCas
 35
 036                var pb = new Model();
 37
 038                if (pbModel.CameraModeArea.Area is { Box: { } })
 039                    pb.area = new Area { box = pbModel.CameraModeArea.Area.Box.AsUnityVector3() };
 40
 041                pb.cameraMode = (CameraMode.ModeId)pbModel.CameraModeArea.CameraMode;
 42
 043                return pb;
 44            }
 45        }
 46
 1847        private static CameraModeAreasController areasController { get; } = new CameraModeAreasController();
 48
 49        private Collider playerCollider;
 50        internal IUpdateEventHandler updateEventHandler;
 1051        internal int validCameraModes = 1 << (int)CameraMode.ModeId.FirstPerson | 1 << (int)CameraMode.ModeId.ThirdPerso
 52
 53        internal bool isPlayerInside = false;
 54
 6755        public Model areaModel { private set; get; } = new Model();
 5656        public IParcelScene areaScene { private set; get; }
 8557        public IDCLEntity areaEntity { private set; get; }
 58
 959        CameraMode.ModeId ICameraModeArea.cameraMode => areaModel.cameraMode;
 60
 061        IDCLEntity IEntityComponent.entity => areaEntity;
 62
 063        IParcelScene IComponent.scene => areaScene;
 64
 465        string IComponent.componentName => "CameraModeArea";
 66
 67
 68
 69        public void UpdateFromPb(ComponentBodyPayload payload)
 70        {
 071            OnModelUpdated(areaModel.GetDataFromPb(payload) as Model);
 072        }
 73
 74        void IComponent.UpdateFromJSON(string json)
 75        {
 176            OnModelUpdated(areaModel.GetDataFromJSON(json) as Model);
 177        }
 78
 79        void IComponent.UpdateFromModel(BaseModel model)
 80        {
 081            OnModelUpdated(model as Model);
 082        }
 83
 084        IEnumerator IComponent.ApplyChanges(BaseModel model) => null;
 85
 086        void IComponent.RaiseOnAppliedChanges() { }
 87
 088        bool IComponent.IsValid() => true;
 89
 090        BaseModel IComponent.GetModel() => areaModel;
 91
 192        int IComponent.GetClassId() => (int)CLASS_ID_COMPONENT.CAMERA_MODE_AREA;
 93
 294        Transform IMonoBehaviour.GetTransform() => null;
 95
 96        void ICleanable.Cleanup()
 97        {
 198            Dispose();
 199            DataStore.i.player.ownPlayer.OnChange -= OnOwnPlayerChange;
 1100        }
 101
 102        void IEntityComponent.Initialize(IParcelScene scene, IDCLEntity entity)
 103        {
 1104            Initialize(scene, entity, Environment.i.platform.updateEventHandler, DataStore.i.player.ownPlayer.Get()?.col
 1105            DataStore.i.player.ownPlayer.OnChange += OnOwnPlayerChange;
 1106        }
 107
 108        internal void OnModelUpdated(in Model newModel)
 109        {
 110            // NOTE: we don't want the ecs to be able to set "builder in world" camera or any other camera
 111            // that might be added in the future. Only first and third person camera are allowed
 12112            if (!IsValidCameraMode(newModel.cameraMode))
 113            {
 1114                newModel.cameraMode = CommonScriptableObjects.cameraMode.Get();
 115            }
 116
 12117            bool cameraModeChanged = newModel.cameraMode != areaModel.cameraMode;
 12118            areaModel = newModel;
 119
 12120            if (cameraModeChanged && isPlayerInside)
 121            {
 1122                areasController.ChangeAreaMode(this);
 123            }
 12124        }
 125
 126        internal void Initialize(in IParcelScene scene, in IDCLEntity entity, in IUpdateEventHandler updateEventHandler,
 127        {
 10128            areaScene = scene;
 10129            areaEntity = entity;
 10130            this.updateEventHandler = updateEventHandler;
 10131            this.playerCollider = playerCollider;
 132
 10133            updateEventHandler.AddListener(IUpdateEventHandler.EventType.Update, Update);
 10134        }
 135
 136        internal void Update()
 137        {
 23138            bool playerInside = IsPlayerInsideArea();
 139
 23140            switch (playerInside)
 141            {
 11142                case true when !isPlayerInside:
 8143                    areasController.AddInsideArea(this);
 8144                    break;
 12145                case false when isPlayerInside:
 7146                    areasController.RemoveInsideArea(this);
 147                    break;
 148            }
 23149            isPlayerInside = playerInside;
 23150        }
 151
 152        internal void Dispose()
 153        {
 10154            OnAreaDisabled();
 10155            updateEventHandler.RemoveListener(IUpdateEventHandler.EventType.Update, Update);
 10156        }
 157
 158        private bool IsValidCameraMode(in CameraMode.ModeId mode)
 159        {
 12160            if (validCameraModes == -1)
 9161                return true;
 162
 3163            return ((1 << (int)mode) & validCameraModes) != 0;
 164        }
 165
 166        private bool IsPlayerInsideArea()
 167        {
 23168            if (areaEntity == null || areaScene == null)
 169            {
 0170                return false;
 171            }
 172
 23173            if (areaScene.sceneData.sceneNumber != CommonScriptableObjects.sceneNumber.Get())
 174            {
 2175                return false;
 176            }
 177
 21178            Vector3 center = areaEntity.gameObject.transform.position;
 21179            Quaternion rotation = areaEntity.gameObject.transform.rotation;
 180
 21181            Collider[] colliders = Physics.OverlapBox(center, areaModel.area.box * 0.5f, rotation,
 182                PhysicsLayers.avatarTriggerMask, QueryTriggerInteraction.Collide);
 183
 21184            if (colliders.Length == 0)
 185            {
 5186                return false;
 187            }
 188
 84189            for (int i = 0; i < colliders.Length; i++)
 190            {
 37191                if (colliders[i] == playerCollider)
 192                {
 11193                    return true;
 194                }
 195            }
 5196            return false;
 197        }
 198
 199        private void OnAreaDisabled()
 200        {
 10201            if (!isPlayerInside)
 202            {
 9203                return;
 204            }
 1205            areasController.RemoveInsideArea(this);
 1206            isPlayerInside = false;
 1207        }
 208
 209        private void OnOwnPlayerChange(Player current, Player previous)
 210        {
 0211            playerCollider = current.collider;
 0212        }
 213    }
 214}