From a726b719df2b1744741596a4613f6c67fbb3cc21 Mon Sep 17 00:00:00 2001 From: AlexCube Date: Tue, 13 Oct 2026 17:40:46 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=B2=D0=B5=D1=80=D0=B8=20=D0=BE=D0=B4?= =?UTF-8?q?=D0=B5=D1=80=D0=B6=D0=B8=D0=BC=D0=BE=D0=B3=D0=BE:=20=D0=B1?= =?UTF-8?q?=D0=BB=D0=BE=D0=BA=20=D0=BF=D0=BE=D0=B4=20=D0=BF=D1=80=D0=B8?= =?UTF-8?q?=D1=86=D0=B5=D0=BB=D0=BE=D0=BC=20-=20Voxel.Raycast,=20=D0=BA?= =?UTF-8?q?=D0=B0=D0=BA=20=D1=83=20=D0=BF=D0=B5=D1=80=D1=81=D0=BE=D0=BD?= =?UTF-8?q?=D0=B0=D0=B6=D0=B0=20(=D1=84=D0=B8=D0=B7=D0=B8=D1=87=D0=B5?= =?UTF-8?q?=D1=81=D0=BA=D0=B8=D0=B9=20=D0=BB=D1=83=D1=87=20=D0=B4=D0=B2?= =?UTF-8?q?=D0=B5=D1=80=D1=8C=20=D0=BD=D0=B5=20=D0=B2=D0=B8=D0=B4=D0=B5?= =?UTF-8?q?=D0=BB);=20=D1=82=D0=BE=D0=BB=D1=8C=D0=BA=D0=BE=20=D0=B4=D0=B2?= =?UTF-8?q?=D0=B5=D1=80=D0=B8,=20=D0=B2=D1=8B=D0=BA=D0=BB=D1=8E=D1=87?= =?UTF-8?q?=D0=B0=D1=82=D0=B5=D0=BB=D0=B8,=20=D0=BB=D0=B0=D0=BC=D0=BF?= =?UTF-8?q?=D1=8B,=20=D1=80=D1=8B=D1=87=D0=B0=D0=B3=D0=B8;=20=D0=BB=D0=BE?= =?UTF-8?q?=D0=B3,=20=D0=B5=D1=81=D0=BB=D0=B8=20=D0=B4=D0=B5=D0=BB=D0=B0?= =?UTF-8?q?=D1=82=D1=8C=20=D0=BD=D0=B5=D1=87=D0=B5=D0=B3=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/Possession.cs | 46 +++++++++++++++++----------------------- 1 file changed, 20 insertions(+), 26 deletions(-) diff --git a/HarmonySrc/Possession.cs b/HarmonySrc/Possession.cs index 5561418..c8fbde3 100644 --- a/HarmonySrc/Possession.cs +++ b/HarmonySrc/Possession.cs @@ -2168,36 +2168,18 @@ namespace NecromancerTome { return false; } - int n = Physics.RaycastNonAlloc(cam.position, cam.forward, _aimHits, 50f, -5, QueryTriggerInteraction.Ignore); - Transform self = _z.transform; - float best = float.MaxValue; - RaycastHit hit = default; - for (int i = 0; i < n; i++) - { - RaycastHit h = _aimHits[i]; - if (h.distance >= best || h.transform == self || h.transform.IsChildOf(self)) - { - continue; - } - best = h.distance; - hit = h; - } - if (best == float.MaxValue) + // Блок под прицелом - лучом по сетке блоков, как ищет персонаж (PlayerMoveController: Voxel.Raycast, те же + // маски). Физический луч дверь не видел (тест 13.10: «двери не открываются, даже подсказки нет») - коллайдеры + // дверей не на тех слоях. Луч - с уровня головы зомби по взгляду: от третьего лица камера за спиной. + Vector3 fwd = cam.forward; + Vector3 head = _z.getHeadPosition() - Origin.position; + Vector3 from = cam.position + fwd * Mathf.Max(0f, Vector3.Dot(head - cam.position, fwd)); + if (!Voxel.Raycast(_world, new Ray(from, fwd), UseReach, -555266077, 69, 0f)) { return false; } - Vector3 at = hit.point + Origin.position; - if ((at - _z.getHeadPosition()).sqrMagnitude > UseReach * UseReach) - { - return false; - } - Vector3i pos = World.worldToBlockPos(at + cam.forward * 0.05f); + Vector3i pos = Voxel.voxelRayHitInfo.hit.blockPos; BlockValue bv = _world.GetBlock(pos); - if (bv.isair) - { - pos = World.worldToBlockPos(at - cam.forward * 0.05f); - bv = _world.GetBlock(pos); - } if (bv.ischild) { pos += bv.parent; @@ -2208,6 +2190,12 @@ namespace NecromancerTome { return false; } + // Только двери (функция двери у составного блока) и выключатели, лампы, рычаги - E по ящику остаётся лутом. + bool door = _world.GetTileEntity(pos) is TileEntityComposite tec && tec.GetFeature() != null; + if (!door && !(b is BlockSwitch) && !(b is BlockLight) && !(b is BlockActivateSwitch)) + { + return false; + } BlockActivationCommand[] cmds = b.GetBlockActivationCommands(_world, bv, pos, _player); for (int i = 0; cmds != null && i < cmds.Length; i++) { @@ -2219,6 +2207,12 @@ namespace NecromancerTome Debug.Log("[NecromancerTome] Possession: " + _z.EntityName + " - " + cmds[i].text + " " + b.GetBlockName() + " " + pos); return true; } + string list = ""; + for (int i = 0; cmds != null && i < cmds.Length; i++) + { + list += " " + cmds[i].text + (cmds[i].enabled ? "" : "(-)"); + } + Debug.Log("[NecromancerTome] Possession: E по " + b.GetBlockName() + " " + pos + " - нечего делать, команды:" + list); return false; }