Двери одержимого: главная клетка большой двери - multiBlockPos.GetParentPos, дальность - у блока, как у персонажа

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
AlexCube
2026-10-13 17:55:24 +03:00
co-authored by Claude Opus 5.5
parent d490e75039
commit 67c8a622e8
3 changed files with 15 additions and 6 deletions
+15 -6
View File
@@ -2159,7 +2159,7 @@ namespace NecromancerTome
/// (TEFeatureDoor - open/close), выключатели и лампы (light), рычаги квестов (activate). Без take, lock, edit,
/// trigger. Запертую чужую дверь не откроет - замок проверяет сама дверь.</summary>
static readonly string[] UseCommands = { "open", "close", "light", "activate" };
public const float UseReach = 3f;
public const float UseReach = 6f; // дальше луч не ищет; сама дальность - у блока (GetActivationDistanceSq)
static bool UseDoorOrSwitch(World _world, EntityAlive _z)
{
@@ -2181,16 +2181,25 @@ namespace NecromancerTome
}
Vector3i pos = Voxel.voxelRayHitInfo.hit.blockPos;
BlockValue bv = _world.GetBlock(pos);
if (bv.ischild)
{
pos += bv.parent;
bv = _world.GetBlock(pos);
}
Block b = bv.Block;
// Створка большой двери - клетка-«ребёнок»; функция двери - у главной клетки. Как у персонажа
// (PlayerMoveController): multiBlockPos.GetParentPos (тест 13.10: двустворчатая дверь не открывалась).
if (bv.ischild && b?.multiBlockPos != null)
{
pos = b.multiBlockPos.GetParentPos(pos, bv);
bv = _world.GetBlock(pos);
b = bv.Block;
}
if (bv.isair || b == null)
{
return false;
}
// Дальность - самого блока, как у персонажа (GetActivationDistanceSq), от головы зомби.
if ((Voxel.voxelRayHitInfo.hit.pos - _z.getHeadPosition()).sqrMagnitude >= b.GetActivationDistanceSq())
{
Debug.Log("[NecromancerTome] Possession: E по " + b.GetBlockName() + " - далеко");
return false;
}
// Только двери (функция двери у составного блока) и выключатели, лампы, рычаги - E по ящику остаётся лутом.
bool door = _world.GetTileEntity(pos) is TileEntityComposite tec && tec.GetFeature<TEFeatureDoor>() != null;
if (!door && !(b is BlockSwitch) && !(b is BlockLight) && !(b is BlockActivateSwitch))