Ремонтник и лутер: свои модели (фляга со звонками, мешок), проверка добычи

- Модели (BlenderWork/necroCinerariumRepair, necroCinerariumLoot): ремонтник - квадратная
  фляга, лутер - глазурованный мешок с верёвкой; на обоих - четыре латунных звонка с
  черепом-кнопкой (деталь *_button - подсветка состояния) и руны кровью футарком
  («RIPARU ĜIS LA LASTA BRIKO», «KOLEKTU ĜIS LA LASTA PECETO»), светятся по черепу.
- Лутер: цели, из которых за проход нечего взять, второй раз не обыскиваются (не зацикливается).
- Разработка: necroclear (убрать только растения), necrobag с сумкой по списку добычи.

Проверено в игре: мешок с зомби и красный труп (прах, кожа жертвы) - в ящик, проход
заканчивается сам.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
AlexCube
2026-10-18 15:20:31 +03:00
co-authored by Claude Opus 5.5
parent a352a408a4
commit 51db24fd2f
7 changed files with 52 additions and 4 deletions
+8 -1
View File
@@ -173,6 +173,7 @@ namespace NecromancerTome
ZoneLacking = false;
ZonePressedBy = _player != null ? _player.entityId : -1;
_queue.Clear();
_lootDone.Clear();
Audio.Manager.BroadcastPlay(World.blockToTransformPos(ToWorldPos()), "button4");
Debug.Log("[NecromancerTome] Cinerarium: " + (IsLooter ? "лутер" : "ремонтник") + " " + ToWorldPos() + " запущен, зона " + ZoneSideNow);
}
@@ -495,6 +496,8 @@ namespace NecromancerTome
// ------------------------------------------------------------------
static readonly List<Entity> _ents = new List<Entity>();
/// <summary>Цели, уже обысканные за этот проход (пустой мешок, нечего взять) - второй раз не трогать.</summary>
readonly HashSet<int> _lootDone = new HashSet<int>();
/// <summary>Цель лутера в зоне: предмет на земле, потом мешок с зомби, потом красный труп. Ничего - проход окончен.</summary>
void LootPick(World _world, CinerariumGenieMotion _motion)
@@ -515,7 +518,7 @@ namespace NecromancerTome
foreach (Entity e in _ents)
{
int rank = LootRank(e);
if (rank < bestRank && !LockManager.Instance.IsLockedServer(e, 0))
if (rank < bestRank && !_lootDone.Contains(e.entityId) && !LockManager.Instance.IsLockedServer(e, 0))
{
best = e;
bestRank = rank;
@@ -628,6 +631,10 @@ namespace NecromancerTome
bag.SetSlot(i, s.count > 0 ? s : ItemStack.Empty.Clone());
}
ZoneLacking = left; // не всё влезло - ящик полон, кнопка мигает
if (!left)
{
_lootDone.Add(e.entityId); // опустошён (или был пуст) - больше не цель; пустой убирает игра
}
Debug.Log("[NecromancerTome] Cinerarium: лутер " + ToWorldPos() + " обыскал " + e.GetType().Name + " " + e.entityId + (left ? " - не всё влезло" : ""));
}