diff --git a/HarmonySrc/Possession.cs b/HarmonySrc/Possession.cs
index 0ddd3b7..9739808 100644
--- a/HarmonySrc/Possession.cs
+++ b/HarmonySrc/Possession.cs
@@ -573,6 +573,27 @@ namespace NecromancerTome
{
XUiC_InteractionPrompt.SetText(ui, null);
}
+ // Подсказка на дверь или выключатель под прицелом одержимого (указание 13.10: «подсказка при наведении будет?»):
+ // текст даёт сам блок (GetActivationText), клавиша - E игрока, как у персонажа.
+ if (ui != null && !IsPet)
+ {
+ if (Time.time >= _promptNext)
+ {
+ _promptNext = Time.time + 0.15f;
+ _prompt = null;
+ if (FindUsable(world, z, false, out Vector3i ppos, out BlockValue pbv, out Block pb))
+ {
+ PlayerActionsLocal pin = _player.playerInput;
+ string key = pin != null ? pin.Activate.GetBindingXuiMarkupString() + pin.PermanentActions.Activate.GetBindingXuiMarkupString() : "E";
+ string t = pb.GetActivationText(world, pbv, ppos, _player);
+ _prompt = t != null ? string.Format(t, key) : null;
+ }
+ }
+ if (_prompt != null)
+ {
+ XUiC_InteractionPrompt.SetText(ui, _prompt);
+ }
+ }
PlayerActionsLocal input = _player.playerInput;
bool gui = _player.PlayerUI != null && _player.PlayerUI.windowManager.IsModalWindowOpen();
if (input != null && !gui && (input.Reload.WasPressed || input.PermanentActions.Reload.WasPressed))
@@ -2159,10 +2180,16 @@ namespace NecromancerTome
/// (TEFeatureDoor - open/close), выключатели и лампы (light), рычаги квестов (activate). Без take, lock, edit,
/// trigger. Запертую чужую дверь не откроет - замок проверяет сама дверь.
static readonly string[] UseCommands = { "open", "close", "light", "activate" };
- public const float UseReach = 6f; // дальше луч не ищет; сама дальность - у блока (GetActivationDistanceSq)
+ public const float UseReach = 6f;
+ static float _promptNext;
+ static string _prompt; // дальше луч не ищет; сама дальность - у блока (GetActivationDistanceSq)
- static bool UseDoorOrSwitch(World _world, EntityAlive _z)
+ /// Дверь, выключатель, лампа или рычаг под прицелом одержимого в пределах дальности блока - для E и подсказки.
+ static bool FindUsable(World _world, EntityAlive _z, bool _log, out Vector3i pos, out BlockValue bv, out Block b)
{
+ pos = Vector3i.zero;
+ bv = BlockValue.Air;
+ b = null;
Transform cam = _player?.cameraTransform;
if (cam == null || _world == null)
{
@@ -2179,12 +2206,15 @@ namespace NecromancerTome
Vector3 from = camW + fwd * Mathf.Max(0f, Vector3.Dot(head - camW, fwd));
if (!Voxel.Raycast(_world, new Ray(from, fwd), UseReach, -555266077, 69, 0f))
{
- Debug.Log("[NecromancerTome] Possession: E - под прицелом в " + UseReach + " м блока нет");
+ if (_log)
+ {
+ Debug.Log("[NecromancerTome] Possession: E - под прицелом в " + UseReach + " м блока нет");
+ }
return false;
}
- Vector3i pos = Voxel.voxelRayHitInfo.hit.blockPos;
- BlockValue bv = _world.GetBlock(pos);
- Block b = bv.Block;
+ pos = Voxel.voxelRayHitInfo.hit.blockPos;
+ bv = _world.GetBlock(pos);
+ b = bv.Block;
// Створка большой двери - клетка-«ребёнок»; функция двери - у главной клетки. Как у персонажа
// (PlayerMoveController): multiBlockPos.GetParentPos (тест 13.10: двустворчатая дверь не открывалась).
if (bv.ischild && b?.multiBlockPos != null)
@@ -2200,14 +2230,29 @@ namespace NecromancerTome
// Дальность - самого блока, как у персонажа (GetActivationDistanceSq), от головы зомби.
if ((Voxel.voxelRayHitInfo.hit.pos - _z.getHeadPosition()).sqrMagnitude >= b.GetActivationDistanceSq())
{
- Debug.Log("[NecromancerTome] Possession: E по " + b.GetBlockName() + " - далеко");
+ if (_log)
+ {
+ Debug.Log("[NecromancerTome] Possession: E по " + b.GetBlockName() + " - далеко");
+ }
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))
{
- Debug.Log("[NecromancerTome] Possession: E по " + b.GetBlockName() + " (" + b.GetType().Name + ") " + pos + " - не дверь и не выключатель");
+ if (_log)
+ {
+ Debug.Log("[NecromancerTome] Possession: E по " + b.GetBlockName() + " (" + b.GetType().Name + ") " + pos + " - не дверь и не выключатель");
+ }
+ return false;
+ }
+ return true;
+ }
+
+ static bool UseDoorOrSwitch(World _world, EntityAlive _z)
+ {
+ if (!FindUsable(_world, _z, true, out Vector3i pos, out BlockValue bv, out Block b))
+ {
return false;
}
BlockActivationCommand[] cmds = b.GetBlockActivationCommands(_world, bv, pos, _player);
diff --git a/NecromancerHarmony.dll b/NecromancerHarmony.dll
index 52b6cd3..de783fb 100644
Binary files a/NecromancerHarmony.dll and b/NecromancerHarmony.dll differ
diff --git a/NecromancerHarmony.pdb b/NecromancerHarmony.pdb
index 198c0b5..1644a6e 100644
Binary files a/NecromancerHarmony.pdb and b/NecromancerHarmony.pdb differ