ИИ питомцев переписан, добавлен Дух крысы, пороги разнесены по шкале

Работа по указаниям 2026-09-18. В релиз пока не выходит.

НОВЫЙ ПИТОМЕЦ "Дух крысы" (necroRatSpirit), Некромантия 3 (60 убийств):
модель зомбоволка в масштабе 0.28, урон 5, кроличьи звуки. Сам не нападает
никогда, держится справа-сзади в двух блоках, упёршись в препятствие проходит
СКВОЗЬ него и блоков не ломает. Укус замедляет, оставляет метку духа (видна на
компасе, +25% получаемого урона) и рвёт жилу. Обгрызая труп, лечится.

СВОЯ ЗАДАЧА ИИ. Задачи "иди за сущностью" в игре нет вовсе - проверены все 32
типа EAI*. Написана NecroFollowOwnerTask по образцу EAIApproachSpot: сектор
"3-6 часов" от хозяина, FindPath с canBreak:false, проход сквозь препятствие
через Entity.IsStuck. Вешается в рантайме, минуя Type.GetType.

ПРИКАЗ АТАКОВАТЬ. Повторное применение свитка при живом питомце натравливает
его на цель под прицелом: EntityPlayerLocal.HitInfo + ItemActionAttack.
GetEntityFromHit. Торговцы и игроки отсеяны. Нет цели - "Нет цели для атаки".

ЗОМБОЖИВОТНЫЕ ПРИВЕДЕНЫ К ТОМУ ЖЕ ОБРАЗЦУ. Сняты BreakBlock, Territorial,
ApproachSpot, Wander, BlockingTargetTask и поедание трупов; цель они больше не
выбирают сами. Лестница урона 20/35/45/60 плюс расчленение у Пса, Медведя и
Волка. Кровотечение всем, метка и ослабление - только у крысы.

УБИЙСТВА ПИТОМЦЕМ ЗАСЧИТЫВАЮТСЯ ВЛАДЕЛЬЦУ, включая добивание кровотечением.
Префикс на AwardKillXPServer подменяет убийцу владельцем; для смерти от баффа
заведена память укусов, потому что в DamageSource от баффа нет того, кто его
наложил. Зомби под Камнем духов это не задело - решение от 17.09 в силе.

ГРИФ откачен на летающую ветку EntityVulture и переименован в Могильного
стервятника: модель наконец соответствует имени. Держится у игрока сам, через
собственный механизм "дома" (setHomeArea), на время погони дом отвязывается.
Попытка натянуть птичий префаб на наземный класс провалилась и записана - так
делать нельзя.

ПРОЧЕЕ: призрачный вид распространён с торговцев на питомцев (у Пса, Медведя и
Волка выключен по указанию), у Пса светятся фиолетовые глаза, белая иконка
книги снята со всех свитков призыва, "Жуки Властелина" переименованы в "Рой
фараона" на всех 13 языках.

ПОРОГИ: крыса 60, стервятник 500, пёс 1300, медведь 2000, волк 4000.

