Урны: череп-ретранслятор, прилив прячет духов, меры нагрузки; проверки без мыши
- Череп-ретранслятор: нить урны проходит через черепа-декор (цепочка), каждый пролёт до 15 м; черепа хранятся у нити (запись урны v5, старые - без черепов). ПКМ ножом по черепу - провести нить, ЛКМ - снять нити через него; убрали череп - нить снимается. - Прилив: ночью кровавой луны духи всех урн исчезают, работа стоит, утром - сама. - Нагрузка: общий бюджет дел духов на кадр (3), анимируются только 16 ближайших духов; лимит урн сборщика смягчён - одна на 200 убийств (было 500), тексты на 13 языках. - Описание логиста (кадило, два вида, маленький дух, мигание), черепа-декора (передаёт нить), подсказки ножа - на 13 языках. - Разработка: necrogod, necrofps [uncap], necrotide, necroshot серией, necroclick по клетке, necrobox fill, necrourn с черепами на пути. Проверено в игре (test8): мигание, нить 28 м через череп и её разрыв, прилив, 63 урны сборщика: 13.0 мс на кадр против 11.8 мс без работы урн. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
6693d96d5e
commit
85d8036e81
@@ -46,7 +46,19 @@ namespace NecromancerTome
|
||||
case "necrohold": Hold(pl, _params); break;
|
||||
case "necrobox": Box(w, _params); break;
|
||||
case "necrourn": Urn(w, _params); break;
|
||||
case "necroclick": CinerariumThreads.Click(pl, _params.Count > 0 && _params[0] == "1"); Out("necroclick: ok"); break;
|
||||
case "necrogod": God(pl, _params.Count == 0 || _params[0] != "off"); break;
|
||||
case "necroclick":
|
||||
// necroclick 0|1 [x y z] - по блоку под прицелом или по указанной клетке (луч не всегда попадает в низкий череп).
|
||||
if (_params.Count >= 4)
|
||||
{
|
||||
CinerariumThreads.ClickAt(pl, w, P(_params, 1), _params[0] == "1");
|
||||
}
|
||||
else
|
||||
{
|
||||
CinerariumThreads.Click(pl, _params.Count > 0 && _params[0] == "1");
|
||||
}
|
||||
Out("necroclick: ok");
|
||||
break;
|
||||
}
|
||||
}
|
||||
catch (System.Exception e)
|
||||
@@ -78,6 +90,15 @@ namespace NecromancerTome
|
||||
Out("necrolook: yaw " + yaw.ToString("F0") + ", pitch " + pitch.ToString("F0"));
|
||||
}
|
||||
|
||||
/// <summary>Режим бога и невидимость для ИИ: пока ассистент проверяет, персонаж стоит - зомби тестового мира его не трогают
|
||||
/// (18.10: «пока персонаж просто стоит, его скушают»; «Я обычно ставлю режим Бога»).</summary>
|
||||
static void God(EntityPlayerLocal _pl, bool _on)
|
||||
{
|
||||
_pl.IsGodMode.Value = _on;
|
||||
_pl.SetIgnoredByAI(_on);
|
||||
Out("necrogod: " + (_on ? "бог, ИИ не видит" : "обычный"));
|
||||
}
|
||||
|
||||
static void Aim(World _w, EntityPlayerLocal _pl)
|
||||
{
|
||||
StringBuilder sb = new StringBuilder("necroaim: игрок ").Append(_pl.position.ToString("F1")).Append(", взгляд ").Append(_pl.rotation.ToString("F0"));
|
||||
@@ -151,7 +172,20 @@ namespace NecromancerTome
|
||||
return;
|
||||
}
|
||||
string op = _p.Count > 3 ? _p[3] : "list";
|
||||
if (op == "clear")
|
||||
if (op == "fill")
|
||||
{
|
||||
// Все пустые ячейки - полной стопкой предмета (ящик «полон» по-честному).
|
||||
ItemValue iv = ItemClass.GetItem(_p[4], true);
|
||||
for (int i = 0; i < s.ItemGrid.Length; i++)
|
||||
{
|
||||
if (s.ItemGrid[i] == null || s.ItemGrid[i].IsEmpty())
|
||||
{
|
||||
s.UpdateSlot(i, new ItemStack(iv.Clone(), iv.ItemClass.Stacknumber.Value));
|
||||
}
|
||||
}
|
||||
s.SetModified();
|
||||
}
|
||||
else if (op == "clear")
|
||||
{
|
||||
for (int i = 0; i < s.ItemGrid.Length; i++)
|
||||
{
|
||||
@@ -182,6 +216,17 @@ namespace NecromancerTome
|
||||
Out(sb.ToString());
|
||||
}
|
||||
|
||||
/// <summary>Черепа на пути нити: тройки координат после конца нити, по порядку от урны.</summary>
|
||||
static List<Vector3i> Via(List<string> _p, int _i)
|
||||
{
|
||||
List<Vector3i> l = new List<Vector3i>();
|
||||
for (int k = _i; k + 2 < _p.Count; k += 3)
|
||||
{
|
||||
l.Add(P(_p, k));
|
||||
}
|
||||
return l;
|
||||
}
|
||||
|
||||
static void Urn(World _w, List<string> _p)
|
||||
{
|
||||
Vector3i pos = P(_p, 0);
|
||||
@@ -195,9 +240,9 @@ namespace NecromancerTome
|
||||
switch (op)
|
||||
{
|
||||
case "skull": u.SetSkull(_p[4] == "1"); break;
|
||||
case "from": u.AddThreadFrom(P(_p, 4)); break;
|
||||
case "to": u.SetThreadTo(P(_p, 4)); break;
|
||||
case "out": u.AddThreadOut(P(_p, 4)); break;
|
||||
case "from": u.AddThreadFrom(P(_p, 4), Via(_p, 7)); break;
|
||||
case "to": u.SetThreadTo(P(_p, 4), Via(_p, 7)); break;
|
||||
case "out": u.AddThreadOut(P(_p, 4), Via(_p, 7)); break;
|
||||
case "clear": u.ClearThreads(); break;
|
||||
case "sample":
|
||||
u.SetSample(_p.Count > 5 ? new ItemStack(ItemClass.GetItem(_p[4], true), int.Parse(_p[5])) : ItemStack.Empty.Clone());
|
||||
@@ -207,7 +252,15 @@ namespace NecromancerTome
|
||||
u.SetModified();
|
||||
break;
|
||||
}
|
||||
Out("necrourn: " + pos + " " + _w.GetBlock(pos).Block?.GetBlockName() + ", череп " + u.HasSkull + ", застрял " + u.Stuck +
|
||||
string blink = "нет";
|
||||
Chunk ch = _w.GetChunkFromWorldPos(pos) as Chunk;
|
||||
BlockEntityData be = ch?.GetBlockEntity(pos);
|
||||
if (be != null && be.bHasTransform)
|
||||
{
|
||||
CinerariumBlink cb = be.transform.GetComponent<CinerariumBlink>();
|
||||
blink = cb == null ? "нет" : (cb.enabled ? "мигает" : "выкл") + " (" + cb.Renderers.Count + " рендер.)";
|
||||
}
|
||||
Out("necrourn: " + pos + " " + _w.GetBlock(pos).Block?.GetBlockName() + ", череп " + u.HasSkull + ", застрял " + u.Stuck + ", мигание " + blink +
|
||||
", откуда " + u.ThreadFrom.Count + ", куда " + (u.HasThreadTo ? u.ThreadTo.ToString() : "нет") + ", от урны " + u.ThreadOut.Count +
|
||||
", образец " + (u.Sample == null || u.Sample.IsEmpty() ? "нет" : u.Sample.itemValue.ItemClass?.GetItemName() + "x" + u.Sample.count));
|
||||
}
|
||||
@@ -275,4 +328,13 @@ namespace NecromancerTome
|
||||
public override bool AllowedInMainMenu => false;
|
||||
public override void Execute(List<string> _params, CommandSenderInfo _senderInfo) => NecroDev.Run("necroclick", _params);
|
||||
}
|
||||
|
||||
[Preserve]
|
||||
public class ConsoleCmdNecroGod : ConsoleCmdAbstract
|
||||
{
|
||||
public override string[] getCommands() => new[] { "necrogod" };
|
||||
public override string getDescription() => "NecromancerTome (разработка): режим бога и невидимость для ИИ [off]";
|
||||
public override bool AllowedInMainMenu => false;
|
||||
public override void Execute(List<string> _params, CommandSenderInfo _senderInfo) => NecroDev.Run("necrogod", _params);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user