From 606f9c38165807eba1ccb5dbb324daa3ba2e5691 Mon Sep 17 00:00:00 2001 From: AlexCube Date: Fri, 16 Oct 2026 23:12:45 +0300 Subject: [PATCH] =?UTF-8?q?necroview:=20=D0=BC=D1=8B=D1=88=D1=8C=20=D0=BE?= =?UTF-8?q?=D0=B1=D0=BB=D0=B5=D1=82=D0=B0=D0=B5=D1=82=20=D1=80=D1=83=D0=BA?= =?UTF-8?q?=D0=B8,=20=D0=BF=D0=B5=D1=80=D1=81=D0=BE=D0=BD=D0=B0=D0=B6=20?= =?UTF-8?q?=D1=81=D1=82=D0=BE=D0=B8=D1=82=20(necroview=20mouse=20off=20-?= =?UTF-8?q?=20=D0=BA=D0=B0=D0=BA=20=D0=B1=D1=8B=D0=BB=D0=BE)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- HarmonySrc/NecroView.cs | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/HarmonySrc/NecroView.cs b/HarmonySrc/NecroView.cs index 45c6e85..dfc2ec9 100644 --- a/HarmonySrc/NecroView.cs +++ b/HarmonySrc/NecroView.cs @@ -21,6 +21,13 @@ namespace NecromancerTome static Vector3 _target; static Camera _cam; const float TurnSpeed = 60f, ZoomSpeed = 0.4f; + /// Мышь облетает руки, персонаж стоит (16.10: «я поворачиваю мышь, а туловище проворачивается следом, и я + /// вижу тело только с одной позиции»). Поворот игрока каждый кадр возвращается к снимку при включении. + public static bool Mouse = true; + public static float MouseSpeed = 3f; + static Vector3 _lockRot; + static Quaternion _lockCam; + static bool _mouseBroken; public static string Start(float _yaw, float _pitch, float _dist) { @@ -47,6 +54,8 @@ namespace NecromancerTome _cam.nearClipPlane = 0.01f; _cam.gameObject.SetActive(true); HandPose.HoldStill = true; + _lockRot = pl.rotation; + _lockCam = pc.localRotation; On = true; return "осмотр включён: вокруг " + Yaw + ", высота " + Pitch + ", расстояние " + Dist; } @@ -76,6 +85,22 @@ namespace NecromancerTome return; } float dt = Time.unscaledDeltaTime; + EntityPlayerLocal pl = GameManager.Instance?.World?.GetPrimaryPlayer(); + if (Mouse && pl != null && !_mouseBroken) + { + try + { + Yaw += Input.GetAxis("Mouse X") * MouseSpeed; + Pitch = Mathf.Clamp(Pitch - Input.GetAxis("Mouse Y") * MouseSpeed, -85f, 85f); + } + catch (System.Exception e) + { + _mouseBroken = true; // нет оси мыши в старом вводе - остаётся цифровой блок + Debug.LogWarning("[NecromancerTome] necroview: мышь не читается (" + e.Message + ")"); + } + pl.rotation = _lockRot; + pc.localRotation = _lockCam; + } if (Input.GetKey(KeyCode.Keypad4)) Yaw -= TurnSpeed * dt; if (Input.GetKey(KeyCode.Keypad6)) Yaw += TurnSpeed * dt; if (Input.GetKey(KeyCode.Keypad8)) Pitch = Mathf.Min(85f, Pitch + TurnSpeed * dt); @@ -103,7 +128,7 @@ namespace NecromancerTome public class ConsoleCmdNecroView : ConsoleCmdAbstract { public override string[] getCommands() => new[] { "necroview" }; - public override string getDescription() => "NecromancerTome: осмотр рук со стороны - on [вокруг высота расстояние]|off|set вокруг высота расстояние|show; цифровой блок 4/6 8/2 +/- 5"; + public override string getDescription() => "NecromancerTome: осмотр рук со стороны - on [вокруг высота расстояние]|off|set вокруг высота расстояние|mouse [off]|show; мышь или цифровой блок 4/6 8/2 +/- 5"; static bool Num(List _p, int _i, out float _v) { @@ -134,6 +159,10 @@ namespace NecromancerTome NecroView.Pitch = p2; NecroView.Dist = d2; break; + case "mouse": + NecroView.Mouse = !(_params.Count > 1 && _params[1] == "off"); + Out("мышь " + (NecroView.Mouse ? "облетает руки" : "крутит персонажа, облёт - цифровой блок")); + return; case "show": break; default: