From 229b436420b25494fb451cffba083111691b762b Mon Sep 17 00:00:00 2001 From: AlexCube Date: Wed, 16 Sep 2026 21:21:11 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A1=D1=87=D1=91=D1=82=20=D1=83=D0=B1=D0=B8?= =?UTF-8?q?=D0=B9=D1=81=D1=82=D0=B2=20=D0=9D=D0=B5=D0=BA=D1=80=D0=BE=D0=BC?= =?UTF-8?q?=D0=B0=D0=BD=D1=82=D0=B8=D0=B8=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B5?= =?UTF-8?q?=D1=85=D0=B0=D0=BB=20=D0=B8=D0=B7=20XML=20=D0=B2=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Чинит баг: скилл не засчитывал часть убийств зомби. Причин было две, и обе закрываются одним ходом. ПРИЧИНА 1: ОДИН КЛАСС - НЕ ВСЕ ЗОМБИ. Счёт висел append-ом на zombieTemplateMale. Человекоподобные покрыты (effect_group у entity_class наследуется через extends, и все шаблоны зомби сходятся к Male), но пять зомби-ЗВЕРЕЙ наследуют животную ветку и до него не доходят вовсе: animalZombieBear extends animalBear animalZombieBoar extends animalBoar animalZombieDog extends animalWolf animalZombieVulture extends animalTemplateHostile animalZombieVultureRadiated extends animalZombieVulture Убийство зомбопса, зомбомедведя, зомбокабана и зомбоворона не считалось никак. Вороны попадаются постоянно - это и была бОльшая часть "не всегда засчитывает". ПРИЧИНА 2: target="other" - БУКВАЛЬНЫЙ УБИЙЦА. Триггер onOtherKilledSelf с требованием EntityTagCompare tags="player" начислял только за убийство своей рукой. Робомолот, кровотечение и питомцы требование не проходят, хотя опыт игрок за них получает: ваниль определяет получателя не по убийце, а по DamageSource - в EntityAlive.AwardKillXPServer, где для этого есть обращение к BuffClass (DoT) и отдельный флаг bTrapKillXP (ловушки). Требование было ОДНО на оба эффекта, поэтому недосчитывался и necroZombieKillsCVar, а это урон Ножа некроманта (items.xml: Damage = CVar / 10). Баг тихо занижал ещё и нож. РЕШЕНИЕ: Postfix на EntityPlayer.AddKillXP. Этот метод вызывается ровно из одного места во всей сборке - из AwardKillXPServer, то есть уже ПОСЛЕ того, как ваниль разобрала DamageSource и решила, чей это фраг (проверено сканированием IL). Мы не повторяем её логику и не угадываем владельца турели или автора кровотечения - забираем готовый ответ. Наш счёт совпадает с опытом на экране по построению, включая случаи, о которых мы не подумали. ФИЛЬТР ПО ТЕГУ zombie, А НЕ ПО КЛАССУ. Проверено по данным: zombieBiker, zombieArlene, zombieBoe, zombieSpider несут "entity,zombie,...", зомби-звери - "entity,animal,zombie,zombieAnimal,...". Тег есть у всех. Работает это благодаря тому, что Tags у entity_class НЕ наследуется через extends: каждый реально спавнящийся зомби выписывает теги сам, а безтеговые шаблоны не спавнятся. Тег переживёт и новых зомби из патчей игры, и чужие моды. Повышение уровня воспроизводит MinEventActionAddProgressionLevel.Execute шаг в шаг по его IL: GetProgressionValue, Level+1, кламп по MaxLevel, для крафтового скилла AddCraftingSkillNotification и HandleCheckCrafting, затем bProgressionStatsChanged и bPlayerStatsChanged под !isEntityRemote. HandleCheckCrafting легко выбросить и дорого потерять - без него рецепты рискуют не заметить, что открылись. Уведомление с _bAddOnlyIfNotExisting=true, чтобы в орду не всплывал тост на каждый труп. Config/entityclasses.xml: append снят ЦЕЛИКОМ, на его месте комментарий, почему возвращать нельзя - XML-триггер рядом с патчем засчитает убийство своей рукой ДВАЖДЫ. Это единственная ловушка переезда. Сборка: 0 ошибок (4 прежних MSB3277). Проверено рефлексией по собранной DLL: атрибут нацелен верно, перегрузка AddKillXP ровно одна, имя параметра killedEntity совпадает с ванильным (Harmony инжектит по имени - опечатка дала бы молчаливо неработающий патч), PatchAll подхватывает файл сам. НЕ ПРОВЕРЕНО В ИГРЕ. Отдельно: питомцы НЕ гарантированы - патч следует решению ванили, а не принимает его. Если ваниль не зачисляет владельцу убийство питомцем, не зачислит и он; это отдельная работа, а не ошибка здесь. Co-Authored-By: Claude Opus 5 --- Config/entityclasses.xml | 38 ++++-- HarmonySrc/NecromancyKillCreditPatch.cs | 172 ++++++++++++++++++++++++ NecromancerHarmony.dll | Bin 92672 -> 94208 bytes NecromancerHarmony.pdb | Bin 29356 -> 29776 bytes 4 files changed, 197 insertions(+), 13 deletions(-) create mode 100644 HarmonySrc/NecromancyKillCreditPatch.cs diff --git a/Config/entityclasses.xml b/Config/entityclasses.xml index 9a17acd..f7af400 100644 --- a/Config/entityclasses.xml +++ b/Config/entityclasses.xml @@ -1,17 +1,29 @@ - - - - - - - - - +