diff --git a/1.6/1.6/Assemblies/ArachnaeSwarm.dll b/1.6/1.6/Assemblies/ArachnaeSwarm.dll index 8f71447..bdd9034 100644 Binary files a/1.6/1.6/Assemblies/ArachnaeSwarm.dll and b/1.6/1.6/Assemblies/ArachnaeSwarm.dll differ diff --git a/1.6/1.6/Defs/DamageDefs/ARA_Damage_Freeze.xml b/1.6/1.6/Defs/DamageDefs/ARA_Damage_Freeze.xml index 9befb28..66b28fe 100644 --- a/1.6/1.6/Defs/DamageDefs/ARA_Damage_Freeze.xml +++ b/1.6/1.6/Defs/DamageDefs/ARA_Damage_Freeze.xml @@ -1,112 +1,6 @@ - - - ARA_Hediff_Frozen - - 这个身体部位正在被冷冻。移动会因此减慢。如果该部位被完全冷冻,它将在下一次受到冲击时碎裂。 - ArachnaeSwarm.Hediff_Frozen - true - -
  • - -6 -
  • -
  • - 0.3 -
  • -
  • - - - 0 - true - 已碎裂 - - -
  • - - true -
  • -
  • - - 0.2 - - 40 - - - -
  • -
  • - - 0.35 - - 80 - - -
  • - Moving - -0.1 -
  • -
  • - Manipulation - -0.2 -
  • - - -
  • - - 0.5 - - 120 - - -
  • - Moving - -0.3 -
  • -
  • - Manipulation - -0.4 -
  • - - -
  • - - 0.65 - - 160 - - -
  • - Moving - -0.5 -
  • -
  • - Manipulation - -0.6 -
  • - - -
  • - - 0.85 - - 200 - - -
  • - Moving - 0.2 -
  • -
  • - Manipulation - 0.2 -
  • - - - -
    - ARA_Hediff_FrostCoverd_after @@ -230,14 +124,13 @@ - + ARA_Damage_Freeze - DamageWorker_AddInjury + DamageWorker_Frostbite true {0}的身体在极寒中化为了冰雕,随后碎裂四散。 - ARA_Hediff_Frozen - ARA_Hediff_Frozen + Frostbite false Heat 0 @@ -245,29 +138,21 @@ 0 0 0 + -15 + BlastFlame + (0.52, 0.7, 0.95,0.5) + (0.52, 1, 0.95,0.5) + Explosion_Flame - + ARA_Damage_Freeze_ex - - DamageWorker_AddInjury - true - {0}的身体在极寒中化为了冰雕,随后碎裂四散。 - ARA_Hediff_Frozen - ARA_Hediff_Frozen - false - Heat - 0 - 3 - 0 - 0 - 0
  • - ARA_CryoShock - 0.01 -
  • + ARA_CryoShock + 0.01 +
  • ARA_Hediff_FrostCoverd_after 0.01 diff --git a/1.6/1.6/Defs/Thing_Misc/Weapons/ARA_Weapon_Icez.xml b/1.6/1.6/Defs/Thing_Misc/Weapons/ARA_Weapon_Icez.xml index 536373e..07aef66 100644 --- a/1.6/1.6/Defs/Thing_Misc/Weapons/ARA_Weapon_Icez.xml +++ b/1.6/1.6/Defs/Thing_Misc/Weapons/ARA_Weapon_Icez.xml @@ -108,7 +108,6 @@ 1 1 Explosion_Stun - false
  • diff --git a/Source/ArachnaeSwarm/ARA_HediffDefOf.cs b/Source/ArachnaeSwarm/ARA_HediffDefOf.cs index 4cc24b8..b3ffd3a 100644 --- a/Source/ArachnaeSwarm/ARA_HediffDefOf.cs +++ b/Source/ArachnaeSwarm/ARA_HediffDefOf.cs @@ -6,9 +6,6 @@ namespace ArachnaeSwarm [DefOf] public static class ARA_HediffDefOf { - public static HediffDef ARA_Hediff_Frozen; - public static HediffDef ARA_Hediff_FrostCoverd_after; - public static HediffDef ARA_CryoShock; public static HediffDef ARA_HiveMindMaster; public static HediffDef ARA_HiveMindDrone; public static HediffDef ARA_HiveMindWorker; // 如果存在这个Def diff --git a/Source/ArachnaeSwarm/ArachnaeSwarm.csproj b/Source/ArachnaeSwarm/ArachnaeSwarm.csproj index c1f9dcb..37e636e 100644 --- a/Source/ArachnaeSwarm/ArachnaeSwarm.csproj +++ b/Source/ArachnaeSwarm/ArachnaeSwarm.csproj @@ -193,8 +193,6 @@ - - @@ -275,7 +273,6 @@ - diff --git a/Source/ArachnaeSwarm/HarmonyPatch_Pawn_HealthTracker_PreApplyDamage.cs b/Source/ArachnaeSwarm/HarmonyPatch_Pawn_HealthTracker_PreApplyDamage.cs deleted file mode 100644 index 644bc80..0000000 --- a/Source/ArachnaeSwarm/HarmonyPatch_Pawn_HealthTracker_PreApplyDamage.cs +++ /dev/null @@ -1,73 +0,0 @@ -using HarmonyLib; -using RimWorld; -using Verse; -using System.Linq; -using UnityEngine; // For FleckMaker - -namespace ArachnaeSwarm -{ - // Harmony 入口点,将在 Mod 加载时自动初始化 - [StaticConstructorOnStartup] - public static class HarmonyPatches - { - static HarmonyPatches() - { - var harmony = new Harmony("ArachnaeSwarm.FreezeMod"); - harmony.PatchAll(); - } - } - - // 补丁目标:Pawn_HealthTracker 类的 PreApplyDamage 方法 - [HarmonyPatch(typeof(Pawn_HealthTracker), "PreApplyDamage")] - public static class HarmonyPatch_Pawn_HealthTracker_PreApplyDamage - { - // Postfix 补丁:在原方法执行后运行 - // __instance 是 Pawn_HealthTracker 的实例 - // dinfo 是 DamageInfo 的引用 - // absorbed 是 out bool 参数的引用 - public static void Postfix(Pawn_HealthTracker __instance, ref DamageInfo dinfo, ref bool absorbed) - { - // 如果伤害已经被吸收,或者没有击中任何部位,则不处理 - if (absorbed || dinfo.HitPart == null) - { - return; - } - - Pawn pawn = (Pawn)AccessTools.Field(typeof(Pawn_HealthTracker), "pawn").GetValue(__instance); - if (pawn == null) - { - return; - } - - // 复制一份 dinfo,避免 ref 参数在 lambda 中使用的问题 - DamageInfo currentDinfo = dinfo; - - // 获取被击中部位上的 Hediff_Frozen - Hediff_Frozen frozenHediff = pawn.health.hediffSet.hediffs.OfType() - .FirstOrDefault(h => h.Part == currentDinfo.HitPart); - - // 如果该部位存在 Hediff_Frozen 并且已经完全冷冻 - if (frozenHediff != null && frozenHediff.Severity >= currentDinfo.HitPart.def.GetMaxHealth(pawn)) - { - // 检查伤害是否是我们的冷冻伤害(防止循环触发) - if (currentDinfo.Def.hediff == ARA_HediffDefOf.ARA_Hediff_Frozen) - { - return; // 忽略我们自己的冷冻伤害 - } - - // 检查伤害是否是会造成生命值损伤的普通伤害 - if (currentDinfo.Def.harmsHealth && currentDinfo.Amount > 0.01f) - { - // 施加一个巨大的、足以摧毁该部位的伤害 - DamageInfo fatalDamage = new DamageInfo(DamageDefOf.Crush, 99999f, 999f, -1f, currentDinfo.Instigator, currentDinfo.HitPart); - pawn.TakeDamage(fatalDamage); - - // 播放一个破碎的特效 - FleckMaker.Static(pawn.Position, pawn.Map, FleckDefOf.ExplosionFlash, 2f); - - absorbed = true; // 标记原伤害已被处理,阻止其继续执行 - } - } - } - } -} \ No newline at end of file diff --git a/Source/ArachnaeSwarm/HediffComp_GlobalFreeze.cs b/Source/ArachnaeSwarm/HediffComp_GlobalFreeze.cs deleted file mode 100644 index 6d8bd07..0000000 --- a/Source/ArachnaeSwarm/HediffComp_GlobalFreeze.cs +++ /dev/null @@ -1,72 +0,0 @@ -using RimWorld; -using Verse; -using System.Linq; - -namespace ArachnaeSwarm -{ - public class HediffComp_GlobalFreeze : HediffComp - { - private const int CheckInterval = 60; // 每60 ticks检查一次 (1秒) - private bool isStunnedByFreeze = false; // 用于追踪是否是由我们这个组件造成的眩晕 - - public HediffCompProperties_GlobalFreeze Props => (HediffCompProperties_GlobalFreeze)props; - - public override void CompPostTick(ref float severityAdjustment) - { - base.CompPostTick(ref severityAdjustment); - - // 每隔一段时间才执行一次,避免性能问题 - if (Pawn.IsHashIntervalTick(CheckInterval)) - { - // 计算全身所有Hediff_Frozen的总严重性 - float totalFreezeSeverity = Pawn.health.hediffSet.hediffs - .OfType() - .Sum(h => h.Severity); - - // 获取Pawn的总生命值作为参考 - float totalBodyHealth = Pawn.health.summaryHealth.SummaryHealthPercent * Pawn.MaxHitPoints; - - // 计算冷冻阈值 - float stunThreshold = totalBodyHealth * Props.stunThreshold; - - // 如果总冷冻值超过阈值 - if (totalFreezeSeverity >= stunThreshold) - { - // 如果Pawn当前没有被眩晕,则施加一个“永久”的眩晕 - // StunFor会取最大值,所以我们给一个足够长的时间(5秒),它会在下一轮检查时被刷新 - if (!Pawn.stances.stunner.Stunned) - { - Pawn.stances.stunner.StunFor(300, Pawn, false, true); - isStunnedByFreeze = true; - } - } - // 如果总冷冻值低于阈值,并且之前是由我们造成的眩晕 - else if (isStunnedByFreeze) - { - // 立即停止眩晕 - // 我们通过将stunTicksLeft设置为0来直接唤醒它 - Pawn.stances.stunner.StunFor(0, Pawn, false, false); - isStunnedByFreeze = false; - } - } - } - - // 保存和加载我们的状态,确保读档后逻辑正确 - public override void CompExposeData() - { - base.CompExposeData(); - Scribe_Values.Look(ref isStunnedByFreeze, "isStunnedByFreeze", false); - } - } - - public class HediffCompProperties_GlobalFreeze : HediffCompProperties - { - // XML中可配置的阈值,默认为全身健康的30% - public float stunThreshold = 0.3f; - - public HediffCompProperties_GlobalFreeze() - { - compClass = typeof(HediffComp_GlobalFreeze); - } - } -} \ No newline at end of file diff --git a/Source/ArachnaeSwarm/Hediff_Frozen.cs b/Source/ArachnaeSwarm/Hediff_Frozen.cs deleted file mode 100644 index b9adecc..0000000 --- a/Source/ArachnaeSwarm/Hediff_Frozen.cs +++ /dev/null @@ -1,46 +0,0 @@ -using RimWorld; -using Verse; -using UnityEngine; - -namespace ArachnaeSwarm -{ - public class Hediff_Frozen : Hediff_Injury - { - // 我们需要覆盖这个方法来改变在健康面板上显示的标签 - public override string LabelInBrackets - { - get - { - // 如果严重性达到了部位的满生命值,就显示“完全冷冻” - if (Severity >= Part.def.GetMaxHealth(pawn)) - { - return "Fully Frozen"; - } - return base.LabelInBrackets; - } - } - - // 当部位的疼痛感,可以根据严重性调整 - public override float PainOffset - { - get - { - // 冷冻不造成额外疼痛 - return 0f; - } - } - - // 当一个部位的伤害被治疗(在这里就是冷冻值减少)时调用 - public override void Heal(float amount) - { - // 减少严重性,但不让它低于0 - Severity -= amount; - if (Severity < 0) - { - Severity = 0; - } - } - - // 伤害拦截逻辑将通过 Harmony 补丁实现,不在 Hediff 内部处理 - } -} \ No newline at end of file