< Summary

Class:DCL.Components.CameraModeArea
Assembly:CameraModeArea
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Components/CameraModeArea/CameraModeArea.cs
Covered lines:51
Uncovered lines:20
Coverable lines:71
Total lines:184
Line coverage:71.8% (51 of 71)
Covered branches:0
Total branches:0

Metrics

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

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.Configuration;
 4using DCL.Controllers;
 5using DCL.Helpers;
 6using DCL.Models;
 7using UnityEngine;
 8
 9namespace DCL.Components
 10{
 11    public class CameraModeArea : IEntityComponent, ICameraModeArea
 12    {
 13        [Serializable]
 14        public class Model : BaseModel
 15        {
 16            [Serializable]
 17            public class Area
 18            {
 19                public Vector3 box;
 20            }
 21
 2022            public Area area = new Area();
 2023            public CameraMode.ModeId cameraMode = CameraMode.ModeId.ThirdPerson;
 24
 25            public override BaseModel GetDataFromJSON(string json)
 26            {
 027                return Utils.SafeFromJson<Model>(json);
 28            }
 29        }
 30
 131        private static CameraModeAreasController areasController { get; } = new CameraModeAreasController();
 32
 33        private Collider playerCollider;
 34        internal IUpdateEventHandler updateEventHandler;
 935        internal int validCameraModes = 1 << (int)CameraMode.ModeId.FirstPerson | 1 << (int)CameraMode.ModeId.ThirdPerso
 36
 37        internal bool isPlayerInside = false;
 38
 939        public Model areaModel { private set; get; } = new Model();
 040        public IParcelScene areaScene { private set; get; }
 141        public IDCLEntity areaEntity { private set; get; }
 42
 843        CameraMode.ModeId ICameraModeArea.cameraMode => areaModel.cameraMode;
 44
 045        IDCLEntity IEntityComponent.entity => areaEntity;
 46
 047        IParcelScene IComponent.scene => areaScene;
 48
 049        string IComponent.componentName => "CameraModeArea";
 50
 51        void IComponent.UpdateFromJSON(string json)
 52        {
 053            OnModelUpdated(areaModel.GetDataFromJSON(json) as Model);
 054        }
 55
 56        void IComponent.UpdateFromModel(BaseModel model)
 57        {
 058            OnModelUpdated(model as Model);
 059        }
 60
 061        IEnumerator IComponent.ApplyChanges(BaseModel model) => null;
 62
 063        void IComponent.RaiseOnAppliedChanges() { }
 64
 065        bool IComponent.IsValid() => true;
 66
 067        BaseModel IComponent.GetModel() => areaModel;
 68
 069        int IComponent.GetClassId() => (int)CLASS_ID_COMPONENT.CAMERA_MODE_AREA;
 70
 071        Transform IMonoBehaviour.GetTransform() => areaEntity?.gameObject.transform;
 72
 73        void ICleanable.Cleanup()
 74        {
 075            Dispose();
 076        }
 77
 78        void IEntityComponent.Initialize(IParcelScene scene, IDCLEntity entity)
 79        {
 080            Initialize(scene, entity, Environment.i.platform.updateEventHandler, DataStore.i.player.playerCollider.Get()
 081        }
 82
 83        internal void OnModelUpdated(in Model newModel)
 84        {
 85            // NOTE: we don't want the ecs to be able to set "builder in world" camera or any other camera
 86            // that might be added in the future. Only first and third person camera are allowed
 1187            if (!IsValidCameraMode(newModel.cameraMode))
 88            {
 189                newModel.cameraMode = CommonScriptableObjects.cameraMode.Get();
 90            }
 91
 1192            bool cameraModeChanged = newModel.cameraMode != areaModel.cameraMode;
 1193            areaModel = newModel;
 94
 1195            if (cameraModeChanged && isPlayerInside)
 96            {
 197                areasController.ChangeAreaMode(this, areaModel.cameraMode);
 98            }
 1199        }
 100
 101        internal void Initialize(in IParcelScene scene, in IDCLEntity entity, in IUpdateEventHandler updateEventHandler,
 102        {
 9103            areaScene = scene;
 9104            areaEntity = entity;
 9105            this.updateEventHandler = updateEventHandler;
 9106            this.playerCollider = playerCollider;
 107
 9108            updateEventHandler.AddListener(IUpdateEventHandler.EventType.Update, Update);
 9109        }
 110
 111        internal void Update()
 112        {
 22113            bool playerInside = IsPlayerInsideArea();
 114
 115            switch (playerInside)
 116            {
 11117                case true when !isPlayerInside:
 8118                    areasController.AddInsideArea(this);
 8119                    break;
 11120                case false when isPlayerInside:
 7121                    areasController.RemoveInsideArea(this);
 122                    break;
 123            }
 22124            isPlayerInside = playerInside;
 22125        }
 126
 127        internal void Dispose()
 128        {
 9129            OnAreaDisabled();
 9130            updateEventHandler.RemoveListener(IUpdateEventHandler.EventType.Update, Update);
 9131        }
 132
 133        private bool IsValidCameraMode(in CameraMode.ModeId mode)
 134        {
 11135            if (validCameraModes == -1)
 9136                return true;
 137
 2138            return ((1 << (int)mode) & validCameraModes) != 0;
 139        }
 140
 141        private bool IsPlayerInsideArea()
 142        {
 22143            if (areaEntity == null || areaScene == null)
 144            {
 0145                return false;
 146            }
 147
 22148            if (areaScene.sceneData.id != CommonScriptableObjects.sceneID.Get())
 149            {
 1150                return false;
 151            }
 152
 21153            Vector3 center = areaEntity.gameObject.transform.position;
 21154            Quaternion rotation = areaEntity.gameObject.transform.rotation;
 155
 21156            Collider[] colliders = Physics.OverlapBox(center, areaModel.area.box * 0.5f, rotation,
 157                PhysicsLayers.avatarTriggerMask, QueryTriggerInteraction.Collide);
 158
 21159            if (colliders.Length == 0)
 160            {
 5161                return false;
 162            }
 163
 84164            for (int i = 0; i < colliders.Length; i++)
 165            {
 37166                if (colliders[i] == playerCollider)
 167                {
 11168                    return true;
 169                }
 170            }
 5171            return false;
 172        }
 173
 174        private void OnAreaDisabled()
 175        {
 9176            if (!isPlayerInside)
 177            {
 8178                return;
 179            }
 1180            areasController.RemoveInsideArea(this);
 1181            isPlayerInside = false;
 1182        }
 183    }
 184}