Двери одержимого: главная клетка большой двери - multiBlockPos.GetParentPos, дальность - у блока, как у персонажа
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
d490e75039
commit
67c8a622e8
@@ -2159,7 +2159,7 @@ namespace NecromancerTome
|
|||||||
/// (TEFeatureDoor - open/close), выключатели и лампы (light), рычаги квестов (activate). Без take, lock, edit,
|
/// (TEFeatureDoor - open/close), выключатели и лампы (light), рычаги квестов (activate). Без take, lock, edit,
|
||||||
/// trigger. Запертую чужую дверь не откроет - замок проверяет сама дверь.</summary>
|
/// trigger. Запертую чужую дверь не откроет - замок проверяет сама дверь.</summary>
|
||||||
static readonly string[] UseCommands = { "open", "close", "light", "activate" };
|
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)
|
static bool UseDoorOrSwitch(World _world, EntityAlive _z)
|
||||||
{
|
{
|
||||||
@@ -2181,16 +2181,25 @@ namespace NecromancerTome
|
|||||||
}
|
}
|
||||||
Vector3i pos = Voxel.voxelRayHitInfo.hit.blockPos;
|
Vector3i pos = Voxel.voxelRayHitInfo.hit.blockPos;
|
||||||
BlockValue bv = _world.GetBlock(pos);
|
BlockValue bv = _world.GetBlock(pos);
|
||||||
if (bv.ischild)
|
|
||||||
{
|
|
||||||
pos += bv.parent;
|
|
||||||
bv = _world.GetBlock(pos);
|
|
||||||
}
|
|
||||||
Block b = bv.Block;
|
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)
|
if (bv.isair || b == null)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
// Дальность - самого блока, как у персонажа (GetActivationDistanceSq), от головы зомби.
|
||||||
|
if ((Voxel.voxelRayHitInfo.hit.pos - _z.getHeadPosition()).sqrMagnitude >= b.GetActivationDistanceSq())
|
||||||
|
{
|
||||||
|
Debug.Log("[NecromancerTome] Possession: E по " + b.GetBlockName() + " - далеко");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
// Только двери (функция двери у составного блока) и выключатели, лампы, рычаги - E по ящику остаётся лутом.
|
// Только двери (функция двери у составного блока) и выключатели, лампы, рычаги - E по ящику остаётся лутом.
|
||||||
bool door = _world.GetTileEntity(pos) is TileEntityComposite tec && tec.GetFeature<TEFeatureDoor>() != null;
|
bool door = _world.GetTileEntity(pos) is TileEntityComposite tec && tec.GetFeature<TEFeatureDoor>() != null;
|
||||||
if (!door && !(b is BlockSwitch) && !(b is BlockLight) && !(b is BlockActivateSwitch))
|
if (!door && !(b is BlockSwitch) && !(b is BlockLight) && !(b is BlockActivateSwitch))
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user