bc48ca03a650f1c628d8bf96053c372f5478357c
44
Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
7c0a48eec6 |
Одержимость: вид от первого лица по ~/ё
Клавиша QuickMenu (~/ё, как переключение вида у персонажа) переключает вид; каждое вселение начинается от третьего лица. Камера в голове со сглаживанием, голова сжата почти в точку, прицел без запаса на свою спину. Подсказка на 13 языках. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
85a7c2721e |
Одержимость: прицел мимо своего тела, плевок мутанта в прицел
- AimPoint пропускает тело одержимого: у крупных зомби луч камеры упирался в свою спину - прицел не краснел, удары и выстрелы шли в себя. - Плевок мутанта (E): скорость снарядов пересчитывается навесом в цель под прицелом (до 15 м), вместо ванильного веера под ноги; подсказка на 13 языках. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
5b69e0c04f |
Одержимость: питомцы не бьют одержимого, бег по Shift у всех, прыжок паука на E
- Охрана питомцев (SnakeControl.IsFoe) и их ИИ (префикс SetAttackTarget) больше не берут одержимого зомби целью. - Shift днём: скорость - ночная ярость (moveSpeedAggroMax), дневная у многих равна шагу. - E у прыгунов (паук) - дальний прыжок, как пробел; подсказка на 13 языках. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
bbe1b52ea4 |
Одержимость: плевок мутанта на E, ошибочный подрыв мутанта убран
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
37ad57f1bc |
Одержимость: приёмы Чака, ранчера и крикуньи на E, откаты в HUD
Чак: E - замах, ПКМ - бросок валуна в прицел или в существо. Ранчер: ПКМ - Рой фараона, E - невидимость. Крикунья: E - орда под девиацией. Здоровье одержимого и откаты - на месте полосок здоровья и выносливости игрока. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
cb2a4f19b4 |
Девять новых испытаний некромантии
Вселиться в зомби и в своего питомца, подорвать одержимого копа, 25 убийств змеёй, войти в чертоги (ChallengeStatAwarded: счёт шлёт NecroChallenges.cs), найти череп (Gather), сок чёрной розы, мод «Мёртвая буря», гримуар медведя (Craft). Тексты намёком, 13 языков. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
47a4b345af |
Стиратель снят из кода (наработки отложены для дронов магов)
Подмешивание в орду было выключено 10.10: в кровавый прилив змеи нет, античит не нужен. Убраны EraserPatch.cs, сущность zombieEraser, бафф свечения, строка локализации, отброс змеи взрывом и текстуры Resources/Eraser. В выпущенных версиях Стирателя не было - сейвы игроков не затронуты. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
8ad2f25c37 |
Останки красного трупа: модель, сущность, истлевание через 2 минуты
Красный труп «Жертвы» истлевает в лёгкий контейнер necroRemains (своя модель: остов, обтянутый обугленной плёнкой, бандл necroremains) через 2 минуты, раньше - если игрок дальше 80 м или трупов больше 30. Лут и остаток срока переходят, звук разбитого пятна крови (organicdestroy). Команда necroremains истлевает трупы рядом сразу (для проверки). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
3780a69d93 |
Меловая доска игрока: рецепт, записи в обычной игре
Отдельный блок necroChalkboardPlayer (модель и надпись сюжетной доски): крафт с начала игры - краска 2, дерево 8, гвозди 4, волокна 3, кости 2; писать можно в обычной игре, записи свои у каждой доски; можно подобрать. Сюжетная necroChalkboard (чертоги) по-прежнему пишется только модом. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
b13759908e |
Кровавый прилив: нож-меч (статы, хват мачете), бег, восстановление, пульс, сердце
В прилив: урон, скорость ударов и вампиризм ножа вдвое, плата за силовую вдвое меньше, выносливость вчетверо меньше, дальность 2.8, хват мачете (модели меча пока нет). С ножом в руке: бег +50%, восстановление здоровья и выносливости вдвое, полоски пульсируют фиолетовым, сердце 120 уд/мин. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
6e1a6c0720 |
Кровавый прилив: глава книги и надпись на доске чертогов
Глава с листом-схемой (Fig. VII, подписи на эсперанто), пока открыта с 1 дня для теста (по замыслу - с 5). Оглавление - до 10 глав. Доска чертогов на 5 день: «Осторожно! Приближается лунный прилив!» вместо «излучения красной луны». Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
8541c7abdf |
Кровавый прилив: в ночь кровавой луны дух не выходит из тела
Нет змеи, чертогов, одержимости зомби и питомцев; кто вне тела - выброшен в тело; «коза» без эффекта. Подмешивание Стирателей в орду отключено. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
bdca1bdba5 |
Книга: главы собаки, стервятника, волка, медведя; гримуары; чертоги 25x13x25 с нумерованными дверями
- Главы питомцев с чертежами (Fig. III-VI), команда necroobj для выгрузки моделей - Книги призыва питомцев переименованы в гримуары (13 языков) - Чертоги: второй этаж; таблички necroDoorNumber (только в редакторе) нумеруют двери, дверь с номером закрыта до события (SetDoorOpen, necropalace door N open|close), с начала открыты 2, 4, 5, 6 - Дух: плавный шаг по ступенькам, проход в проёмы с порогом - Стервятник: снижение только C, без Ctrl-переключателя Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
4e14a0562b |
Книга: главы ножа и Могильной крысы; плакат ножа, грифельная доска, дверь-шкаф; чертоги 25x8x25; плата силовой ножа 20/40
- Книга некроманта: главы «Нож некроманта» и «Могильная крыса» - лист-чертёж сверху (Textures/, три вида из Blender, подписи на эсперанто), управление и лор; окно книги непрозрачное, текст с контуром - «Дух крысы» переименован в «Могильную крысу» на 13 языках (ключи прежние) - Блоки (Dev): плакат-синька ножа (necroPosterKnife, 3:2 под полотно рамки), грифельная доска necroChalkboard (надписи - TEFeatureSignable, писать только в редакторе/творческом; шрифт Neucha OFL, свой шейдер текста с тестом глубины), дверь-книжный шкаф necroBookDoor (своя модель с аниматором, хитбокс створки через RootTransformRefParent) - Чертоги: префаб 25x8x25 (промежуточный); открываются только межкомнатные двери; надписи на досках по дням игры: «Отомсти архимагу!», с 5-го дня «Берегись излучения красной луны» - Нож: силовая атака стоит 20 здоровья, с «Мёртвой бурей» 40; не хватает - itembreak, «Недостаточно здоровья» и обычный удар; описания на 13 языках - Консольная команда necromodel - устройство модели блока в лог Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
e94e967b8e |
Одержимость: прицел-перекрестие с покраснением, кнопки E/F, лут мешков и багажник волка, медведь на дыбы
- Прицел всех одержимых - всегда перекрестие (свой guiDrawCrosshair: точка бралась из проверки камеры от 3-го лица у тела); краснеет на враге: у стервятника - цель рывка, у наземных - враг на луче прицела до 30 м, не за стеной - Падаль: отхил вдвое меньше (EatHealFrac 0.125); ест на F стервятник, медведь, собака, волк и одержимые зомби - E - действие: стервятник - клич (был F), крыса/волк - обыск, медведь - на дыбы (враги до 3.5 м сбиты с ног и отброшены, откат 6 с) - Рёв медведя: надписи «на медведя идут N» и откат, мимо очереди подсказок - Крыса и волк обыскивают мешки с зомби (EntityLootContainer), волк берёт в сумку - Багажник волка: окно сумки как у браслета, без рюкзака; выброс - у волка - Отзыв волка: мешок на месте и метка «Сумка волка» на карте, снимается с мешком - Тексты на 13 языках Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
31aa99860c |
Одержимость питомцев: роли медведя, волка, собаки и крысы; ноша стервятника; череп при обыске
- Могильная крыса: своя модель без волчьей шерсти; стоит на земле (центр капсулы); E - осмотр контейнеров без права взять (окно игры, рюкзак скрыт, отказ «инвентарь заполнен», контейнер не разрушается); ПКМ - проход сквозь постройки, полупрозрачная. - Стервятник: курица в когтях - слепок с обвисшими крыльями и шеей, без хитбокса. - Зомбособака: нюх - все существа рядом на компасе и карте. - Медведь: толстая шкура (вдвое меньше урона), рёв-провокация, удар лапой по блокам. - Лютоволк: бросок на цель с опрокидыванием, след крови раненых, сумка на 3 ячейки (лут, выгрузка у тела, выпадает мешком при гибели и отзыве; отдельный файл сейва). - Череп (останки): 2% при обычном обыске красного трупа вместо браслета. - Прицел книги не рисуется в одержимости; подсказки вселения на 13 языках. - Замер EntityLeakProbe: удалённые, но живые в памяти сущности - в лог. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
beab1640b0 |
Одержимость питомцев, стервятник-разведчик, метки на карте, череп, глава письма
- Одержимость питомца: ПКМ с книгой - вселиться, E - отозвать (и изнутри питомца), пояс скрыт, надпись о враге у тела. - Одержимый стервятник: полёт, рывок на ЛКМ с 10 м с прямым уроном, звуком и кровотечением, обычный прицел краснеет на цели; посадка в позу 0 и взлёт на пробел; ПКМ - клич-приманка (паникующая курица, откат 0.5 с); F - питаться трупами и блоками-падалью, доеденное исчезает. - Дух змеи атакует только нежить; фиолетовая метка на карте у змеи и одержимого. - Череп из красного трупа (этап 1 цинерария); глава книги «Письмо архимага» с видео. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
027c707233 |
Кровавая роза: семена, куст, ступка, сок чёрной розы
- Кровавые семена (50 семян травы + кровь некроманта), три этапа роста на грядке: росток -> бутоны-черепа -> куст роз с черепом в сердцевине (бандл necrorose). Урожай - чёрные розы (3 базово, бонусы фермерства через ванильные теги). - Ступка (верстак, 1 куб, руны на боку; бандл necromortar) - на Подмастерье. - Сок чёрной розы: 4 розы + пустая банка на ступке; банка - копия банки крови с чернильно-чёрным содержимым (в бандле necroblood). - Копии всех рецептов на крови некроманта с соком: банка сока = две банки крови (при одной крови - одна), из сока 3 кровавые сферы вместо 2. - Иконки семян, ступки, сока и чёрной розы; тексты на 13 языках. - DecorColliderTagPatch: хитбокс ступки и куста роз. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
fdd3782024 |
Змея: выход из текстур, полёт на ПКМ; одержимый: приседание, удар по прицелу; коза
- Змея: проверка «внутри текстуры» лучами (земля игры - поверхность), каждый кадр выброс на ближайшее свободное место (на земле - из любых текстур, в полёте - из грунта); шаг и прыжок в текстуры не пускают. Полёт пока зажата ПКМ: 1.1 м/с (половина шага зомби), сквозь постройки можно, в грунт нельзя; Пробел вверх, C/Ctrl вниз. E - аварийный выход. Детализация зданий и область тела - как у одержимого. - Одержимый: будит спящих (комнаты зданий и сам вид одержимого), приседание на C и Ctrl, удар по точке под прицелом с наведением на грудь ближнего врага. - Хваты: толчок руки к прицелу на ЛКМ; «пиф-паф» вселяет на пике толчка. «Отрицание» стало «Козой» (13 языков): средний и безымянный поджаты, большой прижат; звук - бросок змеи. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
66a0dcf403 |
Чертоги разума, хваты пустой руки, одержимость, книга с оглавлением
- Чертоги разума: дух в префабе chertogi под землёй, книга памяти, нож и плакат; кровать префаба - мебель necroPalaceBed (иначе становилась точкой возрождения); охрана выбрасывает и игроков (их нет в EntityAlives). - Хваты пустой руки по R: «отрицание» и «пиф-паф» - поза рук костями поверх аниматора, остальные кости заморожены, ЛКМ - заклинание, прицел краснеет на зомби. - «Отрицание»: зомби в ужасе бежит дальше 40 м и теряет игрока как цель. - «Пиф-паф»: одержимость зомби-гуманоидом - бег, прыжок, удар, дальняя атака, подрыв, крик крикуньи; тело цепенеет, зомби танкуют одержимого; область вокруг тела сжата; полоска здоровья; спавн и прорисовка у одержимого. - Книга с оглавлением (окно necroTome), глава «Некроэнергия». - Прорисовка дверей у змеи и одержимого (CheckLODs от камеры, а не от тела). - Почтовый ящик консоли и команды necrobones/necropose/necroshot для разработки. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
c828202c66 |
Режим змеи: леденящий ужас, Стиратель, радиация без таймера
- Радиация: проверка раз в 2 с, в поясе змея сразу развеивается (таймер 30 с убран). - Леденящий ужас: учуянные змеёй зомби (30 м) бегут, ломая препятствия; очередь испуга, отметка места змеи для поиска пути, выключен в кровавую луну. «Шум» (зомби шли к змее) удалён. Диагностика бегства в логе пока оставлена. - Стиратель (zombieEraser): в орде игрока-змеи с шансом 0.5; взрывается на любой атаке и при разрыве змеёй, отбрасывает змею; тело - чёрный разрыв. Вид: своя раскраска на модели гавайца (Resources/Eraser), свечение маджента, звуки спайдера. - Фиолетовая змея на карте (necroSnakeSpirit). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
20ee89323d |
Пирамида отрицания: своя костяная модель, новое имя, иконка
- модель: ступени из костей, черепа с тлеющими глазницами, костяная ось насквозь, наверху цветок из рваной плоти на коротком шипастом стебле из скрученных жил, в нём фиолетовый кристалл; бандл necroward (копия префаба оссуария) - блок на Shape="ModelEntity" как оссуарий; шейдер и теги коллайдера ставит GeoOssuaryPatch (теперь для обоих префабов); свой коллайдер-коробка - «Пирамида духов» переименована в «Пирамиду отрицания» (13 языков, и в описаниях); внутреннее имя блока прежнее - уже поставленные пирамиды в сейвах сохранятся - иконка - рендер модели Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
d7a43318ff |
Испытания: названия - Кровавый запас, Фараон на минималках, Кровь за кровь земли
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
934bc3c7f5 |
Испытания некромантии: 7 новых (скакун, оссуарий, сферы, камень, свиток крысы, браслет, пирамида)
- Всадник на костях: создать Костяного скакуна (2500) - Недра платят кровью: поставить Гео-оссуарий (2000) - Запас крови: создать 10 кровавых сфер (1000) - Кровь, ставшая камнем: создать Кровавый камень (2500) - Крысиный король: создать Свиток духа крысы (1000) - Карман в пустоте: создать Пространственный браслет (2000) - Ересь: поставить Пирамиду духов (2000) Тексты на 13 языках. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
d35b77be1b |
Кровавый камень - вечное топливо скакуна и оссуария; сферы чинятся пакетом крови
- Камень в любой ячейке скакуна - вечно полный бак, сферы рядом не тратятся. - Камень в отсеке топлива гео-оссуария - работает вечно (FuelTypes + removeFuel). - Кровавая сфера чинится пакетом крови: 250 прочности за пакет (2 пакета - полная). - Описания сферы, камня, оссуария и скакуна дополнены (13 языков); в описании скакуна по-корейски и по-китайски название сферы приведено к принятому в моде. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
24d6e9f675 |
1.7.0: скакун на сферах в ячейках, ремонт костями; правки моделей скакуна и книги крысы
- Топливо скакуна - кровавые сферы в 4 ячейках модификаций, тратятся по очереди (одна сфера = 120 ед., бак 480); уровень бака считается по прочности сфер, выработанная сфера исчезает. Заправка канистрой убрана. В ячейки - только сферы. - Причина «не едет» и «-2147483648%»: Extends не наследует effect_group, у предмета скакуна не было ни ячеек, ни прочности. Своя группа: ModSlots 4, DegradationMax 4000; здоровье закреплено кодом (DegradationMax сфер в ячейках его перебивал бы). - Ремонт - 50 костей за ход вместо ремкомплекта; подсказка при нехватке, 13 языков. - Модель скакуна: сиденье и рама прогнуты по ванили, рога по оси руля, череп меньше и короче, свет фары в глазнице, крыло над передним колесом, зубы под черепом убраны. - Книга крысы: повёрнута как ванильная (палец на корешке), без металлических уголков. В игре не проверено. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
11db1116b0 |
1.7.0: костяной скакун, книга Духа крысы, турели, расход сфер в оссуарии
- Костяной скакун (necroBoneSteed): мотоцикл из костей, сухожилий и сосудов с черепом-циклопом вместо фары; своя модель (бандл necrobonesteed), ванильная система предмета-транспорта (necroBoneSteedPlaceable, предпросмотр при установке); топливо - кровавая сфера, одна сфера = полный бак; теги коллайдеров и шейдер копируются с ванильного мотоцикла; рецепт на верстаке, Подмастерье - Книга Духа крысы: своя модель (бандл necrobooks) - чёрная кожа, светящийся узор со скелетом крысы и семиконечной звездой, ржавые уголки, ремешок - Турели не стреляют по существам мода (питомцы, рой, змея) - Гео-оссуарий тратит 1/10 прочности сферы на стак вместо целой сферы В игре не проверено. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
f2dfeed126 |
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> |
||
|
|
6ff76d174e |
Режим змеи для Ножа некроманта и чёрный разрыв
Ночью по R с ножом - дух змеи: тело падает (-95% HP), игрок управляет призрачной змеёй от первого лица. Свободный ход по миру (свой наблюдатель чанков, отрисовка, звук, спавн и спящие считаются от змеи), прыжок, атака на ЛКМ - рывок сквозь препятствия и чёрный разрыв, ПКМ - выбраться из текстур. Тёмное чутьё, тревога у тела, отсчёт в радиации края карты, пурпурный фильтр зрения (necrovision). Утром змея развеивается. Чёрный разрыв (NecroBurst.cs): клон частиц confetti в чёрном, команда necroburst. Проверено в игре 28.09. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
e25544521d |
Труп «Жертвы» открывается сам, как ящик: без мешка
Обыск больше не превращает труп в мешок. Труп получает сумку со списком добычи zPackVictim и открывается игровым путём (LockRequestLocal -> LootBagOpened -> окно добычи с игровым таймером обыска). Запрет открывать мёртвых у EntityAlive снят префиксами только для таких трупов. Открытый и не опустошённый труп лежит час, опустошённый убирается сразу. После загрузки труп узнаётся по сохранённой сумке (баффы зомби в сейв не пишутся). LockRequestLocal вызывается из TEPersistence (перегрузка с ReadOnlySpan не компилируется в основном проекте). Класс EntityLootContainerVictim оставлен ради старых сейвов. Описание ножа исправлено на всех языках, README - текущее описание. Проверено в игре на 3.3: открытие, таймер, уборка опустошённых, восстановление после загрузки. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
f4470b784f |
1.4.2: проверка версии игры и хранилище, которое не стирается
Повод: 1.4.1 на игре 3.3.0 experimental не смогла прочитать Пространственное хранилище (Bag переписан) и при сохранении записала пустой маркер - вещи пропали навсегда. GameVersionGuard: версия из Constants.cVersionInformation (не из const cVersionMinor - та вшивается в DLL), поддерживается Major 3 и Minor/10 == 2, то есть любая 3.2.x. На другой версии в главном меню окно «мод несовместим, обновите» с единственной кнопкой «Выйти из игры» (решение пользователя), а вместо PatchAll ставятся по отдельности только окно и четыре патча сохранения хранилища. Всё, чем пользуется защита, сверено с декомпиляцией 3.3. Хранилище: непрочитанные байты (чужая версия или упавший разбор) проходят Read -> ToPlayer -> FromPlayer -> Write нетронутыми, ключ - entityId, сброс при открытии главного меню (последнее сохранение игрока делается раньше, внутри SaveAndCleanupWorld - проверено по коду игры). Пока байты не прочитаны, хранилище не открывается и не пополняется, с подсказкой. Проверено в игре на 3.2 через отладочные файлы FORCE_VAULT_UNREAD и FORCE_VERSION_GUARD (в .gitignore, в архив не попадают): 603 байта хранилища прошли сохранение и прочитались обратно совпадающими с исходными (26 ячеек, 24 предмета); окно появляется, Esc его не закрывает, кнопка закрывает игру. На настоящей 3.3 не проверено. Localization: 4 новых ключа на 13 языках, всего 165; README - статус и число ключей (было 149). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
d97f83e972 |
ИИ питомцев переписан, добавлен Дух крысы, пороги разнесены по шкале
Работа по указаниям 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> |
||
|
|
ed5fea5192 |
1.3.0: шкала 20 убийств за уровень, два индикатора, мир между подчинёнными
Уровень навыка игра хранит ОДНИМ БАЙТОМ (ProgressionValue.Write/Read), поэтому старая шкала "одно убийство - один уровень" при max_level=5000 на каждом сохранении откатывала уровень на 256 назад. Снаружи это выглядело как самопроизвольно закрывающиеся рецепты (жалоба со стрима: Слёзы мертвеца открыты, Пир падальщика под замком при 250+ убитых), а тиры 500/2000/3000/5000 были недостижимы в принципе. Подтверждено на двух живых сейвах: sezon8 - 384 убийства при уровне 129, test8 - 303 при уровне 48. Шкала переведена на 20 убийств = 1 уровень, max_level=250 - влезает в байт с запасом. Уровень больше не накапливается, а вычисляется из necroZombieKillsCVar (float, сохраняется честно) и на каждом убийстве, и постфиксом на PlayerDataFile.ToPlayer - последнее чинит старые сейвы само, без команд и новой игры. Открытое при этом не теряется: в старой шкале уровень всегда был не больше счётчика, так что пересчёт может только вернуть украденное переполнением. Отдельно закрыт случай "счётчик пуст, а уровень есть" - счётчик восстанавливается из уровня по старой шкале. Все пороги пересчитаны в уровни, числа убийств не тронуты, кроме воды: 30 на сетку шагом 20 не ложится, по указанию пользователя мод переехал на 20 - туда же, где браслет и Кровавая сфера. Тег necroNecromancyLvl30 удалён. Сходимость всех 18 рецептов (тег -> RecipeTagUnlocked -> unlock_tier) проверена скриптом. Два индикатора: череп в статус-баре показывает уровень (раньше - общее число убийств), фиолетовая шкала над полосой опыта - продвижение внутри уровня, 0..20. Шкала сделана вёрсткой, а не баффом (бафф умеет число, но не полосу), заполнение привязано через XUi-выражение cvar(). Закрывающая скобка у выражения - одна "}", а не "%}": лишний "%" NCalc читает как остаток от деления и ждёт правый операнд, на чём первая проверка в игре и споткнулась. Третья правка: подчинённые зомби больше не дерутся между собой. Девиация выдаёт приказ "бей зомби", а подчинённый сам EntityZombie, и в targetClasses выражается только тип. Постфикс на EAITarget.check вычёркивает подчинённого из кандидатов (зомби выбирает следующего, настоящего врага), префикс на EntityAlive.SetAttackTarget гасит цель на путях мимо выбора - прежде всего месть, когда подчиняют уже дерущихся. Тексты на 13 языках, README (RU+EN), описания для сайта и Nexus приведены к новой шкале. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
e71cd69d1e |
Названия испытаний: в стиле, заданном пользователем
Мои были описательные ("Первый подданный", "Короткая дорога домой") - верные по
смыслу и скучные. Пользователь предложил свои:
Камень духов "Не бейте меня" подчинённый зомби бьётся за
игрока, по игроку не бьют
Синий портальный камень "Сам себе G.L.A.D.O.S." отсылка к Portal
Нож некроманта "Основной инструмент" каламбур на "Основной инстинкт"
"Безумный донор" не тронут - он и был авторский, и уже в этом стиле.
КАК РЕШАЛСЯ ПЕРЕВОД, потому что шутки переводятся плохо:
"Не бейте меня" - буквально на все 13, смысл не зависит от культуры.
"Сам себе G.L.A.D.O.S." - имя ИИ сохранено латиницей во всех языках (имя
собственное, в локализациях Portal оно тоже латиницей), переводится только
обёртка.
"Основной инструмент" - каламбур на названии фильма, живёт только там, где
название созвучно. Сохранён: en Basic Instinct -> Basic Instrument, es Instinto
basico -> Instrumento basico, pl Nagi instynkt -> Nagi instrument, ru Основной
инстинкт -> Основной инструмент. Где фильм известен под английским названием или
созвучия нет (de/fr/it/ja/ko/tr/zh) - взят прямой смысл "главный инструмент".
Мёртвую шутку туда не подставляли: каламбур, который не звучит, читается как
ошибка переводчика, а не как юмор.
Описания не переписаны, остались в серьёзно-атмосферном тоне. Контраст выглядит
скорее намеренным; свести тон - отдельная правка на 4 ключа x 13 языков.
Ключей по-прежнему 149, менялись значения, не состав.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
||
|
|
d8f06cd53a |
Награды испытаний по реальной цене + Камень духов и портальный камень
Пользователь: "за кровь 100 XP маловато". Награды не задавались вовсе, поэтому
все испытания падали на challenge_reward_default (100 XP, gameevents.xml:602).
Своих событий заводить не нужно - готовы 500/1000/2000/2500/5000/10000.
ИСПРАВЛЕНА МОЯ ЖЕ ОЦЕНКА. Я предложил оставить ножу 100, обосновав это тем, что
он "один крафт, без риска", - и сказал это ДО чтения рецепта. В нож входит
1 Кровь некроманта, а её крафт снимает 90 процентов ТЕКУЩЕГО здоровья. Нож стоит
захода на порог смерти, аналогия с craftStoneAxe была неверной. Поставлено 500.
Итоговая лестница, каждое число обосновано ценой:
Камень духов 1 камень + 20 волокон 100
Нож некроманта 5 костей + 10 волокон + 1 кровь 500
Синий портальный камень 150 праха зомби + 3 минералки 2000
Безумный донор 15 крафтов крови = 15 x 90% ХП 2500
Портальный камень: 2000 при одном крафте, потому что в рецепте 150 праха зомби.
Прах падает с помеченной Жертвы по 1-4 с вероятностью 0.4 (loot.xml), в среднем
около единицы за убийство - то есть порядка 150 ритуальных убийств ножом.
Ванильный craftForgedIron (100 крафтов) платит 2000 за такой же грайнд без риска.
Донор: 2500, выше портального камня, потому что оплачивает не грайнд, а
смертельный риск. Выше не пошли - 5000 ваниль держит за химстанцией и тирами
квестов.
Камень духов: 100 и это не занижение - самая дешёвая вещь мода и буквальный
аналог craftStoneAxe, за который ваниль платит ровно умолчание.
ДВА НОВЫХ ИСПЫТАНИЯ, названия под механику:
"Первый подданный" - Камень духов подчиняет зомби, и тот бьётся за игрока; это
первое существо, которое слушается некроманта. Иконка specters_grace совпадает
и с названием предмета, и со смыслом.
"Короткая дорога домой" - камень телепортирует к спальному мешку и не
расходуется. Иконка map_house.
Локализация: 6 ключей x 13 языков, ключей стало 149. Счётчик в README и
SITE_DESCRIPTION обновлён. Текст наград заводить не пришлось - ключи
challenge_reward_*xp ванильные.
НЕ ПРОВЕРЕНО В ИГРЕ.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
||
|
|
6301a62a54 |
Испытание "Безумный донор": вкладка укомплектована
В скелет сознательно клали одно испытание, чтобы сперва убедиться, что вкладка
появляется. Убедились в игре - добавлено второе, оба заказанных на месте.
<objective type="Craft" item="resourceNecromancerBlood" count="15"/>
Craft, а не Gather: кровь не добывается из мира, она крафтится. count у Craft
работает - проверено заранее, потому что в самых наглядных ванильных примерах
(craftStoneAxe, craftClothes) счётчика нет и легко решить, что его не бывает; на
деле 18 ванильных Craft-целей его несут, вплоть до resourceForgedIron count=100.
Иконка ui_game_symbol_siphoning_strikes ("высасывающие удары") - найдена при
разборе всех 359 доступных символов. Под механику "плати собственной кровью"
попадает точнее любого медицинского символа.
Имя оправдано механикой, а не просто звучит: каждый крафт снимает 90 процентов
ТЕКУЩЕГО здоровья (NecromancerBloodPatch.cs) и требует нож в инвентаре.
Пятнадцать раз подряд - пятнадцать раз до полусмерти.
Зависимости от первого испытания нет и не будет (указание "разрозненно"), хотя
фактически кровь без ножа не скрафтить: игрок сам упрётся в нож, если начнёт с
крови, и это честнее замка.
Локализация: 3 ключа x 13 языков, ключей стало 143. Счётчик в README (RU+EN) и
SITE_DESCRIPTION.html (RU+EN) обновлён той же правкой. Шапка challenges.xml
переписана - она описывала состояние "одно испытание из двух".
НЕ ПРОВЕРЕНО В ИГРЕ.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
||
|
|
90d8fe331b |
Вкладка испытаний Некромантии: скелет
Новый Config/challenges.xml - мод его раньше не имел. Категория (вкладка), группа и ОДНО испытание "Первым делом - нож". Одно, а не два заказанных, намеренно: файл трогается впервые, сначала надо увидеть в игре, что вкладка вообще появляется. Нож крафтится сразу и без верстака, то есть проверка занимает минуту. "Безумный донор" добавится одной записью, когда скелет подтвердится. РАЗРОЗНЕННО, НЕ ЦЕПОЧКОЙ (по указанию): у группы нет ни link_challenges, ни hidden_by. Побочная польза - снялось противоречие порядка: Кровь некроманта нельзя скрафтить без ножа, так что "донор" первым в цепочке был бы невыполним. ИКОНКИ ТОЛЬКО ИЗ СИМВОЛЬНОГО АТЛАСА ИГРЫ. В templates.xml оба места, где они рисуются (challenge_entry и category_icon), объявлены БЕЗ атрибута atlas, то есть читают атлас по умолчанию; в ванильном challenges.xml все 215 иконок имеют вид ui_game_symbol_* без исключений. Свой атлас мода (NecroFinal) не поможет - обратиться к нему можно только явным atlas= на спрайте, а дописать его в шаблон нельзя: шаблон один на все испытания, ванильные иконки пропадут. Из 359 собранных символов нашлись некромантские, череп не понадобился. Вкладка - ui_game_symbol_zombie (тот же символ, что у скилла в progression.xml, чтобы вкладка и скилл читались как одно целое), нож - ui_game_symbol_knife. Для "Безумного донора" отложен ui_game_symbol_siphoning_strikes. Локализация: 5 ключей x 13 языков, ключей стало 140. Название вкладки взято слово в слово из craftingNecroNecromancyName. Счётчик в README и SITE_DESCRIPTION обновлён 135 -> 140. ОСОЗНАННЫЙ РИСК: у группы нет reward_text_key и reward_event, хотя у всех 20 ванильных они есть. Ставка на умолчания корня challenges (default_reward, default_reward_text_key). Если не сработает - будет в логе, и это дешевле, чем заводить событие награды вслепую. НЕ ПРОВЕРЕНО В ИГРЕ. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
5a512260cc |
Кровавый камень: бесконечный заряд браслета
Эндгейм-версия расходника Пространственного браслета: то же место в слоте, что у
Кровавой сферы, но не тратится вовсе. Кода менять не пришлось - только конфиги.
ЗАОДНО ЭТО ПОЧИНКА УЖЕ ОТГРУЖЕННОГО ТЕКСТА. Сообщение о пустом слоте
(braceletSpatialVaultNoMod) и описание браслета обещают игроку "кровавую сферу
ИЛИ кровавый камень" на всех 13 языках с 15.09. Пока камня не было, оба текста
отправляли за предметом, которого в игре не существует.
СОВМЕСТИМОСТЬ СЕЙВОВ - ПЕРВОЕ, ЧТО ПРОВЕРЕНО. resourceBloodStone - НОВОЕ имя, в
существующих сейвах его нет, значит нет и ни одного стака, который читался бы по
другой байтовой раскладке. Это ровно то условие, нарушение которого в
|
||
|
|
896501dcd8 |
Откат крови и Кровавая сфера вместо неё
Чинит поломку сейвов, внесённую предыдущим коммитом |
||
|
|
e362c627e7 |
Кровь некроманта - топливо Пространственного браслета
Шесть указаний одного захода, которые сложились в одну механику: поглощение блока больше не бесплатно. Браслет требует модификацию в слоте, кровь ею стала, и она на это тратится. СТАК ПО ОДНОЙ БАНКЕ. Наследуемый medicalBloodBag даёт Stacknumber 15, и это надо перебивать явно - Extends копирует свойство целиком, а не "если не задано иначе". Дорого и так задумано: Чёрный портал просит десять банок, то есть десять ячеек. ПРОЧНОСТЬ 1000. Свойства с именем вроде Durability в игре нет; ручек две, и обе обязательны. Число - пассивный эффект DegradationMax (ItemValue.MaxUseTimesBase -> EffectManager.GetValue), полоска - отдельное свойство ShowQuality (XUiC_ItemStack.ShowDurability -> ItemClass.ShowQualityBar). Без первой прочность равна нулю, а полоска при MaxUseTimes == 0 рисуется ПОЛНОЙ, то есть забытый эффект выглядит как "всё работает". tiered="false" обязателен: ItemClass.HasQuality читается как Effects.IsOwnerTiered(), и тированная группа превратила бы банку в предмет с качеством, с тирами и рамкой. КРОВЬ ПЕРЕЕХАЛА В item_modifiers.xml. Это не настройка, а смена класса предмета: XUiC_ItemPartStack.CanSwap открывается строкой `if (!(stack.itemValue.ItemClass is ItemClassModifier ...)) return false;` - слот модификации не смотрит ни на теги, ни на свойства, пока предмет не ItemClassModifier, а этот класс создаётся только из <item_modifier>. Свойства вида CanBeInstalled не существует; остаться ресурсом в items.xml и вставляться в браслет физически нельзя. На старом месте оставлен комментарий-указатель. Что при этом проверено, а не понадеялось: рецепты резолвятся (ItemClassModifier наследует ItemClass, имена лежат в общем ItemClass.nameToItem, Recipe ищет через GetItemClass по тому же словарю); сейв цел (ItemClass.assignIdsFromMapping берёт айди из сохранённого name->id мэппинга, перестановка в конфигах предмет не подменит); Harmony-патч и ключи локализации ходят по имени, имя не менялось. ЛОВУШКА ПЕРЕЕЗДА: у модификации effect_group применяется к предмету, В КОТОРЫЙ её вставили - прочность 1000 начала бы выдаваться БРАСЛЕТУ. Пассивка гейтована tags="necroBloodFlask", тег добавлен в Tags флакона: MaxUseTimesBase зовёт GetValue с ItemTags того предмета, для которого считает. СЛОТОВ У БРАСЛЕТА 1, было 4. Слот из набора улучшений стал выбором. ПУСТОЙ СЛОТ ОТКАЗЫВАЕТ. Проверка стоит первой строкой Begin, впереди всех остальных отказов: прочие про ЦЕЛЬ (нет блока, не тот блок, хранилище полно), эта про ИНСТРУМЕНТ, и сказать "здесь нет блока", когда пуст браслет, значит отправить игрока искать не там. Тест - ItemValue.HasMods(), игровой собственный: обходит только Modifications, пропуская null и IsEmpty, и не считает CosmeticMods, иначе краска читалась бы как "браслет заряжен". Звук отказа достался бесплатно - Deny() в этом файле уже играет ванильный ui_denied. РАСХОД. Цена пула считается ОДИН раз, при старте, и едет в PickupJob.ChannelSeconds вместе с самим браслетом. Не потому, что так короче: ChannelSecondsFor меряет луч игрока, а за десять секунд игрок успевает отвернуться - второй вызов насчитал бы цену за другой блок, а не за тот, который забрали. Браслет хранится экземпляром по той же причине: моды живут на ItemValue, а колесо прокручивается. Списывается в SpendBlood, ПОСЛЕ SetBlockRPC и после того, как предмет лёг в хранилище: все отказы выходят раньше через return, так что кровь за отменённое поглощение невозможна по построению. Имя предмета берётся из NecromancerBloodPatch.BloodItemName, а не вторым литералом, чтобы не разъехались. Мод, который не кровь, не платит ничего и поглощению не мешает - слот задуман под другие вещи. КОНЧИЛАСЬ - РАЗБИВАЕТСЯ. Правило именно "прочность 0 или меньше", а не "не хватило на пул", и разница не косметическая: по второй формулировке флакон, которому хватило впритык, остался бы в слоте с нулём, HasMods() видел бы "что-то вставлено", и браслет работал бы бесплатно до конца света. Поэтому зажим по MaxUseTimes убран, а слот обнуляется через ItemValue.None - это type 0, ровно то, что проверяет IsEmpty(). Последнее поглощение проходит всегда, флакон его просто не переживает. Звук - ванильный itembreak, тот же, что играет ItemAction.HandleItemBreak. Защита: если MaxUseTimes окажется 0 (снесли passive_effect или тег), флакон НЕ удаляется, а в лог идёт предупреждение с указанием, где чинить. Без этой ветки ошибка в XML съедала бы игроку предмет на первом же поглощении, и выглядело бы это багом механики. Локализация: новый ключ braceletSpatialVaultNoMod в 13 языках, плюс описания флакона и браслета - механика стала условной и платной, и оба текста без этого стали бы враньём. Известное и намеренное: кровавого камня, который обещает сообщение о пустом слоте, ещё нет - он запланирован, разбор в BACKLOG.md. В игре ничего из этого не проверено. --- Necromancer's Blood is the Spatial Bracelet's fuel Six instructions from one session that add up to one mechanic: pulling a block into the vault is no longer free. The bracelet needs a mod in its slot, the blood became that mod, and it is spent doing the work. ONE JAR PER STACK. The inherited medicalBloodBag sets Stacknumber 15 and it has to be overridden explicitly - Extends copies a property wholesale, not "unless set". Expensive on purpose: the Black Portal asks for ten jars, so ten slots. DURABILITY 1000. There is no property called anything like Durability; there are two knobs and both are required. The number is a DegradationMax passive effect (ItemValue.MaxUseTimesBase -> EffectManager.GetValue); the bar is a separate ShowQuality property (XUiC_ItemStack.ShowDurability -> ItemClass.ShowQualityBar). Without the first, durability is zero - and the bar at MaxUseTimes == 0 draws FULL, so a forgotten effect looks exactly like success. tiered="false" is mandatory: ItemClass.HasQuality is Effects.IsOwnerTiered(), and a tiered group would have turned the jar into a quality item with tiers and a frame. THE BLOOD MOVED TO item_modifiers.xml. Not a setting but a change of item class: XUiC_ItemPartStack.CanSwap opens with `if (!(stack.itemValue.ItemClass is ItemClassModifier ...)) return false;` - a mod slot looks at neither tags nor properties until the item is an ItemClassModifier, and that class is only created from <item_modifier>. No CanBeInstalled property exists; staying a resource in items.xml and going into the bracelet is impossible. A pointer comment was left where it used to live. Checked rather than hoped: recipes still resolve (ItemClassModifier extends ItemClass, names live in the shared ItemClass.nameToItem, Recipe looks them up through GetItemClass); saves are safe (ItemClass.assignIdsFromMapping takes ids from the stored name->id mapping, so shuffling configs cannot swap the item); the Harmony patch and the localization keys go by name, and the name did not change. THE TRAP IN MOVING IT: a modifier's effect_group applies to the item it is INSTALLED IN - the 1000 durability would have been granted to the BRACELET. The passive is gated with tags="necroBloodFlask" and the tag added to the flask's own Tags: MaxUseTimesBase calls GetValue with the ItemTags of whatever it is computing for. THE BRACELET HAS 1 MOD SLOT, down from 4. The slot stopped being a set of upgrades and became a choice. AN EMPTY SLOT REFUSES. The check is the first line of Begin, ahead of every other refusal: the others are about the TARGET (no block, wrong block, vault full), this one is about the TOOL, and saying "no block there" when the real problem is an empty bracelet sends the player looking in the wrong place. The test is ItemValue.HasMods(), the game's own: it walks Modifications only, skipping nulls and IsEmpty, and does not count CosmeticMods - a dye would otherwise have read as "loaded". The refusal sound came free: Deny() in this file already plays vanilla's ui_denied. THE COST. The price of a pull is computed ONCE, at the start, and carried in PickupJob.ChannelSeconds along with the bracelet itself. Not for brevity: ChannelSecondsFor measures the player's ray, and ten seconds is long enough to turn away - a second call would charge for a different block than the one taken. The bracelet is kept as an instance for the same reason: mods live on the ItemValue and the hotbar scrolls. It is charged in SpendBlood, AFTER SetBlockRPC and after the item is in the vault: every refusal returns earlier, so blood charged for a cancelled pull is impossible by construction. The item name comes from NecromancerBloodPatch.BloodItemName rather than a second literal, so the two cannot drift. A mod that is not blood pays nothing and does not block the pull - the slot is meant for other things. RUNS OUT, SHATTERS. The rule is "durability 0 or less", not "could not cover the pull", and the difference is not cosmetic: under the second wording a flask with exactly enough left would sit in the slot at zero, HasMods() would see "something installed", and the bracelet would work for free forever. So the MaxUseTimes clamp is gone and the slot is cleared with ItemValue.None - type 0, exactly what IsEmpty() tests. The last pull always completes; the flask simply does not survive it. The sound is vanilla's itembreak, the same cue ItemAction.HandleItemBreak plays. A guard: if MaxUseTimes comes out 0 (the passive effect or the tag removed), the flask is NOT deleted and a warning naming the fix goes to the log. Without that branch a config error would eat the player's item on the first pull and look like a bug in the mechanic. Localization: a new braceletSpatialVaultNoMod key in 13 languages, plus the flask and bracelet descriptions - the mechanic became conditional and paid, and both texts would have been lies without it. Known and deliberate: the Blood Stone the empty-slot message promises does not exist yet - it is planned, written up in BACKLOG.md. None of this is tested in game. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MnwP2Dt1vk8bUPJ452EoVL |
||
|
|
7172681353 |
Версия 1.1.0: описания под забор блоков и торговцев
Номер по публичной линии Nexus: после 1.0.1 идёт 1.1.0, а не 1.0.2 - вышла не починка, а две новые механики. Описания приведены в соответствие с модом во всех четырёх местах, где они живут: обе половины README, обе половины SITE_DESCRIPTION.html и NEXUS_DESCRIPTION.bbcode. - Забор блоков дописан в пункт про Пространственный браслет: десять секунд вплотную плюс секунда за блок расстояния, тот же круглый индикатор, что у разбора верстака, обесцвечивание мира на время ожидания, перечень того, что не поддаётся, и прерывание силовой атакой. До этой правки там стояло "обычная атака пока ничего не делает". - Торговцы - отдельным пунктом в "По мелочи", а на Nexus своим абзацем в тон остальному тексту: чёрно-белые, полупрозрачные и матовые, торговля не меняется. - Счётчик строк 123 -> 130 в трёх местах. Он врал и до сегодня: ключей было 124. ЗАОДНО ЭТО ЧИСЛО СТАЛО ЧЕСТНЫМ. Рядом со счётчиком все описания утверждают "пустых ячеек нет", и это было неправдой: у txName_NecroAsh пустовали семь языков (японский, корейский, польский, бразильский, турецкий и оба китайских). Заполнены - теперь в файле 130 ключей и ноль пустых ячеек перевода. Раздел "Статус" переписан под 1.1.0, прежний текст про 1.0.1 сохранён абзацем ниже: он не устарел, он просто стал предысторией. NEXUS_FILE_DESCRIPTION_1.0.1.bbcode намеренно не тронут - он описывает конкретную уже залитую загрузку. Новой версии понадобится свой файл. --- Version 1.1.0: descriptions updated for the block pull and the traders The number follows the public Nexus line: after 1.0.1 comes 1.1.0 rather than 1.0.2, because what shipped is two new mechanics, not a fix. The descriptions now match the mod in all four places they live: both halves of the README, both halves of SITE_DESCRIPTION.html, and NEXUS_DESCRIPTION.bbcode. - The block pull was added to the Spatial Bracelet entry: ten seconds up close plus one per block of distance, the same circular indicator a workbench pickup uses, the world draining to black and white for the wait, what refuses to be taken, and the power attack as the interrupt. Until this change the text still said the regular attack does nothing. - The traders got their own bullet under "Small things", and on Nexus their own paragraph in the tone of the rest: black and white, half-transparent and matte, with the trading itself unchanged. - The string count went 123 -> 130 in three places. It was already wrong before today: there were 124 keys. AND THAT NUMBER IS NOW HONEST. Next to the count, every description claims there are no empty cells, which was untrue: txName_NecroAsh was missing seven languages (Japanese, Korean, Polish, Brazilian Portuguese, Turkish and both Chinese). They are filled in - the file now has 130 keys and zero empty translation cells. The "Status" section is rewritten for 1.1.0, with the old 1.0.1 text kept as a paragraph below it: it did not become wrong, it became backstory. NEXUS_FILE_DESCRIPTION_1.0.1.bbcode is deliberately untouched - it describes one specific upload that already happened. The new version will need its own file. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XN8J75vnum2qAVrtRUMKf7 |
||
|
|
a6e19f9b97 |
Браслет утаскивает блоки в хранилище; обесцвечивание на время каналов
Обычная атака Пространственного браслета до сих пор ничего не делала. Теперь
она наводится на блок, показывает тот же круглый индикатор, что и демонтаж
верстака, и по его заполнении блок исчезает из мира и появляется в хранилище.
ВЕСЬ РЕЦЕПТ ВАНИЛЬНЫЙ. Block.TakeItemWithTimer и TakeItemWithTimerDone - это и
есть демонтаж верстака; взяты как есть, с двумя заменами: длительность и Bag
хранилища вместо рюкзака. Сообщения об отказе тоже ванильные
(ttRepairBeforePickup, ttBlockMissingPickup, ttCantPickupInUse,
ttWorkstationNotEmpty) - уже переведены на все языки игры, и игрок, хоть раз
забиравший верстак, знает, что они значат. Повреждённый блок отсекается первой
строкой, до открытия таймера: сообщение есть, индикатора нет.
Все проверки делаются ДВАЖДЫ, на старте и на финише: за десять секунд блок
можно расстрелять, выкопать, подменить, кто-то может открыть контейнер. Порядок
в финале принципиален - предмет кладётся в хранилище ПЕРВЫМ, и блок сносится,
только если он туда лёг; обратный порядок удалял бы блок из мира, когда
хранилище успело заполниться.
Цель - любой блок под прицелом, а не только то, что ваниль и так разрешает
поднимать. Отсюда две вещи, которых у узкого варианта не было бы: мультиблок
(дверь, кровать) приводится к родительской клетке через
multiBlockPos.GetParentPos, иначе половина модели осталась бы стоять; блоки без
предметной формы (ToItemValue пуст) отсекаются, иначе блок исчезал бы в обмен
на ничто.
СОДЕРЖИМОЕ КОНТЕЙНЕРОВ ПЕРЕЕХАТЬ НЕ МОЖЕТ: ItemStack в этой игре некуда
положить чужой инвентарь. Ваниль решает отказом, тем же и здесь, расширенным на
сундуки - в этой версии игры они моделируются композитным tile entity со
storage-фичей, поэтому вопрос задаётся фиче через
TryGetSelfOrFeature<ITileEntityLootable>.
ОТМЕНА СИЛОВОЙ АТАКОЙ, потому что десять секунд неподвижности после случайного
клика - долго, а ванильные выходы оба плохие: урон игрок не выбирает, а кнопка
активации не та, на которой уже лежит рука. Патч на XUiC_Timer.Update, как у
Синего портала, и вместе с его уроком: семантической PlayerActionsLocal.Secondary
недостаточно (модальное окно таймера держит фокус ввода - это выяснилось
багрепортом 29.08), поэтому рядом стоит сырой Input.GetMouseButtonDown(1).
Отдельная страховка от двойного открытия: отмена ловит НАЖАТИЕ, а обычная
силовая атака - ОТПУСКАНИЕ, и это одно нажатие.
ТЕРРИТОРИЯ ТОРГОВЦА И ДНО МИРА. Оба случая выглядят изнутри игры одинаково
("здесь ничего не ломается") и устроены совершенно по-разному. У торговца блоки
обычные, защищена ТЕРРИТОРИЯ: ваниль просто не зовёт DamageBlock внутри неё,
поэтому кирка не берёт, а браслет брал - он спрашивал про блок, а спрашивать
надо про место. Условие скопировано целиком, вместе с песочничной половиной
(World.SandboxUseTraderArea != Default || !IsWithinTraderArea): защита торговца
- серверная настройка, и сервер, который её выключил, не должен обнаружить, что
мод навязывает её сам. Дно мира - обратный случай: у бедрока CanDestroy=false на
МАТЕРИАЛЕ, и это спрошено как вопрос о материале, а не по имени блока.
Оба отказа с сообщением, хотя ваниль молчит: кирка, которая ничего не делает,
объясняет сама себя, а индикатор, который не появляется, выглядит как поломка
мода.
ДЛИТЕЛЬНОСТЬ РАСТЁТ С РАССТОЯНИЕМ - десять секунд вплотную, плюс секунда за
каждый полный блок. Расстояние не вычисляется заново: HitInfoDetails.distanceSq
- это квадрат длины ТОГО САМОГО луча, которым блок и выбран, а вычислять между
позициями значило бы выбрать точку в игроке (ноги? глаза?) и точку в блоке
(центр? грань?) и ошибиться хотя бы в одной. Пол, а не округление: только так
сходятся обе заданные точки - вплотную ровно 10, в пяти блоках ровно 15.
МИР ОБЕСЦВЕЧИВАЕТСЯ НА ВРЕМЯ ЛЮБОГО КАНАЛА - и утаскивания блока, и обоих
порталов (HarmonySrc/ChannelVision.cs, общий на оба, чтобы вид и время жили в
одном месте). Это штатный ScreenEffects игры: SetScreenEffect(name, intensity,
fadeTime), и плавность досталась даром - три секунды туда и три обратно это
третий аргумент. Эффект "Greyscale" выбран по тому, с кем НЕ придётся драться:
в него пишут только twitch_buffMonochrome и sandbox_blackandwhite, которых в
обычной сессии не бывает. "Dying"/"Dead" - те самые эффекты смерти, но их пишет
EntityPlayerLocal.Update из здоровья игрока при каждом изменении, и любой урон
посреди канала перехватил бы эффект. "Dark" дал бы затемнение, но принадлежит
buffCrouching и срабатывает на каждое приседание - поэтому затемнения нет
сознательно. Возврат красок вызывается на КАЖДОМ пути выхода, а в завершении
утаскивания - первой строкой, до всех проверок: десять секунд кончились и когда
блок забрали, и когда отказали.
Локализация: шесть новых ключей на 13 языков. Описание браслета переписано
(дважды за правку, вслед за механикой) - оно утверждало сначала "обычная атака
ничего не делает", потом "через десять секунд".
В игре проверено: забор блока работает. Отмена, обесцвечивание и рост
длительности - ещё нет.
---
The bracelet pulls blocks into the vault; colour drains during channels
The Spatial Bracelet's regular attack did nothing until now. It aims at a block,
shows the same circular indicator a workbench pickup does, and when it fills the
block leaves the world and appears in the vault.
THE WHOLE RECIPE IS VANILLA'S. Block.TakeItemWithTimer and TakeItemWithTimerDone
are the workbench pickup; taken as they are, with two substitutions - the
duration, and the vault's Bag instead of the backpack. The refusal messages are
vanilla's own keys too (ttRepairBeforePickup, ttBlockMissingPickup,
ttCantPickupInUse, ttWorkstationNotEmpty), already translated into every language
the game ships, and a player who has taken a workbench already knows them. A
damaged block is refused on the first line, before the timer opens: a message,
and no indicator.
Every guard is checked TWICE, once to open and once to finish: in ten seconds a
block can be shot, mined, replaced, or opened by someone else. The order at the
end matters - the item goes into the vault FIRST and the block is only removed if
it got there; the other way round deletes a block out of the world in exchange
for nothing when the vault filled up meanwhile.
The target is any block under the crosshair, not only what vanilla already lets
you take. Two things follow that the narrow version would never have faced: a
multiblock (a door, a bed) is resolved to its parent cell through
multiBlockPos.GetParentPos, or half the model would be left standing; and blocks
with no item form (ToItemValue comes back empty) are refused, or a block would
vanish in exchange for nothing.
CONTENTS CANNOT TRAVEL: an ItemStack in this game has nowhere to put another
container's inventory. Vanilla solves this by refusing, and so does this,
extended to chests - this version of the game models them as a composite tile
entity with a storage feature, so the question is asked of the feature through
TryGetSelfOrFeature<ITileEntityLootable>.
THE POWER ATTACK CANCELS, because ten seconds of standing still after a misclick
is long and vanilla's two escapes are both poor here: getting hit is not a
choice, and the activate key is not the button a hand is already on. The patch
sits on XUiC_Timer.Update like the Blue Portal Stone's, and carries its lesson:
the semantic PlayerActionsLocal.Secondary is not enough, because the modal timer
window holds input focus (found by a bug report on 29 Aug), so a raw
Input.GetMouseButtonDown(1) sits next to it. A separate guard stops one press
opening the vault twice: the cancel catches the button going DOWN, the ordinary
power attack catches it coming UP, and that is one press.
A TRADER'S GROUND AND THE WORLD'S FLOOR look identical from inside the game
("nothing breaks here") and are nothing alike underneath. A trader's blocks are
ordinary; it is the AREA that is protected - vanilla simply skips DamageBlock
inside it, which is why a pickaxe does nothing while the bracelet did not: it was
asking about the block when it had to ask about the place. The condition is
copied whole, sandbox half included (World.SandboxUseTraderArea != Default ||
!IsWithinTraderArea): trader protection is a server setting, and a server that
turned it off should not find this mod enforcing it anyway. The world's floor is
the opposite case - bedrock carries CanDestroy=false on its MATERIAL, and that is
asked as a question about the material rather than by block name.
Both refusals speak, where vanilla stays silent: a pickaxe that does nothing
explains itself, an indicator that never appears looks like this mod is broken.
THE CHANNEL GROWS WITH REACH - ten seconds up close, one more per full block.
The distance is not recomputed: HitInfoDetails.distanceSq is the squared length
of the very ray that chose this block, while measuring between positions would
mean picking a point in the player (feet? eyes?) and a point in the block
(centre? face?) and being wrong about one. Floor rather than round, because only
that makes both given anchors come out right - exactly 10 up close, exactly 15 at
five blocks.
COLOUR DRAINS OUT DURING ANY CHANNEL - the block pull and both portals
(HarmonySrc/ChannelVision.cs, shared so the look and the timing live in one
place). This is the game's own ScreenEffects: SetScreenEffect(name, intensity,
fadeTime), and the smoothness came free - three seconds each way is that third
argument. "Greyscale" was chosen by who else writes to it: only
twitch_buffMonochrome and sandbox_blackandwhite, neither of which happens in an
ordinary session. "Dying"/"Dead" are the death visuals being imitated, but
EntityPlayerLocal.Update writes "Dying" from the player's health on every change,
so any damage mid-channel would take it over. "Dark" would have supplied the
darkening half, but it belongs to buffCrouching and fires on every crouch - so
the darkening is deliberately absent. The colour is restored on EVERY exit path,
and in the pull's completion on the first line, before any check: the ten seconds
are over whether the block was taken or refused.
Localization: six new keys in 13 languages. The bracelet's description was
rewritten (twice in this change, following the mechanics) - it claimed first that
the regular attack does nothing, then that the pull takes ten seconds.
Confirmed in game: taking a block works. The cancel, the desaturation and the
distance scaling are not tested yet.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XN8J75vnum2qAVrtRUMKf7
|
||
|
|
ab1b3eadaf |
Версия 2.0: свои модели ножа и крови, своя краска блоков через патч атласа
Нож некроманта и Кровь некроманта получили собственные модели, а Пирамида духов - собственную поверхность. Три разных способа, каждый выбран по тому, как устроен сам предмет. НОЖ И КРОВЬ - свои префабы в бандлах мода. Форма записи "#@modfolder(...)?prefab" подтверждена живым примером; геометрия у обоих ванильная, меняются материал и текстура. Текстуры генерируются скриптами (см. _private/tools), а не рисуются: правка вида сводится к правке констант и одному запуску. Нож: состаренная кость, почти чёрная обмотка, пурпур во впадинах, плюс слой под ручную роспись рун - он подмешивается в альбедо и в эмиссию, поэтому руны светятся. Слой пользовательский, генератор его никогда не перезаписывает. Положение росписи посчитано по геометрии: развёртка выгружена из меша, и подобрано смещение, при котором вся роспись ложится на одну плоскую грань. Раньше она перегибалась через кромку, обращённую к игроку. Кровь: банка вместо мешка. Заодно чинится расхождение, жившее с самого начала - описание предмета говорило "Банка, наполненная кровью", а наследуемый medicalBloodBag показывал sackPrefab, обычный мешок. Жидкость перерисована по маскам мешей, а не перекрашена тинтом: тинт предмета на этот меш не действует вовсе, у шейдера Game_EntityTintMaskSSS выигрывает _Color материала. ПИРАМИДА - своя краска в атласе блоков через собственный Harmony-патч. Ваниль своих текстур блоков не умеет: Texture у блока это индекс в готовом атласе, а запись краски несёт только TextureId/PaintCost/Group/SortIndex и никогда путь к картинке. Поэтому CustomBlockPaintPatch дописывает наш слой в массивы атласа на лету. Путь через свою модель (Shape="ModelEntity") пробовался и отложен: там остались нерешёнными столкновения и маджента на дальних экземплярах. Краска лучше тем, что блок остаётся обычным Shape="New" - со всеми работающими столкновениями, наведением по E и правильной посадкой, - а поверхность у него своя. Побочно краска доступна кисточкой под именем "Некротический прах". Параметры атласа не угаданы, а замерены в игре (BlockAtlasProbePatch): 512x512, DXT1 для альбедо и DXT5 для нормалей со specular, 10 мип-уровней, массивы нечитаемые - отсюда GPU-копирование и явные настройки импорта текстур. Зонд оставлен намеренно: номер краски в blocks.xml (608) это длина ванильного uvMapping, и после обновления игры он может сдвинуться - зонд печатает фактические числа при каждом запуске. Патчи обёрнуты целиком: они работают внутри загрузки игры, где вылетевшее исключение срывает шаг загрузки. Resources/necropyramid в коммит не идёт - на него никто не ссылается. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01W5F3AVwsusZHMqPBcSQcVJ |
||
|
|
e8f064f5ec |
Книга некроманта 1.0 — первая публичная версия
Мод для 7 Days to Die 3.2: навык «Некромантия», растущий от счётчика убитых зомби, тёмное оружие с шестью собственными модами, призывная нежить, пирамида духов и сюжетный финал через Чёрный портал. Локализация на 13 языках. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MaNro5hAGTzcQ7rJNN2tCX |