1.7.0: охрана питомцами, один питомец за раз, прицел книг, гео-оссуарий

Питомцы:
- охрана хозяина: враг ближе 20 м (в режиме змеи - к телу) атакуется сам,
  поводок 40 м, охраняют все кроме крысы; приказ прицелом охрана не перебивает
- IsFoe исключает существ мода (necro*): питомец выбирал целью себя
- призыв нового спутника отзывает прежнего
- прицел книг призыва - как у арбалета, краснеет на годной цели

Гео-оссуарий (necroGeoOssuary): станция добычи на кровавой сфере
- основа - коллектор росы; в 3 ячейки модов любой из 5 ресурсов
  (камень, уголь, селитра, железо, сланец), 1 сфера = стак 6000 за 5-8 ч
- работает без открытого неба; верстак, Подмастерье (ур. 25)
- своя модель (бандл necroossuary): кости, корни, сосуды, клыки, черепа
  с глазами-углями; шейдер и теги коллайдера берутся у ванильного коллектора

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
AlexCube
2026-10-01 00:36:45 +03:00
co-authored by Claude Opus 5.5
parent b737dd43d0
commit f2dfeed126
15 changed files with 657 additions and 26 deletions
+48 -1
View File
@@ -133,6 +133,11 @@ namespace NecromancerTome
/// таких питомцев выключается - две системы на одно и то же дёргали бы питомца в
/// разные стороны.</summary>
public bool UsesFollowTask;
/// <summary>Охраняет ли питомец хозяина сам (PetFollowPatch.Guard) - указание 30.09.2026:
/// «охраняют все, кроме крысы». Рой сюда не входит: он не спутник, а разовое заклинание
/// со своим поиском целей.</summary>
public bool Guards;
}
public static readonly Dictionary<string, PetInfo> LimitedPets = new Dictionary<string, PetInfo>
@@ -153,6 +158,7 @@ namespace NecromancerTome
// AlreadyActiveKey у всех четверых теперь не читается никогда.
CommandsAttack = true,
NoTargetKey = "necroPetNoTarget",
Guards = true,
UsesFollowTask = true,
}
},
@@ -199,6 +205,7 @@ namespace NecromancerTome
// AlreadyActiveKey у всех четверых теперь не читается никогда.
CommandsAttack = true,
NoTargetKey = "necroPetNoTarget",
Guards = true,
}
},
{
@@ -217,6 +224,7 @@ namespace NecromancerTome
// AlreadyActiveKey у всех четверых теперь не читается никогда.
CommandsAttack = true,
NoTargetKey = "necroPetNoTarget",
Guards = true,
UsesFollowTask = true,
}
},
@@ -236,6 +244,7 @@ namespace NecromancerTome
// AlreadyActiveKey у всех четверых теперь не читается никогда.
CommandsAttack = true,
NoTargetKey = "necroPetNoTarget",
Guards = true,
UsesFollowTask = true,
}
},
@@ -340,10 +349,48 @@ namespace NecromancerTome
}
return false;
}
RecallOtherCompanions(holdingEntity, __instance.entityToSpawn, tooltips);
summonAllowedThisCall = true;
return true;
}
/// <summary>ОДИН ПИТОМЕЦ ЗА РАЗ - указание 30.09.2026: «за один раз можно было призвать только
/// одного питомца. А то слишком жирно сразу и собаку, и крысу, и стервятника, и медведя».
/// Раньше предел был по одному НА ВИД, и все пятеро могли ходить вместе.
///
/// Сделано заменой, а не отказом: призыв нового сам отзывает прежнего. Игроку не надо
/// искать в поясе другую книгу, чтобы отозвать, и новых строк перевода не нужно - о прежнем
/// сообщает его же готовая надпись «… отозван».
///
/// Спутник - это вид с отзывом (RecalledKey). Рой Жуков не спутник: он разовое заклинание
/// без отзыва, сам никого не вытесняет, и его не вытесняют.</summary>
public static void RecallOtherCompanions(EntityAlive _owner, string _summoned, PetInfo _summonedInfo)
{
if (_summonedInfo.RecalledKey == null)
{
return;
}
foreach (KeyValuePair<string, PetInfo> entry in LimitedPets)
{
if (entry.Key == _summoned || entry.Value.RecalledKey == null)
{
continue;
}
int classId = EntityClass.GetId(entry.Key);
if (classId == -1)
{
continue;
}
List<OwnedEntityData> others = _owner.GetOwnedEntities(classId);
for (int i = others.Count - 1; i >= 0; i--)
{
Debug.Log("[NecromancerTome] SummonPatch: один питомец за раз - " + entry.Key + " " + others[i].Id +
" отозван ради " + _summoned);
RecallPet(_owner, others[i].Id, entry.Value.RecalledKey, null);
}
}
}
/// <summary>ДОБАВЛЕНО 2026-09-18, после чтения ItemActionSpawnEntity.Spawn целиком.
/// Последней строкой ваниль делает вот что:
///
@@ -634,7 +681,7 @@ namespace NecromancerTome
// Поэтому результат передаётся в Register, и тик повторяет попытку до успеха.
bool collisionIgnored = PetFollowPatch.TryIgnoreCollisionWithOwner(owner, __result);
PetFollowPatch.Register(owner, __result, petInfo.UsesFollowTask, collisionIgnored, petInfo.LitEyes,
petInfo.FlyingHomeRadius);
petInfo.FlyingHomeRadius, petInfo.Guards);
AttachFollowTask(owner, __result, petInfo);
// Полупрозрачность больше НЕ делается здесь. Бывший ApplyGhostlyTransparency ставил
// альфу в material.color и не работал ни разу: шейдеры моделей мобов альфу не