Крыса: E на зомби рядом переносит дух в него, крыса развеивается

Одержимой крысой E на зомби в прицеле (не дальше 3 м, в прямой видимости,
не во время прохода сквозь постройки) - выход из крысы и вселение в зомби;
крыса отзывается с чёрным облаком. Цепочки нет: после зомби дух в теле.
Подсказка вселения и описание гримуара крысы - 13 языков. ModInfo 1.7.0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
AlexCube
2026-10-16 14:51:44 +03:00
co-authored by Claude Opus 5.5
parent 70a86e82c1
commit 87f3aaf295
5 changed files with 47 additions and 4 deletions
File diff suppressed because one or more lines are too long
+43 -1
View File
@@ -825,6 +825,11 @@ namespace NecromancerTome
}
if (IsPet && RatModel.Is(z))
{
// E на зомби в прицеле - дух переходит в него, крыса развеивается (указание 16.10).
if (detonate && TryRatJump(world, z))
{
return;
}
// E - осмотреть контейнер без права взять (указание 08.10: крыса - разведчик).
RatLoot.Tick(world, _player, z, detonate);
// ПКМ (держать) - сквозь постройки, без полёта (BACKLOG, «Могильная крыса» п.4).
@@ -1524,6 +1529,42 @@ namespace NecromancerTome
return best;
}
/// <summary>Перенос духа из крысы в зомби под прицелом (решения 16.10): E, зомби не дальше RatJumpRange от
/// крысы и в прямой видимости (GroundAimTarget не видит сквозь стены, во время прохода - не работает);
/// цена - как у «пиф-пафа» (никакой). Крыса отзывается и развеивается; цепочки нет - после зомби дух
/// вернётся в тело ГГ (Exit). True - E израсходована: перенос сделан или начат.</summary>
static bool TryRatJump(World _world, EntityAlive _rat)
{
if (RatPhase.On)
{
return false;
}
EntityAlive victim = GroundAimTarget(_world, _rat);
if (victim == null || !CanPossess(victim) ||
(victim.position - _rat.position).sqrMagnitude > RatJumpRange * RatJumpRange)
{
return false;
}
EntityPlayerLocal player = _player;
int ratId = _rat.entityId;
Exit("крыса: дух переходит в " + victim.EntityName + " (" + victim.entityId + ")");
if (!Enter(player, victim))
{
Debug.Log("[NecromancerTome] Possession: перенос из крысы не удался - дух в теле, крыса осталась");
return true;
}
if (NecroBurst.EnsureRegistered())
{
ParticleEffect pe = new ParticleEffect(NecroBurst.ParticleName, _rat.position,
_world.GetLightBrightness(_rat.GetBlockPosition()), Color.white, null, null, _OLDCreateColliders: false);
GameManager.Instance.SpawnParticleEffectServer(pe, ratId);
}
Patch_ItemActionSpawnEntity_Spawn_PetLimit.RecallPet(player, ratId, null, null); // без подсказки «отозвана» - её место у подсказки вселения
return true;
}
public const float RatJumpRange = 3f;
public const float GroundAimRange = 30f; // зрение зомби, как TauntRange
public const float GroundAimRadius = 0.6f;
@@ -1678,7 +1719,8 @@ namespace NecromancerTome
}
if (IsPet && RatModel.Is(_z))
{
text += ", " + Localization.Get("necroPossessHintLook") + ", " + Localization.Get("necroPossessHintPhase");
text += ", " + Localization.Get("necroPossessHintLook") + ", " + Localization.Get("necroPossessHintRatJump") + ", " +
Localization.Get("necroPossessHintPhase");
}
if (IsPet && DogSense.Is(_z))
{
+1 -1
View File
@@ -562,7 +562,7 @@ namespace NecromancerTome
{
GiveBackSummonItem(owner, summonItemName);
}
if (world != null)
if (world != null && recalledTooltipKey != null) // null - без подсказки (перенос духа крысой, 16.10)
{
GameManager.ShowTooltip(GameManager.Instance.World.GetPrimaryPlayer(), recalledTooltipKey);
}
+1 -1
View File
@@ -4,6 +4,6 @@
<DisplayName value="Necromancer's Tome" />
<Description value="A dark necromancy progression for 7 Days to Die 3.3: a skill that grows from the dead you put to rest, a bone knife, undead servants, possession of zombies and beasts, the Snake Spirit, the Mind Palace, the Blood Tide and a story-ending Black Portal. Fully localized into 13 languages. Single-player; requires EAC off." />
<Author value="Alex Cube" />
<Version value="1.6.0" />
<Version value="1.7.0" />
<Website value="https://www.alexcube.ru/7-days-to-die-moi-mody/kniga-nekromanta-necromancer-s-tome/" />
</xml>
Binary file not shown.