Метка «Жертвы» вешается до урона: работает и при убийстве с одного удара

Метка висела на onSelfAttackedOther, которое приходит после DamageEntity; при смертельном
ударе добыча успевала разыграться без неё. Перенесена на onSelfPrimary/SecondaryActionRayHit
(до урона, как лечение ножом), с гейтом Health GT 0 - трупы больше не метятся.
Отзыв sanovskiy на Nexus. Проверено в игре на 3.3: три убийства с одного удара дали «Жертву».

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
AlexCube
2026-09-26 17:54:07 +03:00
co-authored by Claude Opus 5.5
parent e8e21d5a58
commit 1c2e3f2cdf
+22 -9
View File
@@ -1361,8 +1361,23 @@
fast. 120 matches that same reference point. --> fast. 120 matches that same reference point. -->
<passive_effect name="AttacksPerMinute" operation="base_set" value="120"/> <passive_effect name="AttacksPerMinute" operation="base_set" value="120"/>
<triggered_effect trigger="onSelfAttackedOther" action="AddBuff" target="other" buff="buffNecroVictim"> <!-- МЕТКА ЖЕРТВЫ - ДО УРОНА, 2026-09-26 (1.5.0; отзыв sanovskiy на Nexus: «убил ножом с
одного удара - Жертвы нет, приходится бить дважды»). Раньше метка висела на
onSelfAttackedOther, а оно приходит ПОСЛЕ DamageEntity (ItemActionAttack.cs:838 в
3.3). На смертельном ударе внутри DamageEntity успевают пройти Kill ->
OnEntityDeath -> dropItemOnDeath (EntityAlive.cs:3050, 5470), и VictimPatch
разыгрывал добычу ещё без метки; метка потом ложилась уже на труп.
*ActionRayHit приходят ДО урона (ItemActionDynamic.cs:541, Hit - строка 598), как
у лечения ниже, поэтому метка оказывается на зомби раньше его смерти. Два триггера:
обычный и силовой удар, как было и с onSelfAttackedOther. Гейт Health GT 0 теперь
безопасен (здоровье до урона) и не даёт метить трупы при разделке. -->
<triggered_effect trigger="onSelfPrimaryActionRayHit" action="AddBuff" target="other" buff="buffNecroVictim">
<requirement name="EntityTagCompare" target="other" tags="zombie"/> <requirement name="EntityTagCompare" target="other" tags="zombie"/>
<requirement name="StatCompareCurrent" target="other" stat="Health" operation="GT" value="0"/>
</triggered_effect>
<triggered_effect trigger="onSelfSecondaryActionRayHit" action="AddBuff" target="other" buff="buffNecroVictim">
<requirement name="EntityTagCompare" target="other" tags="zombie"/>
<requirement name="StatCompareCurrent" target="other" stat="Health" operation="GT" value="0"/>
</triggered_effect> </triggered_effect>
<!-- ЛЕЧЕНИЕ СНЯТО С СИЛОВОГО УДАРА 2026-09-09 (пользователь: "лучше вообще не <!-- ЛЕЧЕНИЕ СНЯТО С СИЛОВОГО УДАРА 2026-09-09 (пользователь: "лучше вообще не
лечить на силовом ударе"). Триггер сменён с onSelfAttackedOther на лечить на силовом ударе"). Триггер сменён с onSelfAttackedOther на
@@ -1399,8 +1414,8 @@
бафф в buffs.xml, а не из фактически нанесённого урона. бафф в buffs.xml, а не из фактически нанесённого урона.
- Событие летит и при попадании по блоку, но там Other пуст, и - Событие летит и при попадании по блоку, но там Other пуст, и
EntityTagCompare tags="zombie" такой вызов отсекает - как и раньше. EntityTagCompare tags="zombie" такой вызов отсекает - как и раньше.
buffNecroVictim НЕ трогали: он остался на onSelfAttackedOther, то есть метка buffNecroVictim тогда НЕ трогали (остался на onSelfAttackedOther). С 1.5.0 он
Жертвы по-прежнему вешается и обычным, и силовым ударом. тоже на *ActionRayHit - см. комментарий у самой метки выше.
LIFESTEAL BUG FIXED 2026-09-07 (user report: "нож не подлечивает"). The old LIFESTEAL BUG FIXED 2026-09-07 (user report: "нож не подлечивает"). The old
version did only "ModifyCVar medicalRegHealthAmount add @$necroKnifeHealCVar", version did only "ModifyCVar medicalRegHealthAmount add @$necroKnifeHealCVar",
@@ -1439,12 +1454,10 @@
Все они висят на *ActionRayHit, а это событие уходит ДО применения урона Все они висят на *ActionRayHit, а это событие уходит ДО применения урона
(ItemActionDynamic.cs:541, ItemActionAttack.Hit вызывается в конце того же (ItemActionDynamic.cs:541, ItemActionAttack.Hit вызывается в конце того же
метода) - значит у живой цели здоровье в этот момент ещё больше нуля, включая метода) - значит у живой цели здоровье в этот момент ещё больше нуля, включая
смертельный удар. А buffNecroVictim сидит на onSelfAttackedOther, которое смертельный удар. (До 1.5.0 buffNecroVictim сидел на onSelfAttackedOther, после
уходит ПОСЛЕ DamageEntity (ItemActionAttack.cs:838, сразу за строкой 827): на DamageEntity, и потому был без гейта - на добивающем ударе здоровье там уже 0.
смертельном ударе зомби там уже мёртв и его здоровье 0, так что такой же гейт Эта же поздняя метка и была причиной «Жертвы нет при убийстве с одного удара»:
снял бы метку ровно с добивающего удара - то есть отобрал бы мешок Жертвы у добыча разыгрывалась до неё. С 1.5.0 метка тоже на *ActionRayHit и с гейтом.)
всех, кого убили с одного удара. Поэтому метка оставлена без гейта; повесить
её на уже мёртвого зомби безвредно - мешок для него всё равно уже разыгран.
AOE-эффекты "Мёртвой бури" гейтить не нужно: World/Chunk.GetLivingEntitiesInBounds AOE-эффекты "Мёртвой бури" гейтить не нужно: World/Chunk.GetLivingEntitiesInBounds
(Chunk.cs:2920) сама отсеивает цели по !IsDead(), так что трупы в выборку не (Chunk.cs:2920) сама отсеивает цели по !IsDead(), так что трупы в выборку не