暂存
This commit is contained in:
@@ -6,9 +6,6 @@
|
||||
},
|
||||
{
|
||||
"path": "../../../../Data"
|
||||
},
|
||||
{
|
||||
"path": "../../../../dll1.6"
|
||||
}
|
||||
],
|
||||
"settings": {}
|
||||
|
||||
@@ -0,0 +1,77 @@
|
||||
using Verse;
|
||||
using RimWorld;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace WulaFallenEmpire
|
||||
{
|
||||
public class CompUseEffect_AddDamageShieldCharges : CompUseEffect
|
||||
{
|
||||
public CompProperties_AddDamageShieldCharges Props => (CompProperties_AddDamageShieldCharges)props;
|
||||
|
||||
public override void DoEffect(Pawn user)
|
||||
{
|
||||
base.DoEffect(user);
|
||||
|
||||
// 获取或添加 Hediff_DamageShield
|
||||
Hediff_DamageShield damageShield = user.health.hediffSet.GetFirstHediff<Hediff_DamageShield>();
|
||||
|
||||
if (damageShield == null)
|
||||
{
|
||||
// 如果没有 Hediff,则添加一个
|
||||
damageShield = (Hediff_DamageShield)HediffMaker.MakeHediff(Props.hediffDef, user);
|
||||
user.health.AddHediff(damageShield);
|
||||
damageShield.ShieldCharges = Props.chargesToAdd; // 设置初始层数
|
||||
}
|
||||
else
|
||||
{
|
||||
// 如果已有 Hediff,则增加层数
|
||||
damageShield.ShieldCharges += Props.chargesToAdd;
|
||||
}
|
||||
|
||||
// 确保层数不超过最大值
|
||||
if (damageShield.ShieldCharges > (int)damageShield.def.maxSeverity)
|
||||
{
|
||||
damageShield.ShieldCharges = (int)damageShield.def.maxSeverity;
|
||||
}
|
||||
|
||||
// 发送消息
|
||||
Messages.Message("WULA_MessageGainedDamageShieldCharges".Translate(user.LabelShort, Props.chargesToAdd), user, MessageTypeDefOf.PositiveEvent);
|
||||
}
|
||||
|
||||
// 修正 CanBeUsedBy 方法签名
|
||||
public override AcceptanceReport CanBeUsedBy(Pawn p)
|
||||
{
|
||||
// 确保只能对活着的 Pawn 使用
|
||||
if (p.Dead)
|
||||
{
|
||||
return "WULA_CannotUseOnDeadPawn".Translate();
|
||||
}
|
||||
|
||||
// 检查是否已达到最大层数
|
||||
Hediff_DamageShield damageShield = p.health.hediffSet.GetFirstHediff<Hediff_DamageShield>();
|
||||
if (damageShield != null && damageShield.ShieldCharges >= (int)damageShield.def.maxSeverity)
|
||||
{
|
||||
return "WULA_DamageShieldMaxChargesReached".Translate();
|
||||
}
|
||||
|
||||
return true; // 可以使用
|
||||
}
|
||||
|
||||
// 可以在这里添加 GetDescriptionPart() 来显示描述
|
||||
public override string GetDescriptionPart()
|
||||
{
|
||||
return "WULA_DamageShieldChargesDescription".Translate(Props.chargesToAdd);
|
||||
}
|
||||
}
|
||||
|
||||
public class CompProperties_AddDamageShieldCharges : CompProperties_UseEffect
|
||||
{
|
||||
public HediffDef hediffDef;
|
||||
public int chargesToAdd;
|
||||
|
||||
public CompProperties_AddDamageShieldCharges()
|
||||
{
|
||||
compClass = typeof(CompUseEffect_AddDamageShieldCharges);
|
||||
}
|
||||
}
|
||||
}
|
||||
40
Source/WulaFallenEmpire/HarmonyPatches/DamageShieldPatch.cs
Normal file
40
Source/WulaFallenEmpire/HarmonyPatches/DamageShieldPatch.cs
Normal file
@@ -0,0 +1,40 @@
|
||||
using HarmonyLib;
|
||||
using Verse;
|
||||
using System.Reflection;
|
||||
using UnityEngine; // Add UnityEngine for MoteMaker and Color
|
||||
|
||||
namespace WulaFallenEmpire.HarmonyPatches
|
||||
{
|
||||
[HarmonyPatch(typeof(Pawn_HealthTracker), "PreApplyDamage")]
|
||||
public static class DamageShieldPatch
|
||||
{
|
||||
// 使用 Harmony 的 AccessTools.Field 来获取私有的 pawn 字段
|
||||
private static readonly FieldInfo PawnField = AccessTools.Field(typeof(Pawn_HealthTracker), "pawn");
|
||||
|
||||
public static bool Prefix(Pawn_HealthTracker __instance, ref DamageInfo dinfo, out bool absorbed)
|
||||
{
|
||||
// 获取 Pawn 实例
|
||||
Pawn pawn = (Pawn)PawnField.GetValue(__instance);
|
||||
|
||||
// 查找 Pawn 身上是否有 Hediff_DamageShield
|
||||
Hediff_DamageShield damageShield = pawn.health.hediffSet.GetFirstHediff<Hediff_DamageShield>();
|
||||
|
||||
if (damageShield != null && damageShield.ShieldCharges > 0)
|
||||
{
|
||||
// 如果有护盾层数,则消耗一层并抵挡伤害
|
||||
damageShield.ShieldCharges--;
|
||||
// MoteMaker.ThrowText(pawn.DrawPos, pawn.Map, "伤害被护盾抵挡!", Color.cyan, 1.2f); // 视觉反馈,明确指定 Verse.MoteMaker,此行将被删除
|
||||
|
||||
// 设置 absorbed 为 true,表示伤害被完全吸收
|
||||
absorbed = true;
|
||||
|
||||
// 返回 false,阻止原始方法执行,即伤害不会被应用
|
||||
return false;
|
||||
}
|
||||
|
||||
// 如果没有护盾 Hediff 或者层数用尽,则正常处理伤害
|
||||
absorbed = false;
|
||||
return true; // 继续执行原始方法
|
||||
}
|
||||
}
|
||||
}
|
||||
73
Source/WulaFallenEmpire/Hediff_DamageShield.cs
Normal file
73
Source/WulaFallenEmpire/Hediff_DamageShield.cs
Normal file
@@ -0,0 +1,73 @@
|
||||
using Verse;
|
||||
using System.Text;
|
||||
using RimWorld;
|
||||
using UnityEngine;
|
||||
|
||||
namespace WulaFallenEmpire
|
||||
{
|
||||
public class Hediff_DamageShield : HediffWithComps
|
||||
{
|
||||
// 伤害抵挡层数
|
||||
// 直接将 severityInt 作为 ShieldCharges,这样外部对 severity 的修改会直接影响 ShieldCharges
|
||||
public int ShieldCharges
|
||||
{
|
||||
get => (int)severityInt;
|
||||
set => severityInt = value;
|
||||
}
|
||||
|
||||
public override string LabelInBrackets
|
||||
{
|
||||
get
|
||||
{
|
||||
if (ShieldCharges > 0)
|
||||
{
|
||||
return "层数: " + ShieldCharges;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public override string TipStringExtra
|
||||
{
|
||||
get
|
||||
{
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.Append(base.TipStringExtra);
|
||||
if (ShieldCharges > 0)
|
||||
{
|
||||
sb.AppendLine(" - 每层抵挡一次伤害。当前层数: " + ShieldCharges);
|
||||
}
|
||||
else
|
||||
{
|
||||
sb.AppendLine(" - 没有可用的抵挡层数。");
|
||||
}
|
||||
return sb.ToString();
|
||||
}
|
||||
}
|
||||
|
||||
public override void ExposeData()
|
||||
{
|
||||
base.ExposeData();
|
||||
// severityInt 会自动保存,所以不需要额外处理 ShieldCharges
|
||||
}
|
||||
|
||||
public override void PostAdd(DamageInfo? dinfo)
|
||||
{
|
||||
base.PostAdd(dinfo);
|
||||
// 初始层数由 XML 中的 initialSeverity 控制
|
||||
// 如果需要一个固定的初始值,可以在这里设置
|
||||
// 例如:如果 hediffDef.initialSeverity 设为 0,这里可以强制给一个默认值
|
||||
// 如果 initialSeverity 在 XML 中已经设置为 10,这里就不需要额外处理
|
||||
}
|
||||
|
||||
public override void Tick()
|
||||
{
|
||||
base.Tick();
|
||||
// 如果层数归零,移除 Hediff
|
||||
if (ShieldCharges <= 0)
|
||||
{
|
||||
pawn.health.RemoveHediff(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -182,6 +182,9 @@
|
||||
<Compile Include="Verb\VerbProperties_WeaponStealBeam.cs" />
|
||||
<Compile Include="Verb\Verb_ShootWeaponStealBeam.cs" />
|
||||
<Compile Include="Verb\Verb_ShootMeltBeam.cs" />
|
||||
<Compile Include="Hediff_DamageShield.cs" />
|
||||
<Compile Include="HarmonyPatches\DamageShieldPatch.cs" />
|
||||
<Compile Include="CompUseEffect_AddDamageShieldCharges.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup />
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
|
||||
Reference in New Issue
Block a user