Чертоги разума, хваты пустой руки, одержимость, книга с оглавлением

- Чертоги разума: дух в префабе chertogi под землёй, книга памяти, нож и плакат;
  кровать префаба - мебель necroPalaceBed (иначе становилась точкой возрождения);
  охрана выбрасывает и игроков (их нет в EntityAlives).
- Хваты пустой руки по R: «отрицание» и «пиф-паф» - поза рук костями поверх аниматора,
  остальные кости заморожены, ЛКМ - заклинание, прицел краснеет на зомби.
- «Отрицание»: зомби в ужасе бежит дальше 40 м и теряет игрока как цель.
- «Пиф-паф»: одержимость зомби-гуманоидом - бег, прыжок, удар, дальняя атака,
  подрыв, крик крикуньи; тело цепенеет, зомби танкуют одержимого; область
  вокруг тела сжата; полоска здоровья; спавн и прорисовка у одержимого.
- Книга с оглавлением (окно necroTome), глава «Некроэнергия».
- Прорисовка дверей у змеи и одержимого (CheckLODs от камеры, а не от тела).
- Почтовый ящик консоли и команды necrobones/necropose/necroshot для разработки.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
AlexCube
2026-10-04 00:10:05 +03:00
co-authored by Claude Opus 5.5
parent c828202c66
commit 66a0dcf403
43 changed files with 3798 additions and 22 deletions
+91
View File
@@ -0,0 +1,91 @@
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.Scripting;
namespace NecromancerTome
{
/// <summary>
/// Почтовый ящик консоли - только для разработки (03.10: ассистент подбирает позу рук сам, без
/// клавиатуры). Работает, лишь если есть папка %APPDATA%\7DaysToDie\NecroMailbox - у игроков её
/// нет. Раз в полсекунды: команды из cmd.txt (по строке) выполняются в консоли игры, как набранные
/// вручную, файл удаляется, ответ - в лог строками «[NecromancerTome] mailbox:».
/// </summary>
public static class NecroMailbox
{
public static string Dir => Path.Combine(GameIO.GetUserGameDataDir(), "NecroMailbox");
static string CmdFile => Path.Combine(Dir, "cmd.txt");
static float _next;
public static void Init()
{
ModEvents.UnityUpdate.RegisterHandler(OnUnityUpdate);
}
static void OnUnityUpdate(ref ModEvents.SUnityUpdateData _data)
{
if (Time.unscaledTime < _next)
{
return;
}
_next = Time.unscaledTime + 0.5f;
if (!File.Exists(CmdFile) || SdtdConsole.Instance == null)
{
return;
}
string[] lines;
try
{
lines = File.ReadAllLines(CmdFile);
File.Delete(CmdFile);
}
catch (IOException)
{
return; // файл ещё пишется - в следующий раз
}
foreach (string raw in lines)
{
string line = raw.Trim();
if (line.Length == 0)
{
continue;
}
Debug.Log("[NecromancerTome] mailbox: > " + line);
try
{
List<string> res = SdtdConsole.Instance.ExecuteSync(line, null);
if (res != null)
{
foreach (string r in res)
{
Debug.Log("[NecromancerTome] mailbox: " + r);
}
}
}
catch (System.Exception ex)
{
Debug.LogWarning("[NecromancerTome] mailbox: ошибка - " + ex);
}
}
}
}
/// <summary>necroshot [имя] - снимок экрана игры в %APPDATA%\7DaysToDie\NecroMailbox\shots\имя.png
/// (как F9, только в известное место). Файл появляется в конце кадра.</summary>
[Preserve]
public class ConsoleCmdNecroShot : ConsoleCmdAbstract
{
public override string[] getCommands() => new[] { "necroshot" };
public override string getDescription() => "NecromancerTome: снимок экрана в NecroMailbox/shots/<имя>.png";
public override void Execute(List<string> _params, CommandSenderInfo _senderInfo)
{
string dir = Path.Combine(NecroMailbox.Dir, "shots");
Directory.CreateDirectory(dir);
string name = _params.Count > 0 ? _params[0] : System.DateTime.Now.ToString("HHmmss");
string path = Path.Combine(dir, name + ".png");
ScreenCapture.CaptureScreenshot(path);
SdtdConsole.Instance.Output("снимок: " + path);
}
}
}