using Lockpicking; using System; using System.Collections.Generic; using UnityEngine; using Object = UnityEngine.Object; // This class sits between the thirdparty Keyhole script + prefabs and support scripts. public class SphereLocks { private GameObject _lockPick; private GameObject _lockPickAsset; // transforms private List _transforms = new List(); public void Init(BlockValue blockValue, Vector3i blockPos) { // Check if the current block has a pre-defined lockpick prefab var lockPrefab = ""; if (blockValue.type != 0) if (blockValue.Block.Properties.Contains("LockPrefab")) lockPrefab = blockValue.Block.Properties.GetStringValue("LockPrefab"); // Load up the default. if (string.IsNullOrEmpty(lockPrefab)) { // If the globally configured lock pick cotnains Lockset01, assume its the default. lockPrefab = Configuration.GetPropertyValue("AdvancedLockpicking", "LockPrefab"); if (lockPrefab.EndsWith("Lockset01")) { var locks = new List { "Lockset01", "Lockset02", "Lockset03", "Lockset04", "padlock01" }; var randomKey = Math.Abs(blockPos.x % 9); var randomLock = randomKey switch { < 1 => "Lockset01", < 3 => "Lockset02", < 5 => "Lockset03", < 7 => "Lockset04", _ => "padlock01" }; lockPrefab = lockPrefab.Replace("Lockset01", randomLock); } } if (string.IsNullOrEmpty(lockPrefab)) return; try { _lockPickAsset = DataLoader.LoadAsset(lockPrefab); _lockPick = Object.Instantiate(_lockPickAsset); } catch( Exception ex) { Log.Out($"LockPrefab not valid. Falling back to vanilla."); return; } Disable(); // Marked transforms _transforms = new List { "Baseplate1", "Baseplate2", "ButtonInner", "ButtonInner", "ButtonOuter", "Padlock1_low" }; _transforms.AddRange(new List { "Padlock1_Latch_low", "Lock1Outer", "Lock2Outer", "Lock3Outer", "Lock1Inner", "Lock2Inner", "Lock3Inner" }); if (_lockPick.GetComponent() == null) { // Populate the Keyhole var keyhole = _lockPick.AddComponent(); keyhole.keyhole = FindTransform("Keyhole (Turnable)").gameObject; // attach the lock control the to top level LockControls lockControl; if (_lockPick.transform.parent != null) lockControl = _lockPick.transform.parent.gameObject.AddComponent(); else lockControl = _lockPick.transform.gameObject.AddComponent(); lockControl.lockpick = keyhole; // Lock Pick configuration keyhole.lockpickObject = _lockPick.transform.FindInChilds("LockpickB (Turnable)").gameObject; keyhole.lockpickAnimator = FindTransform("LockpickB").GetComponent(); keyhole.lockpickAnimator.gameObject.SetActive(true); keyhole.blockValue = blockValue; var cam = FindTransform("Cam2").GetComponentInChildren(); if (cam != null) { cam.rect = new Rect(0.25f, 0.25f, 0.5f, 0.5f); var lockObjectRotation = keyhole.lockpickObject.transform.gameObject.AddComponent(); lockObjectRotation.uiCam = cam; } var padlock = FindTransform("Padlock1"); if (padlock != null) { keyhole.padlock1 = padlock.gameObject; keyhole.audioPadlockJiggle = FindTransform("Audio Padlock Jiggle").gameObject.AddComponent(); keyhole.audioPadlockOpen = FindTransform("Audio Padlock Open").gameObject.AddComponent(); } // audio configuration keyhole.audioTurnClick = FindTransform("Audio Turn Click").gameObject.AddComponent(); keyhole.audioSqueek = FindTransform("Audio Squeek").gameObject.AddComponent(); keyhole.audioOpen = FindTransform("Audio Open").gameObject.AddComponent(); keyhole.audioJiggle = FindTransform("Audio Jiggle A").gameObject.AddComponent(); keyhole.audioJiggle2 = FindTransform("Audio Jiggle B").gameObject.AddComponent(); keyhole.audioJiggle3 = FindTransform("Audio Jiggle C").gameObject.AddComponent(); keyhole.audioLockpickBreak = FindTransform("Audio Lockpick Break").gameObject.AddComponent(); keyhole.audioLockpickEnter = FindTransform("Audio Lockpick Enter").gameObject.AddComponent(); keyhole.audioLockpickClick = FindTransform("Audio Lockpick Click").gameObject.AddComponent(); var lockEmissive = _lockPick.AddComponent(); // lockEmissive.off = true; var lstRenders = new List(); var tempRender = new Renderer[12]; foreach (var transform in _transforms) { var temp = FindTransform(transform); if (temp) lstRenders.Add(FindTransform(transform).GetComponent()); } lockEmissive.SetRenders(lstRenders.ToArray()); } Enable(); } public Keyhole GetScript() { return _lockPick != null ? _lockPick.GetComponent() : null; } public bool IsLockOpened() { return _lockPick != null && _lockPick.GetComponent().LockComplete(); } public void SetPlayer(EntityPlayer player) { if (_lockPick != null) _lockPick.GetComponent().player = player; } private Transform FindTransform(string target) { return _lockPick.transform.FindInChilds(target); } public void Enable() { if (_lockPick == null) return; _lockPick.SetActive(true); _lockPick.GetComponent().ResetLock(); } public void Disable() { if (_lockPick != null) _lockPick.SetActive(false); } }