/// <summary> /// Add action doors to parent transform. /// </summary> private void AddActionDoors() { // Using 9000-9005 here but identical door models are also found at 900x, 910x, through to 980x // They seem to be duplicate models but can have different model origins so not all ranges are suitable const int doorModelBaseId = 9000; GameObject actionDoorsNode = new GameObject("Action Doors"); actionDoorsNode.transform.parent = this.transform; foreach (DFBlock.RmbBlockDoorRecord obj in recordData.Interior.BlockDoorRecords) { // Create unique LoadID for save sytem ulong loadID = (ulong)(blockData.Position + obj.Position); // Get model transform Vector3 modelRotation = new Vector3(0, -obj.YRotation / BlocksFile.RotationDivisor, 0); Vector3 modelPosition = new Vector3(obj.XPos, -obj.YPos, obj.ZPos) * MeshReader.GlobalScale; // Instantiate door prefab and add model - DoorModelIndex is modulo to known-good range just in case // A custom prefab can be provided by mods and must include DaggerfallActionDoor component with all requirements. uint modelId = (uint)(doorModelBaseId + obj.DoorModelIndex % 5); GameObject go = MeshReplacement.ImportCustomGameobject(modelId, actionDoorsNode.transform, Matrix4x4.identity); if (!go) { go = GameObjectHelper.InstantiatePrefab(dfUnity.Option_InteriorDoorPrefab.gameObject, string.Empty, actionDoorsNode.transform, Vector3.zero); GameObjectHelper.CreateDaggerfallMeshGameObject(modelId, actionDoorsNode.transform, false, go, true); // Resize box collider to new mesh bounds BoxCollider boxCollider = go.GetComponent <BoxCollider>(); MeshRenderer meshRenderer = go.GetComponent <MeshRenderer>(); if (boxCollider != null && meshRenderer != null) { boxCollider.center = meshRenderer.bounds.center; boxCollider.size = meshRenderer.bounds.size; } // Update climate DaggerfallMesh dfMesh = go.GetComponent <DaggerfallMesh>(); dfMesh.SetClimate(climateBase, climateSeason, WindowStyle.Disabled); } // Apply transforms go.transform.rotation = Quaternion.Euler(modelRotation); go.transform.position = modelPosition; // Get action door script DaggerfallActionDoor actionDoor = go.GetComponent <DaggerfallActionDoor>(); // Assign loadID if (actionDoor) { actionDoor.LoadID = loadID; } if (SaveLoadManager.Instance != null) { go.AddComponent <SerializableActionDoor>(); } } }
/// <summary> /// Used by door actions (open / close / unlock), tries to get DaggerfallActionDoor from object /// returns true if object is a valid action door, false if not /// </summary> public static bool GetDoor(GameObject go, out DaggerfallActionDoor door) { door = null; if (go == null) return false; door = go.GetComponent<DaggerfallActionDoor>(); if (door == null) { DaggerfallUnity.LogMessage(string.Format("No DaggerfallActionDoor component found to unlock door: {0}", go.name)); return false; } else return true; }
/// <summary> /// Used by door actions (open / close / unlock), tries to get DaggerfallActionDoor from object /// returns true if object is a valid action door, false if not /// </summary> public static bool GetDoor(GameObject go, out DaggerfallActionDoor door) { door = null; if (go == null) return false; door = go.GetComponent<DaggerfallActionDoor>(); if (door == null) return false; else return true; }