< 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:11
Coverable lines:76
Total lines:192
Line coverage:85.5% (65 of 76)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
Model()0%110100%
GetDataFromJSON(...)0%110100%
CameraModeArea()0%110100%
CameraModeArea()0%110100%
get_cameraMode()0%110100%
get_entity()0%2100%
get_scene()0%2100%
get_componentName()0%110100%
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;
 9
 10namespace DCL.Components
 11{
 12    public class CameraModeArea : IEntityComponent, ICameraModeArea
 13    {
 14        [Serializable]
 15        public class Model : BaseModel
 16        {
 17            [Serializable]
 18            public class Area
 19            {
 20                public Vector3 box;
 21            }
 22
 2223            public Area area = new Area();
 2224            public CameraMode.ModeId cameraMode = CameraMode.ModeId.ThirdPerson;
 25
 26            public override BaseModel GetDataFromJSON(string json)
 27            {
 128                return Utils.SafeFromJson<Model>(json);
 29            }
 30        }
 31
 1832        private static CameraModeAreasController areasController { get; } = new CameraModeAreasController();
 33
 34        private Collider playerCollider;
 35        internal IUpdateEventHandler updateEventHandler;
 1036        internal int validCameraModes = 1 << (int)CameraMode.ModeId.FirstPerson | 1 << (int)CameraMode.ModeId.ThirdPerso
 37
 38        internal bool isPlayerInside = false;
 39
 6740        public Model areaModel { private set; get; } = new Model();
 5641        public IParcelScene areaScene { private set; get; }
 8542        public IDCLEntity areaEntity { private set; get; }
 43
 944        CameraMode.ModeId ICameraModeArea.cameraMode => areaModel.cameraMode;
 45
 046        IDCLEntity IEntityComponent.entity => areaEntity;
 47
 048        IParcelScene IComponent.scene => areaScene;
 49
 450        string IComponent.componentName => "CameraModeArea";
 51
 52        void IComponent.UpdateFromJSON(string json)
 53        {
 154            OnModelUpdated(areaModel.GetDataFromJSON(json) as Model);
 155        }
 56
 57        void IComponent.UpdateFromModel(BaseModel model)
 58        {
 059            OnModelUpdated(model as Model);
 060        }
 61
 062        IEnumerator IComponent.ApplyChanges(BaseModel model) => null;
 63
 064        void IComponent.RaiseOnAppliedChanges() { }
 65
 066        bool IComponent.IsValid() => true;
 67
 068        BaseModel IComponent.GetModel() => areaModel;
 69
 170        int IComponent.GetClassId() => (int)CLASS_ID_COMPONENT.CAMERA_MODE_AREA;
 71
 272        Transform IMonoBehaviour.GetTransform() => null;
 73
 74        void ICleanable.Cleanup()
 75        {
 176            Dispose();
 177            DataStore.i.player.ownPlayer.OnChange -= OnOwnPlayerChange;
 178        }
 79
 80        void IEntityComponent.Initialize(IParcelScene scene, IDCLEntity entity)
 81        {
 182            Initialize(scene, entity, Environment.i.platform.updateEventHandler, DataStore.i.player.ownPlayer.Get()?.col
 183            DataStore.i.player.ownPlayer.OnChange += OnOwnPlayerChange;
 184        }
 85
 86        internal void OnModelUpdated(in Model newModel)
 87        {
 88            // NOTE: we don't want the ecs to be able to set "builder in world" camera or any other camera
 89            // that might be added in the future. Only first and third person camera are allowed
 1290            if (!IsValidCameraMode(newModel.cameraMode))
 91            {
 192                newModel.cameraMode = CommonScriptableObjects.cameraMode.Get();
 93            }
 94
 1295            bool cameraModeChanged = newModel.cameraMode != areaModel.cameraMode;
 1296            areaModel = newModel;
 97
 1298            if (cameraModeChanged && isPlayerInside)
 99            {
 1100                areasController.ChangeAreaMode(this);
 101            }
 12102        }
 103
 104        internal void Initialize(in IParcelScene scene, in IDCLEntity entity, in IUpdateEventHandler updateEventHandler,
 105        {
 10106            areaScene = scene;
 10107            areaEntity = entity;
 10108            this.updateEventHandler = updateEventHandler;
 10109            this.playerCollider = playerCollider;
 110
 10111            updateEventHandler.AddListener(IUpdateEventHandler.EventType.Update, Update);
 10112        }
 113
 114        internal void Update()
 115        {
 23116            bool playerInside = IsPlayerInsideArea();
 117
 23118            switch (playerInside)
 119            {
 11120                case true when !isPlayerInside:
 8121                    areasController.AddInsideArea(this);
 8122                    break;
 12123                case false when isPlayerInside:
 7124                    areasController.RemoveInsideArea(this);
 125                    break;
 126            }
 23127            isPlayerInside = playerInside;
 23128        }
 129
 130        internal void Dispose()
 131        {
 10132            OnAreaDisabled();
 10133            updateEventHandler.RemoveListener(IUpdateEventHandler.EventType.Update, Update);
 10134        }
 135
 136        private bool IsValidCameraMode(in CameraMode.ModeId mode)
 137        {
 12138            if (validCameraModes == -1)
 9139                return true;
 140
 3141            return ((1 << (int)mode) & validCameraModes) != 0;
 142        }
 143
 144        private bool IsPlayerInsideArea()
 145        {
 23146            if (areaEntity == null || areaScene == null)
 147            {
 0148                return false;
 149            }
 150
 23151            if (areaScene.sceneData.sceneNumber != CommonScriptableObjects.sceneNumber.Get())
 152            {
 2153                return false;
 154            }
 155
 21156            Vector3 center = areaEntity.gameObject.transform.position;
 21157            Quaternion rotation = areaEntity.gameObject.transform.rotation;
 158
 21159            Collider[] colliders = Physics.OverlapBox(center, areaModel.area.box * 0.5f, rotation,
 160                PhysicsLayers.avatarTriggerMask, QueryTriggerInteraction.Collide);
 161
 21162            if (colliders.Length == 0)
 163            {
 5164                return false;
 165            }
 166
 84167            for (int i = 0; i < colliders.Length; i++)
 168            {
 37169                if (colliders[i] == playerCollider)
 170                {
 11171                    return true;
 172                }
 173            }
 5174            return false;
 175        }
 176
 177        private void OnAreaDisabled()
 178        {
 10179            if (!isPlayerInside)
 180            {
 9181                return;
 182            }
 1183            areasController.RemoveInsideArea(this);
 1184            isPlayerInside = false;
 1185        }
 186
 187        private void OnOwnPlayerChange(Player current, Player previous)
 188        {
 0189            playerCollider = current.collider;
 0190        }
 191    }
 192}