ИСПРАВЛЕНО ПО ХОДУ ИГРОВЫХ ПРОВЕРОК: питомцы не призывались обычным кликом
(AnimWait требовал удержания), отзыв срабатывал не с первого раза (автомат
состояний ItemActionSpawnEntity), крыса проваливалась сквозь мир (IsStuck
отключает и пол), питомец подбрасывал хозяина (коллайдеры разводились до
появления модели).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
AlexCube
2026-09-18 20:51:42 +03:00
co-authored by Claude Opus 5
parent 15c59dd37a
commit d97f83e972
21 changed files with 2501 additions and 179 deletions
+309 -13
View File
@@ -518,7 +518,10 @@
<append xpath="/items">
<item name="bookSummonZombieDog">
<property name="Tags" value="T0,weapon,attPerception"/>
<property name="ItemTypeIcon" value="book"/>
<!-- ItemTypeIcon="book" УБРАН 2026-09-18 со ВСЕХ свитков и книг призыва разом,
прямое указание: "свитки призыва и книги призыва не должны содержать белую
иконку книги поверх. Они ПРЕДМЕТЫ, а не рецепты." Полный разбор виджета - у
bookSummonRatSpirit ниже и у Пространственного браслета (07.09). -->
<!-- ICON REPLACED 2026-08-29: swapped the user's earlier hand-drawn
schematicDogSummon.png for the new AI-generated SummonZombieDog.png, to match
the rest of the item set's unified style (same prompt/generator as the other 12
@@ -546,7 +549,22 @@
<property class="Action0">
<property name="Class" value="SpawnEntity"/>
<property name="AnimType" value="4"/>
<property name="AnimWait" value="0.3"/>
<!-- 0.05, а не 0.3 - выровнено со Свитком духа крысы 2026-09-18, после того как
в игре не призвались НИ ГРИФ, НИ ВОЛК, НИ МЕДВЕДЬ, ни пёс, а крыса
призвалась. В логе у всех четверых было только "action index=1" (отзыв) и ни
одного index=0: до Spawn основной клик не доходил вовсе.
ItemActionSpawnEntity.OnHoldingUpdate копит stateTime по 0.05 за тик и
сравнивает с animWait, а ExecuteAction(_bReleased: true) при отпускании
кнопки сбрасывает состояние в None. То есть 0.3 означало "держать кнопку
треть секунды", шесть тиков подряд, и обычный клик до спавна не доживал -
молча, без ошибки и без строки в логе.
Раньше это сходило с рук: призыв делают раз за сессию и кнопку держали. Но
теперь на этом же слоте сидит КОМАНДА АТАКОВАТЬ, которую отдают быстро и
часто, - и требовать под неё удержание нельзя. У крысы это было исправлено
сразу, у остальных - забыто; теперь у всех одинаково. -->
<property name="AnimWait" value="0.05"/>
<property name="SoundWarn" value="zombiedogalert"/>
<property name="SoundAttack" value="zombiedogattack"/>
<property name="Entity" value="necroZombieDog"/>
@@ -587,15 +605,99 @@
since it doesn't mean much against a zombie, kept only the slow that was asked
for. Gated to zombies only, same EntityTagCompare pattern as everywhere else in
this mod that adds a buff on hit. -->
<!-- УРОН ПОДНЯТ С ВАНИЛЬНЫХ 8 ДО 35, 2026-09-18. Указание: зомбоживотные - это "по
сути те же крысы, но размер модели оригинальный, урон нарастает от зомбособаки до
зомбоволка... они уже реально убивают зомби эффективно", и следом уточнение
"зомбособаке урон 35 и шанс расчленения, как и волку, как и медведю".
Лестница целиком: Дух крысы 5 -> Зомбогриф 20 -> Зомбопёс 35 ->
Зомбомедведь 45 -> Зомбоволк 60. Верхняя ступень - ванильный урон лютоволка,
ниже неё всё выстроено вручную; ванильные значения были 8 / 22 / 60 / 60, то
есть лестницы не было вовсе (медведь и волк совпадали).
ГРИФ НАМЕРЕННО САМЫЙ СЛАБЫЙ ИЗ ЗВЕРЕЙ, и это не просчёт: "для атаки он не особо
подходит", роль у него будет другая - см. BACKLOG.md 18.09, замысел сделать из
него аналог разведдрона (запустить в небо и смотреть его глазами).
РАСЧЛЕНЕНИЕ - у Пса, Медведя и Волка. Ни у Грифа, ни у Духа крысы его нет.
Величина 0.25 одна на всех троих: конкретной цифры названо не было, а разводить
её по видам незачем - они уже разведены уроном. -->
<property class="Action0">
<property name="DamageEntity" value="35"/>
</property>
<effect_group name="necroMeleeHandZombieDog" tiered="false">
<passive_effect name="ModSlots" operation="base_set" value="0"/>
<passive_effect name="DismemberChance" operation="base_add" value="0.25"/>
<triggered_effect trigger="onSelfAttackedOther" action="AddBuff" target="other" buff="buffInjurySlow">
<requirement name="EntityTagCompare" target="other" tags="zombie"/>
</triggered_effect>
<!-- Кровотечение добавлено 2026-09-18 всем призванным зомбоживотным. Метку духа
и ослабление (buffNecroRatMark) они НЕ ставят по прямому указанию - это
остаётся особенностью крысы, у которой своего урона почти нет. Замедление
buffInjurySlow выше - НЕ то же самое, что "ослабление": оно стоит здесь с
28.08 по отдельной просьбе ("укус применяет buffInjurySlow") и не трогалось.
Скажите, если его тоже убрать. -->
<triggered_effect trigger="onSelfAttackedOther" action="AddBuff" target="other" buff="buffNecroRatBleed"/>
</effect_group>
</item>
</append>
<!-- Оружие ближнего боя трёх остальных зомбоживотных, 2026-09-18. До сих пор они брали
ванильные предметы напрямую (meleeHandAnimalMountainLion / meleeHandAnimalZombieBear /
meleeHandAnimalDireWolf), и своих эффектов у них не было вовсе. Теперь нужны свои: и
чтобы выстроить лестницу урона, и чтобы повесить кровотечение.
effect_group НЕ наследуется через Extends (см. заметку в шапке файла), поэтому у каждого
он свой, а не добавленный к родительскому. Всё остальное - задержка, радиус, звуки удара -
наследуется от ванильного предмета как есть. -->
<append xpath="/items">
<item name="necroMeleeHandZombieGriffin">
<property name="Extends" value="meleeHandAnimalZombieVulture"/>
<property name="CreativeMode" value="None"/>
<!-- 20, а не 35: понижено 18.09 по прямому указанию. Гриф - будущий разведчик, а не
боец (см. комментарий к лестнице выше). Расчленения у него тоже нет. -->
<property class="Action0">
<property name="DamageEntity" value="20"/>
</property>
<effect_group name="necroMeleeHandZombieGriffin" tiered="false">
<passive_effect name="ModSlots" operation="base_set" value="0"/>
<triggered_effect trigger="onSelfAttackedOther" action="AddBuff" target="other" buff="buffNecroRatBleed"/>
</effect_group>
</item>
</append>
<append xpath="/items">
<item name="necroMeleeHandZombieBear">
<property name="Extends" value="meleeHandAnimalZombieBear"/>
<property name="CreativeMode" value="None"/>
<property class="Action0">
<property name="DamageEntity" value="45"/>
</property>
<effect_group name="necroMeleeHandZombieBear" tiered="false">
<passive_effect name="ModSlots" operation="base_set" value="0"/>
<passive_effect name="DismemberChance" operation="base_add" value="0.25"/>
<triggered_effect trigger="onSelfAttackedOther" action="AddBuff" target="other" buff="buffNecroRatBleed"/>
</effect_group>
</item>
</append>
<append xpath="/items">
<item name="necroMeleeHandZombieWolf">
<property name="Extends" value="meleeHandAnimalDireWolf"/>
<property name="CreativeMode" value="None"/>
<!-- 60 - ванильный урон лютоволка, верхняя ступень лестницы. Оставлен как есть. -->
<property class="Action0">
<property name="DamageEntity" value="60"/>
</property>
<effect_group name="necroMeleeHandZombieWolf" tiered="false">
<passive_effect name="ModSlots" operation="base_set" value="0"/>
<passive_effect name="DismemberChance" operation="base_add" value="0.25"/>
<triggered_effect trigger="onSelfAttackedOther" action="AddBuff" target="other" buff="buffNecroRatBleed"/>
</effect_group>
</item>
</append>
<!-- "Жуки Властелина" (Insect Swarm summon): user request 2026-08-28, added alongside the
Zombie Dog bugfix above since it reuses the exact same summon plumbing (SpawnEntity,
HarmonySrc/SummonPatch.cs ownership/limit).
@@ -656,7 +758,10 @@
<append xpath="/items">
<item name="bookSummonInsectSwarm">
<property name="Tags" value="T0,weapon,attPerception"/>
<property name="ItemTypeIcon" value="book"/>
<!-- ItemTypeIcon="book" УБРАН 2026-09-18 со ВСЕХ свитков и книг призыва разом,
прямое указание: "свитки призыва и книги призыва не должны содержать белую
иконку книги поверх. Они ПРЕДМЕТЫ, а не рецепты." Полный разбор виджета - у
bookSummonRatSpirit ниже и у Пространственного браслета (07.09). -->
<!-- ICON REPLACED 2026-08-29: same reasoning as bookSummonZombieDog above - swapped
the earlier hand-drawn schematicInsectoSummon.png for BeetlesOfTheLord.png. -->
<property name="CustomIcon" value="BeetlesOfTheLord"/>
@@ -681,7 +786,22 @@
<property class="Action0">
<property name="Class" value="SpawnEntity"/>
<property name="AnimType" value="4"/>
<property name="AnimWait" value="0.3"/>
<!-- 0.05, а не 0.3 - выровнено со Свитком духа крысы 2026-09-18, после того как
в игре не призвались НИ ГРИФ, НИ ВОЛК, НИ МЕДВЕДЬ, ни пёс, а крыса
призвалась. В логе у всех четверых было только "action index=1" (отзыв) и ни
одного index=0: до Spawn основной клик не доходил вовсе.
ItemActionSpawnEntity.OnHoldingUpdate копит stateTime по 0.05 за тик и
сравнивает с animWait, а ExecuteAction(_bReleased: true) при отпускании
кнопки сбрасывает состояние в None. То есть 0.3 означало "держать кнопку
треть секунды", шесть тиков подряд, и обычный клик до спавна не доживал -
молча, без ошибки и без строки в логе.
Раньше это сходило с рук: призыв делают раз за сессию и кнопку держали. Но
теперь на этом же слоте сидит КОМАНДА АТАКОВАТЬ, которую отдают быстро и
часто, - и требовать под неё удержание нельзя. У крысы это было исправлено
сразу, у остальных - забыто; теперь у всех одинаково. -->
<property name="AnimWait" value="0.05"/>
<property name="SoundWarn" value="swarmalert"/>
<property name="SoundAttack" value="swarmattack"/>
<property name="Entity" value="necroInsectSwarm"/>
@@ -703,7 +823,10 @@
<append xpath="/items">
<item name="bookSummonZombieGriffin">
<property name="Tags" value="T0,weapon,attPerception"/>
<property name="ItemTypeIcon" value="book"/>
<!-- ItemTypeIcon="book" УБРАН 2026-09-18 со ВСЕХ свитков и книг призыва разом,
прямое указание: "свитки призыва и книги призыва не должны содержать белую
иконку книги поверх. Они ПРЕДМЕТЫ, а не рецепты." Полный разбор виджета - у
bookSummonRatSpirit ниже и у Пространственного браслета (07.09). -->
<!-- ICON ADDED 2026-08-29: real generated art (SummonZombieGriffin.png). -->
<property name="CustomIcon" value="SummonZombieGriffin"/>
<property name="DescriptionKey" value="bookSummonZombieGriffinDesc"/>
@@ -721,9 +844,28 @@
<property class="Action0">
<property name="Class" value="SpawnEntity"/>
<property name="AnimType" value="4"/>
<property name="AnimWait" value="0.3"/>
<property name="SoundWarn" value="mlionalert"/>
<property name="SoundAttack" value="mlionattack"/>
<!-- 0.05, а не 0.3 - выровнено со Свитком духа крысы 2026-09-18, после того как
в игре не призвались НИ ГРИФ, НИ ВОЛК, НИ МЕДВЕДЬ, ни пёс, а крыса
призвалась. В логе у всех четверых было только "action index=1" (отзыв) и ни
одного index=0: до Spawn основной клик не доходил вовсе.
ItemActionSpawnEntity.OnHoldingUpdate копит stateTime по 0.05 за тик и
сравнивает с animWait, а ExecuteAction(_bReleased: true) при отпускании
кнопки сбрасывает состояние в None. То есть 0.3 означало "держать кнопку
треть секунды", шесть тиков подряд, и обычный клик до спавна не доживал -
молча, без ошибки и без строки в логе.
Раньше это сходило с рук: призыв делают раз за сессию и кнопку держали. Но
теперь на этом же слоте сидит КОМАНДА АТАКОВАТЬ, которую отдают быстро и
часто, - и требовать под неё удержание нельзя. У крысы это было исправлено
сразу, у остальных - забыто; теперь у всех одинаково. -->
<property name="AnimWait" value="0.05"/>
<!-- Звуки призыва сменены 2026-09-18: "при появлении слышен крик льва, а не
грифа". Остались с той поры, когда Гриф был горным львом; модель откатили на
стервятника, а свиток забыли - те же грабли, что "зомбомедведь лает", только
теперь на предмете, а не на сущности. -->
<property name="SoundWarn" value="vulturealert"/>
<property name="SoundAttack" value="vultureattack"/>
<property name="Entity" value="necroZombieGriffin"/>
<property name="EntityOffset" value="0, -1, 2.5"/>
</property>
@@ -741,7 +883,10 @@
<append xpath="/items">
<item name="bookSummonZombieBear">
<property name="Tags" value="T0,weapon,attPerception"/>
<property name="ItemTypeIcon" value="book"/>
<!-- ItemTypeIcon="book" УБРАН 2026-09-18 со ВСЕХ свитков и книг призыва разом,
прямое указание: "свитки призыва и книги призыва не должны содержать белую
иконку книги поверх. Они ПРЕДМЕТЫ, а не рецепты." Полный разбор виджета - у
bookSummonRatSpirit ниже и у Пространственного браслета (07.09). -->
<!-- ICON ADDED 2026-08-29: real generated art (SummonZombieBear.png). -->
<property name="CustomIcon" value="SummonZombieBear"/>
<property name="DescriptionKey" value="bookSummonZombieBearDesc"/>
@@ -759,7 +904,22 @@
<property class="Action0">
<property name="Class" value="SpawnEntity"/>
<property name="AnimType" value="4"/>
<property name="AnimWait" value="0.3"/>
<!-- 0.05, а не 0.3 - выровнено со Свитком духа крысы 2026-09-18, после того как
в игре не призвались НИ ГРИФ, НИ ВОЛК, НИ МЕДВЕДЬ, ни пёс, а крыса
призвалась. В логе у всех четверых было только "action index=1" (отзыв) и ни
одного index=0: до Spawn основной клик не доходил вовсе.
ItemActionSpawnEntity.OnHoldingUpdate копит stateTime по 0.05 за тик и
сравнивает с animWait, а ExecuteAction(_bReleased: true) при отпускании
кнопки сбрасывает состояние в None. То есть 0.3 означало "держать кнопку
треть секунды", шесть тиков подряд, и обычный клик до спавна не доживал -
молча, без ошибки и без строки в логе.
Раньше это сходило с рук: призыв делают раз за сессию и кнопку держали. Но
теперь на этом же слоте сидит КОМАНДА АТАКОВАТЬ, которую отдают быстро и
часто, - и требовать под неё удержание нельзя. У крысы это было исправлено
сразу, у остальных - забыто; теперь у всех одинаково. -->
<property name="AnimWait" value="0.05"/>
<property name="SoundWarn" value="bearalert"/>
<property name="SoundAttack" value="bearattack"/>
<property name="Entity" value="necroZombieBear"/>
@@ -779,7 +939,10 @@
<append xpath="/items">
<item name="bookSummonZombieWolf">
<property name="Tags" value="T0,weapon,attPerception"/>
<property name="ItemTypeIcon" value="book"/>
<!-- ItemTypeIcon="book" УБРАН 2026-09-18 со ВСЕХ свитков и книг призыва разом,
прямое указание: "свитки призыва и книги призыва не должны содержать белую
иконку книги поверх. Они ПРЕДМЕТЫ, а не рецепты." Полный разбор виджета - у
bookSummonRatSpirit ниже и у Пространственного браслета (07.09). -->
<!-- ICON ADDED 2026-08-29: real generated art (SummonZombieWolf.png). -->
<property name="CustomIcon" value="SummonZombieWolf"/>
<property name="DescriptionKey" value="bookSummonZombieWolfDesc"/>
@@ -797,7 +960,22 @@
<property class="Action0">
<property name="Class" value="SpawnEntity"/>
<property name="AnimType" value="4"/>
<property name="AnimWait" value="0.3"/>
<!-- 0.05, а не 0.3 - выровнено со Свитком духа крысы 2026-09-18, после того как
в игре не призвались НИ ГРИФ, НИ ВОЛК, НИ МЕДВЕДЬ, ни пёс, а крыса
призвалась. В логе у всех четверых было только "action index=1" (отзыв) и ни
одного index=0: до Spawn основной клик не доходил вовсе.
ItemActionSpawnEntity.OnHoldingUpdate копит stateTime по 0.05 за тик и
сравнивает с animWait, а ExecuteAction(_bReleased: true) при отпускании
кнопки сбрасывает состояние в None. То есть 0.3 означало "держать кнопку
треть секунды", шесть тиков подряд, и обычный клик до спавна не доживал -
молча, без ошибки и без строки в логе.
Раньше это сходило с рук: призыв делают раз за сессию и кнопку держали. Но
теперь на этом же слоте сидит КОМАНДА АТАКОВАТЬ, которую отдают быстро и
часто, - и требовать под неё удержание нельзя. У крысы это было исправлено
сразу, у остальных - забыто; теперь у всех одинаково. -->
<property name="AnimWait" value="0.05"/>
<property name="SoundWarn" value="wolfdirealert"/>
<property name="SoundAttack" value="wolfdireattack"/>
<property name="Entity" value="necroZombieWolf"/>
@@ -814,6 +992,121 @@
</item>
</append>
<!-- "Дух крысы" (Rat Spirit): питомец начального уровня, указание 2026-09-18.
УРОН 5 - прямо по указанию, и это почти ничего (у волчьего укуса, от которого предмет
наследуется, 60). Крыса не оружие: она вешает дебафы. Их два, и оба БЕЗ гейта по тегу
"zombie", в отличие от укуса зомбопса выше - крысе разрешено атаковать любое существо,
значит и дебафы должны ложиться на то, что она укусила, а не только на зомби.
ЗАМЕДЛЕНИЕ СДЕЛАНО СВОЁ (buffNecroRatGrip, см. buffs.xml), а не взято из ванили: все
готовые "слоу" - это эффекты игроцкой системы травм, половина из них скрыта и написана
заодно под транспорт. Своё - это ровно RunSpeed/WalkSpeed/CrouchSpeed с затуханием, без
лишнего. Что эти величины вообще доходят до ИИ зомби, подтверждено декомпиляцией
EntityAlive.GetMoveSpeedAggro - разбор целиком в комментарии к самому баффу. -->
<append xpath="/items">
<item name="necroMeleeHandRatSpirit">
<property name="Extends" value="meleeHandAnimalDireWolf"/>
<property name="CreativeMode" value="None"/>
<property class="Action0">
<property name="DamageEntity" value="5"/>
</property>
<!-- effect_group НЕ наследуется через Extends (см. заметку в шапке файла) - триггеры
родителя пришлось бы переписывать целиком, и здесь они и не нужны: у крысы свои. -->
<effect_group name="necroMeleeHandRatSpirit" tiered="false">
<passive_effect name="ModSlots" operation="base_set" value="0"/>
<triggered_effect trigger="onSelfAttackedOther" action="AddBuff" target="other" buff="buffNecroRatGrip"/>
<triggered_effect trigger="onSelfAttackedOther" action="AddBuff" target="other" buff="buffNecroRatMark"/>
<triggered_effect trigger="onSelfAttackedOther" action="AddBuff" target="other" buff="buffNecroRatBleed"/>
</effect_group>
</item>
</append>
<!-- "Свиток духа крысы": тот же свиток, что у Зомбоволка, но серее - указание 2026-09-18
("выглядит как свиток призыва зомбоволка, но с более серым тинтом"). Иконка
переиспользуется целиком (CustomIcon="SummonZombieWolf"), своей рисовать не пришлось;
CustomIconTint обесцвечивает её, TintColor - 3D-модель в руке. Оба множатся на базовый
цвет, как у Камня духов.
ДВА ДЕЙСТВИЯ, И ОНИ НЕ ТЕ ЖЕ, ЧТО У ОСТАЛЬНЫХ ПИТОМЦЕВ. Action1 (силовая атака) - отзыв,
как везде. А вот Action0 у крысы ТРЁХзначный, и разбирает это HarmonySrc/PetCommandPatch.cs:
если крыса не призвана - призыв; если призвана - КОМАНДА АТАКОВАТЬ того, на кого смотрит
прицел; если под прицелом некого атаковать - "Нет цели для атаки" и больше ничего.
Class="SpawnEntity" в обоих слотах при этом обязателен: наш префикс висит именно на
ItemActionSpawnEntity.Spawn, и без него клик до нас не дойдёт.
Книга НЕ расходуется (ConsumesBook=false в SummonPatch.cs): иначе командовать атакой
означало бы тратить свиток на каждый приказ. -->
<append xpath="/items">
<item name="bookSummonRatSpirit">
<property name="Tags" value="T0,weapon,attPerception"/>
<!-- ItemTypeIcon="book" НЕ СТАВИТСЯ, хотя стоит у всех шести книг призыва выше.
Баг-репорт 2026-09-18: "у книги призыва есть ещё одна белая иконка книги поверх.
Такая обычно появляется на неизученных рецептах, но тут у нас не рецепт и не
книга для изучения. Это предмет."
Это тот же виджет, что уже разбирался 07.09 у Пространственного браслета (см.
его комментарий ниже, там полностью): значок 12x12 в ЛЕВОМ ВЕРХНЕМ углу поверх
иконки предмета, XUi_InGame/templates.xml, recipe_entry:
<sprite name="itemtypeicon" sprite="ui_game_symbol_{itemtypeicon}" .../>
Значение подставляется прямо в имя спрайта, поэтому "book" даёт белую книжку. У
ванили этот значок означает "куда/чем крафтится" (bundle, forge, campfire), и
единственный ванильный предмет с value="book" - это настоящая схема. Наш свиток
схемой не является: его не изучают, им пользуются. Значок вводил в заблуждение.
Убрано целиком, а не заменено: ItemClass.ItemTypeIcon по умолчанию "", виджет
закрыт гейтом {hasitemtypeicon}, и без свойства он просто не рисуется.
У ОСТАЛЬНЫХ ШЕСТИ КНИГ ПРИЗЫВА ЭТОТ ЖЕ ЗНАЧОК ПОКА ОСТАЛСЯ - трогать их без
указания не стал, но замечание к ним относится ровно так же. -->
<property name="CustomIcon" value="SummonZombieWolf"/>
<property name="CustomIconTint" value="8a9a8a"/>
<property name="DescriptionKey" value="bookSummonRatSpiritDesc"/>
<property name="DisplayType" value="ammoGrenadeFire"/>
<property name="HoldType" value="21"/>
<property name="Meshfile" value="@:Other/Items/Misc/bookPrefab.prefab"/>
<property name="Material" value="Mpaper"/>
<property name="TintColor" value="120, 135, 120"/>
<property name="Weight" value="0"/>
<property name="Stacknumber" value="10"/>
<property name="EconomicValue" value="0"/>
<property name="Group" value="Ammo/Weapons,Ammo"/>
<property name="SoundPickup" value="schematics_grab"/>
<property name="SoundPlace" value="schematics_place"/>
<property class="Action0">
<property name="Class" value="SpawnEntity"/>
<property name="AnimType" value="4"/>
<!-- 0.05, а НЕ 0.3, как у остальных призывных книг. Исправлено 2026-09-18 по первому же
игровому запуску: в логе шесть нажатий подряд и все с action index=1 (отзыв), ни
одного с index=0 - то есть до Spawn основной клик не доходил вовсе.
Причина в ItemActionSpawnEntity.OnHoldingUpdate: stateTime растёт по 0.05 за тик и
сравнивается с animWait, а ExecuteAction(_bReleased: true) при отпускании кнопки
сбрасывает состояние обратно в None. Значит 0.3 - это "держать кнопку треть
секунды", шесть тиков; обычный клик короче и не доходит до спавна, причём МОЛЧА -
ни ошибки, ни строки в логе.
Для остальных питомцев удержание терпимо (призыв делают раз в сессию), а у крысы
на этом же слоте сидит КОМАНДА АТАКОВАТЬ - приказ посреди боя, который отдают
быстро и часто. Требовать под него удержание нельзя. -->
<property name="AnimWait" value="0.05"/>
<property name="SoundWarn" value="rabbitpain"/>
<property name="Entity" value="necroRatSpirit"/>
<property name="EntityOffset" value="0, -1, 2.5"/>
</property>
<property class="Action1">
<property name="Class" value="SpawnEntity"/>
<property name="AnimType" value="4"/>
<property name="AnimWait" value="0.1"/>
<property name="SoundWarn" value="swoosh"/>
<property name="Entity" value="necroRatSpirit"/>
<property name="EntityOffset" value="0, -1, 2.5"/>
</property>
</item>
</append>
<!-- "Книга банши" (Banshee's Book): BACKLOG.md item 7 (dictated 2026-08-28, implemented
2026-08-29 "без вопросов" per user request). Consumed on use, plays a screamer's own
alert sound, spawns a small HOSTILE horde near the caster - see
@@ -836,7 +1129,10 @@
<append xpath="/items">
<item name="bookBanshee">
<property name="Tags" value="T0,weapon,attPerception"/>
<property name="ItemTypeIcon" value="book"/>
<!-- ItemTypeIcon="book" УБРАН 2026-09-18 со ВСЕХ свитков и книг призыва разом,
прямое указание: "свитки призыва и книги призыва не должны содержать белую
иконку книги поверх. Они ПРЕДМЕТЫ, а не рецепты." Полный разбор виджета - у
bookSummonRatSpirit ниже и у Пространственного браслета (07.09). -->
<!-- ICON UPDATED 2026-08-29: real generated art (BansheesScroll.png), no tint. -->
<property name="CustomIcon" value="BansheesScroll"/>
<property name="DescriptionKey" value="bookBansheeDesc"/>