From 0fdfe952c5ad979c88ea3c1045e16e4bf672c10d Mon Sep 17 00:00:00 2001 From: AlexCube Date: Mon, 2 Nov 2026 23:05:45 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9A=D1=80=D0=BE=D0=B2=D1=8C=20=D0=BD=D0=B5?= =?UTF-8?q?=D0=BA=D1=80=D0=BE=D0=BC=D0=B0=D0=BD=D1=82=D0=B0:=20=D1=86?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D0=B1=D0=B0=D0=BD=D0=BA=D0=B8=20=E2=80=94?= =?UTF-8?q?=2090%=20=D0=BE=D1=82=20=D0=BC=D0=B0=D0=BA=D1=81=D0=B8=D0=BC?= =?UTF-8?q?=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE=D0=B3=D0=BE=20HP,=20=D0=BD=D0=B5?= =?UTF-8?q?=20=D1=82=D0=B5=D0=BA=D1=83=D1=89=D0=B5=D0=B3=D0=BE=20(#87)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Было: 90% текущего HP на момент выдачи — очередь банок дешевела геометрически, убить могло только при 1-4 HP. Стало: RoundToInt( GetMaxHealth()*0.9); не хватило — HP уходит в 0, ваниль убивает на следующем апдейте (disease). Выжить можно только при строго больше 90% максимума. Co-Authored-By: Claude Code --- HarmonySrc/NecromancerBloodPatch.cs | 36 +++++++++++++++++++--------- NecromancerHarmony.dll | Bin 608768 -> 608768 bytes NecromancerHarmony.pdb | Bin 187748 -> 187748 bytes 3 files changed, 25 insertions(+), 11 deletions(-) diff --git a/HarmonySrc/NecromancerBloodPatch.cs b/HarmonySrc/NecromancerBloodPatch.cs index af901eb..44d0dc9 100644 --- a/HarmonySrc/NecromancerBloodPatch.cs +++ b/HarmonySrc/NecromancerBloodPatch.cs @@ -25,9 +25,11 @@ namespace NecromancerTome /// something adjacent, but it takes exactly ONE item name, not "any item of a category", /// and its actual runtime enforcement point wasn't confirmed by decompilation either - /// not risking an untested mechanism for this). - /// 2. "При крафте нужно отнимать у персонажа 90% имеющегося ХП" - crafting this recipe - /// costs 90% of the player's CURRENT health. Recipes have no cost hook beyond their - /// ingredient list at all. + /// 2. "При крафте нужно отнимать у персонажа 90% имеющегося ХП" (2026-08-30), corrected + /// by the user on 2026-11-02: reading CURRENT health there was a bug. The cost is 90% + /// of the player's MAXIMUM health, and a necromancer whose current health is below + /// that dies from the ritual. Recipes have no cost hook beyond their ingredient list + /// at all. /// /// "любого ножа" (ANY knife) is detected via ItemClass.DisplayType == "meleeKnife" - decompiled /// Data/Config/items.xml directly: every real vanilla knife (meleeWpnBladeT0BoneKnife, @@ -200,12 +202,24 @@ namespace NecromancerTome { return; } - // Deliberately not clamped to leave the player at least 1 HP - the user asked for a - // straight 90% cost, and a blood ritual that can genuinely kill you if you're already - // badly hurt fits the theme. AddHealth is the same safe, non-combat HP-modification - // API vanilla itself uses (decompiled EntityAlive.AddHealth) - not DamageEntity/ + // 90% of MAXIMUM health, per the user's correction of 2026-11-02 ("Это баг. Должно + // быть 90% от максимального здоровья. Таким образом, некромант погибнет, если + // здоровья в момент изготовления меньше 90%"). The original 2026-08-30 code read + // the CURRENT health, so a queue of jars got geometrically cheaper (100% -> 10% -> + // 1% of the starting HP) and could only kill at 1-4 HP through rounding. + // + // HOW DEATH HAPPENS, from the 3.4 decompile (don't "fix" this into a direct Kill + // call): Stat.Value's setter clamps to [0, ModifiedMax] (Utils.FastClamp), so HP + // bottoms out at exactly 0, never negative - and EntityAlive.OnUpdateLiving's own + // check `Health <= 0 && !IsDead() && !isEntityRemote && !IsGodMode.Value` kills the + // entity with DamageEntity(DamageSource.disease, 1) on the next update. A player + // who could not pay the full cost thus dies by vanilla's hand one frame later, + // logged as disease (god mode skips that check, leaving them merely at 0 HP). + // Survival takes strictly MORE than the cost: paying exactly it ends at 0 HP, and + // 0 HP is death in vanilla (the check is <= 0, not < 0). AddHealth stays the safe, + // non-combat HP-modification API vanilla itself uses - not DamageEntity/ // DamageResponse, since this isn't damage from a source, it's a direct self-cost. - int amount = Mathf.RoundToInt(__state.Health * NecromancerBloodPatch.HealthCostFraction); + int amount = Mathf.RoundToInt(__state.GetMaxHealth() * NecromancerBloodPatch.HealthCostFraction); if (amount <= 0) { return; @@ -213,9 +227,9 @@ namespace NecromancerTome __state.AddHealth(-amount); // The grunt goes AFTER the HP is actually gone, so a craft that somehow bailed out - // above never makes a sound the player cannot account for. At the 90% cost this is the - // big pain clip in every normal case (amount > 15 unless the player is already down to - // about 17 HP), and drops to the small one exactly where vanilla would drop it too. + // above never makes a sound the player cannot account for. With the cost now a fixed + // 0.9 * MaxHealth this is the big pain clip in every normal case (amount > 15 whenever + // MaxHealth >= 18), and drops to the small one exactly where vanilla would drop it too. NecromancerBloodPatch.PlayPainSound(__state, amount); Debug.Log("[NecromancerTome] NecromancerBloodPatch: crafted blood, deducted " + amount + " HP from owner=" + __state.entityId); diff --git a/NecromancerHarmony.dll b/NecromancerHarmony.dll index 261c52a79682aab7d05d24cc41de785c1a5408a9..7614448fab135892497b217fa3f5fb4c4cb0f733 100644 GIT binary patch delta 4852 zcmZWt3tUuX7Qf&5?%X@W05Sv4$U{K{y$%C1fcUCK&9XJq$}A*xd75c<5nt6^h;q$m zS?Y3Btjsjcx0QR%SEk|%MN{!vYPyzIo8@YytFY&r0VVtS
V&*OWY@0>H1&q*ww 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 m4wJgjUz*gB{t5~2NK&C$>_T@?t{oO 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 delta 12637 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