暂存
This commit is contained in:
Binary file not shown.
@@ -23,13 +23,9 @@
|
||||
<capacity>Consciousness</capacity>
|
||||
<setMax>1.0</setMax>
|
||||
</li>
|
||||
<li>
|
||||
<capacity>Moving</capacity>
|
||||
<setMax>1.0</setMax>
|
||||
</li>
|
||||
</capMods>
|
||||
</li>
|
||||
</stages>
|
||||
</HediffDef>
|
||||
|
||||
</Defs>
|
||||
</Defs>
|
||||
|
||||
12
1.6/Defs/JobDefs/WULA_Jobs_Emergency.xml
Normal file
12
1.6/Defs/JobDefs/WULA_Jobs_Emergency.xml
Normal file
@@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<Defs>
|
||||
|
||||
<JobDef>
|
||||
<defName>WULA_CastEmergencyEnergyRestore</defName>
|
||||
<driverClass>WulaFallenEmpire.JobDriver_CastEmergencyEnergyRestore</driverClass>
|
||||
<reportString>activating emergency energy restore.</reportString>
|
||||
<suspendable>false</suspendable>
|
||||
<neverShowWeapon>true</neverShowWeapon>
|
||||
</JobDef>
|
||||
|
||||
</Defs>
|
||||
@@ -6,7 +6,7 @@
|
||||
<subNodes>
|
||||
<!-- Add our custom JobGiver for Wula energy here -->
|
||||
<li Class="WulaFallenEmpire.JobGiver_WulaGetEnergy">
|
||||
<minEnergyLevelPercentage>0.3</minEnergyLevelPercentage> <!-- 能量低于30%时开始寻找 -->
|
||||
<minEnergyLevelPercentage>0.5</minEnergyLevelPercentage> <!-- 能量低于50%时开始寻找 -->
|
||||
<emergencyThreshold>0.1</emergencyThreshold> <!-- 能量低于10%时非常紧急 -->
|
||||
<normalPriority>5.0</normalPriority>
|
||||
<emergencyPriority>9.5</emergencyPriority>
|
||||
|
||||
Binary file not shown.
@@ -14,7 +14,6 @@ namespace WulaFallenEmpire
|
||||
private int lastKeepDisplayTick = -9999;
|
||||
private Vector3 impactAngleVect;
|
||||
private int lastAbsorbDamageTick = -9999;
|
||||
private bool shieldEnabled = false;
|
||||
private Sustainer sustainer;
|
||||
// 静态构造函数加载材质
|
||||
private static readonly Material BubbleMat = MaterialPool.MatFrom("Other/ShieldBubble", ShaderDatabase.Transparent, Color.white);
|
||||
@@ -23,7 +22,6 @@ namespace WulaFallenEmpire
|
||||
|
||||
public float ShieldHitPoints => shieldHitPoints;
|
||||
public float ShieldMaxHitPoints => Props.maxShieldHitPoints;
|
||||
public bool ShieldEnabled => shieldEnabled;
|
||||
|
||||
private bool ShouldDisplay
|
||||
{
|
||||
@@ -39,7 +37,6 @@ namespace WulaFallenEmpire
|
||||
base.PostExposeData();
|
||||
Scribe_Values.Look(ref shieldHitPoints, "shieldHitPoints", 0f);
|
||||
Scribe_Values.Look(ref ticksToReset, "ticksToReset", -1);
|
||||
Scribe_Values.Look(ref shieldEnabled, "shieldEnabled", Props.startEnabled);
|
||||
}
|
||||
|
||||
public override void PostSpawnSetup(bool respawningAfterLoad)
|
||||
@@ -48,7 +45,6 @@ namespace WulaFallenEmpire
|
||||
if (!respawningAfterLoad)
|
||||
{
|
||||
shieldHitPoints = Props.maxShieldHitPoints;
|
||||
shieldEnabled = Props.startEnabled;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -59,19 +55,11 @@ namespace WulaFallenEmpire
|
||||
Pawn wearer = GetWearer();
|
||||
if (wearer == null) return;
|
||||
|
||||
if (shieldEnabled)
|
||||
if (sustainer == null && Props.activeSound != null)
|
||||
{
|
||||
if (sustainer == null && Props.activeSound != null)
|
||||
{
|
||||
sustainer = Props.activeSound.TrySpawnSustainer(SoundInfo.InMap(wearer, MaintenanceType.PerTick));
|
||||
}
|
||||
sustainer?.Maintain();
|
||||
}
|
||||
else
|
||||
{
|
||||
sustainer?.End();
|
||||
sustainer = null;
|
||||
sustainer = Props.activeSound.TrySpawnSustainer(SoundInfo.InMap(wearer, MaintenanceType.PerTick));
|
||||
}
|
||||
sustainer?.Maintain();
|
||||
|
||||
if (ticksToReset > 0)
|
||||
{
|
||||
@@ -81,7 +69,7 @@ namespace WulaFallenEmpire
|
||||
Reset();
|
||||
}
|
||||
}
|
||||
else if (shieldEnabled && Props.useHitPointsMode && shieldHitPoints < Props.maxShieldHitPoints)
|
||||
else if (Props.useHitPointsMode && shieldHitPoints < Props.maxShieldHitPoints)
|
||||
{
|
||||
shieldHitPoints += Props.rechargeRate / 60f; // 每秒恢复
|
||||
if (shieldHitPoints > Props.maxShieldHitPoints)
|
||||
@@ -94,7 +82,7 @@ namespace WulaFallenEmpire
|
||||
public override void PostDraw()
|
||||
{
|
||||
base.PostDraw();
|
||||
if (shieldEnabled && ShouldDisplay)
|
||||
if (ShouldDisplay)
|
||||
{
|
||||
float num = Mathf.Lerp(1.2f, 1.55f, shieldHitPoints / Props.maxShieldHitPoints);
|
||||
Vector3 drawPos = GetWearer().Drawer.DrawPos;
|
||||
@@ -143,9 +131,6 @@ namespace WulaFallenEmpire
|
||||
|
||||
public bool CheckIntercept(Projectile projectile, Vector3 lastExactPos, Vector3 newExactPos)
|
||||
{
|
||||
if (!shieldEnabled)
|
||||
return false;
|
||||
|
||||
// 如果使用生命值模式且护盾已破坏,则不拦截
|
||||
if (Props.useHitPointsMode && shieldHitPoints <= 0f)
|
||||
return false;
|
||||
@@ -200,7 +185,7 @@ namespace WulaFallenEmpire
|
||||
|
||||
public bool CheckMeleeIntercept(DamageInfo dinfo, Pawn attacker)
|
||||
{
|
||||
if (!shieldEnabled || !Props.interceptMeleeAttacks || shieldHitPoints <= 0f)
|
||||
if (!Props.interceptMeleeAttacks || shieldHitPoints <= 0f)
|
||||
return false;
|
||||
|
||||
Pawn wearer = GetWearer();
|
||||
@@ -291,23 +276,6 @@ namespace WulaFallenEmpire
|
||||
shieldHitPoints = Props.maxShieldHitPoints;
|
||||
}
|
||||
|
||||
public void ToggleShield()
|
||||
{
|
||||
shieldEnabled = !shieldEnabled;
|
||||
|
||||
Pawn wearer = GetWearer();
|
||||
if (wearer != null)
|
||||
{
|
||||
string message = shieldEnabled ? $"{wearer.LabelShort}激活了护盾" : $"{wearer.LabelShort}关闭了护盾";
|
||||
Messages.Message(message, MessageTypeDefOf.NeutralEvent, false);
|
||||
}
|
||||
|
||||
if (!shieldEnabled)
|
||||
{
|
||||
sustainer?.End();
|
||||
sustainer = null;
|
||||
}
|
||||
}
|
||||
|
||||
private Pawn GetWearer()
|
||||
{
|
||||
@@ -323,43 +291,18 @@ namespace WulaFallenEmpire
|
||||
{
|
||||
base.Initialize(props);
|
||||
shieldHitPoints = ((CompProperties_WulaShieldBelt)props).maxShieldHitPoints;
|
||||
shieldEnabled = ((CompProperties_WulaShieldBelt)props).startEnabled;
|
||||
}
|
||||
|
||||
public override IEnumerable<Gizmo> CompGetWornGizmosExtra()
|
||||
{
|
||||
// 确保穿戴者存在
|
||||
Pawn wearer = GetWearer();
|
||||
if (wearer == null) yield break;
|
||||
|
||||
// 不限制只有选中时才显示
|
||||
yield return new Command_Toggle
|
||||
{
|
||||
defaultLabel = "护盾开关",
|
||||
defaultDesc = shieldEnabled ? "关闭护盾" : "激活护盾",
|
||||
icon = ContentFinder<Texture2D>.Get("UI/Commands/DesirePower"),
|
||||
isActive = () => shieldEnabled,
|
||||
toggleAction = ToggleShield
|
||||
};
|
||||
}
|
||||
|
||||
public override string CompInspectStringExtra()
|
||||
{
|
||||
if (shieldEnabled)
|
||||
if (Props.useHitPointsMode)
|
||||
{
|
||||
if (Props.useHitPointsMode)
|
||||
{
|
||||
return $"护盾: {shieldHitPoints:F0} / {Props.maxShieldHitPoints} (生命值模式)";
|
||||
}
|
||||
else
|
||||
{
|
||||
return "护盾: 激活 (偏转模式)";
|
||||
}
|
||||
return $"护盾: {shieldHitPoints:F0} / {Props.maxShieldHitPoints} (生命值模式)";
|
||||
}
|
||||
else
|
||||
{
|
||||
return "护盾: 已关闭";
|
||||
return "护盾: 激活 (偏转模式)";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,15 +18,16 @@ namespace WulaFallenEmpire
|
||||
{
|
||||
if (__instance.def.defName == "WULA_EmergencyEnergyRestore")
|
||||
{
|
||||
Log.Message($"[EmergencyAbilityPatches] CanCast_Postfix for {__instance.pawn?.LabelShort}, initial result: {__result.Accepted}, reason: {__result.Reason}");
|
||||
if (!__result.Accepted)
|
||||
var comp = __instance.CompOfType<CompAbilityEffect_EmergencyEnergyRestore>();
|
||||
if (comp != null && comp.Props.requireDowned)
|
||||
{
|
||||
// 检查是否是因为pawn失去知觉而无法使用能力
|
||||
if (__instance.pawn.Downed)
|
||||
if (!__instance.pawn.Downed)
|
||||
{
|
||||
__result = new AcceptanceReport("只能在倒地时使用");
|
||||
}
|
||||
else
|
||||
{
|
||||
// 对于紧急能量恢复能力,我们允许在倒地时使用
|
||||
__result = true;
|
||||
Log.Message($"[EmergencyAbilityPatches] CanCast_Postfix: Pawn is downed, overriding to true. New result: {__result.Accepted}");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -58,7 +59,6 @@ namespace WulaFallenEmpire
|
||||
{
|
||||
if (__instance.def.defName == "WULA_EmergencyEnergyRestore")
|
||||
{
|
||||
Log.Message($"[EmergencyAbilityPatches] GizmoDisabled_Postfix for {__instance.pawn?.LabelShort}, initial result: {__result}, reason: {reason}");
|
||||
if (__result)
|
||||
{
|
||||
// 检查是否是因为倒地而被禁用
|
||||
@@ -68,7 +68,6 @@ namespace WulaFallenEmpire
|
||||
// 对于紧急能量恢复能力,我们允许在倒地时使用
|
||||
__result = false;
|
||||
reason = null;
|
||||
Log.Message($"[EmergencyAbilityPatches] GizmoDisabled_Postfix: Pawn is downed, overriding to false. New result: {__result}");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -82,12 +81,10 @@ namespace WulaFallenEmpire
|
||||
var ability = (Ability)typeof(Command_Ability).GetField("ability", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(__instance);
|
||||
if (ability.def.defName == "WULA_EmergencyEnergyRestore")
|
||||
{
|
||||
Log.Message($"[EmergencyAbilityPatches] Command_Ability_GizmoDisabled_Postfix for {ability.pawn?.LabelShort}, initial result: {__result}");
|
||||
if (__result && ability.pawn.Downed)
|
||||
{
|
||||
// 对于紧急能量恢复能力,我们允许在倒地时使用
|
||||
__result = false;
|
||||
Log.Message($"[EmergencyAbilityPatches] Command_Ability_GizmoDisabled_Postfix: Pawn is downed, overriding to false. New result: {__result}");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -97,10 +94,8 @@ namespace WulaFallenEmpire
|
||||
[HarmonyPostfix]
|
||||
public static void ApparelPreventsShooting_Postfix(Verb __instance, ref bool __result)
|
||||
{
|
||||
Log.Message($"[EmergencyAbilityPatches] ApparelPreventsShooting_Postfix called. Verb type: {__instance.GetType().Name}, Caster: {__instance.CasterPawn?.LabelShort}, initial result: {__result}");
|
||||
if (__instance is Verb_CastAbility castAbilityVerb && castAbilityVerb.ability?.def.defName == "WULA_EmergencyEnergyRestore")
|
||||
{
|
||||
Log.Message($"[EmergencyAbilityPatches] ApparelPreventsShooting_Postfix for EmergencyEnergyRestore. Pawn: {__instance.CasterPawn?.LabelShort}, result: {__result}");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -109,10 +104,8 @@ namespace WulaFallenEmpire
|
||||
[HarmonyPrefix]
|
||||
public static void TryStartCastOn_DiagnosticPrefix(Verb __instance, LocalTargetInfo castTarg, LocalTargetInfo destTarg, ref bool __result)
|
||||
{
|
||||
Log.Message($"[EmergencyAbilityPatches] TryStartCastOn_DiagnosticPrefix called for Verb type: {__instance.GetType().Name}. Caster: {__instance.CasterPawn?.LabelShort}. CastTarg: {castTarg}, DestTarg: {destTarg}");
|
||||
if (__instance is Verb_CastAbility castAbilityVerb && castAbilityVerb.ability?.def.defName == "WULA_EmergencyEnergyRestore")
|
||||
{
|
||||
Log.Message($"[EmergencyAbilityPatches] TryStartCastOn_DiagnosticPrefix: This is EmergencyEnergyRestore ability. Caster: {__instance.CasterPawn?.LabelShort}");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -123,7 +116,6 @@ namespace WulaFallenEmpire
|
||||
{
|
||||
if (__instance.ability?.def.defName == "WULA_EmergencyEnergyRestore")
|
||||
{
|
||||
Log.Message($"[EmergencyAbilityPatches] TryCastShot_DiagnosticPrefix called for EmergencyEnergyRestore. Pawn: {__instance.CasterPawn?.LabelShort}");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,17 +12,23 @@ namespace WulaFallenEmpire
|
||||
[HarmonyPrefix]
|
||||
public static bool Prefix(Pawn p, ThingDef food, ref bool __result)
|
||||
{
|
||||
// 检查是否是乌拉族
|
||||
if (p.def.defName == "WulaSpecies")
|
||||
// 检查食物是否是能量核心
|
||||
ThingDefExtension_EnergySource ext = food.GetModExtension<ThingDefExtension_EnergySource>();
|
||||
if (ext != null)
|
||||
{
|
||||
// 检查食物是否是能量核心
|
||||
ThingDefExtension_EnergySource ext = food.GetModExtension<ThingDefExtension_EnergySource>();
|
||||
if (ext != null)
|
||||
// 如果是能量核心
|
||||
if (p.def.defName == "WulaSpecies")
|
||||
{
|
||||
// 如果是乌拉族且是能量核心,则认为愿意吃
|
||||
// 如果是乌拉族,则认为愿意吃
|
||||
__result = true;
|
||||
return false; // 跳过原版方法
|
||||
}
|
||||
else
|
||||
{
|
||||
// 如果不是乌拉族,则不允许吃能量核心
|
||||
__result = false;
|
||||
return false; // 跳过原版方法
|
||||
}
|
||||
}
|
||||
return true; // 继续执行原版方法
|
||||
}
|
||||
@@ -35,17 +41,23 @@ namespace WulaFallenEmpire
|
||||
[HarmonyPrefix]
|
||||
public static bool Prefix(Pawn p, Thing food, ref bool __result)
|
||||
{
|
||||
// 检查是否是乌拉族
|
||||
if (p.def.defName == "WulaSpecies")
|
||||
// 检查食物是否是能量核心
|
||||
ThingDefExtension_EnergySource ext = food.def.GetModExtension<ThingDefExtension_EnergySource>();
|
||||
if (ext != null)
|
||||
{
|
||||
// 检查食物是否是能量核心
|
||||
ThingDefExtension_EnergySource ext = food.def.GetModExtension<ThingDefExtension_EnergySource>();
|
||||
if (ext != null)
|
||||
// 如果是能量核心
|
||||
if (p.def.defName == "WulaSpecies")
|
||||
{
|
||||
// 如果是乌拉族且是能量核心,则认为愿意吃
|
||||
// 如果是乌拉族,则认为愿意吃
|
||||
__result = true;
|
||||
return false; // 跳过原版方法
|
||||
}
|
||||
else
|
||||
{
|
||||
// 如果不是乌拉族,则不允许吃能量核心
|
||||
__result = false;
|
||||
return false; // 跳过原版方法
|
||||
}
|
||||
}
|
||||
return true; // 继续执行原版方法
|
||||
}
|
||||
@@ -58,17 +70,23 @@ namespace WulaFallenEmpire
|
||||
[HarmonyPrefix]
|
||||
public static bool Prefix(Pawn p, ThingDef food, ref bool __result)
|
||||
{
|
||||
// 检查是否是乌拉族
|
||||
if (p.def.defName == "WulaSpecies")
|
||||
// 检查食物是否是能量核心
|
||||
ThingDefExtension_EnergySource ext = food.GetModExtension<ThingDefExtension_EnergySource>();
|
||||
if (ext != null)
|
||||
{
|
||||
// 检查食物是否是能量核心
|
||||
ThingDefExtension_EnergySource ext = food.GetModExtension<ThingDefExtension_EnergySource>();
|
||||
if (ext != null)
|
||||
// 如果是能量核心
|
||||
if (p.def.defName == "WulaSpecies")
|
||||
{
|
||||
// 如果是乌拉族且是能量核心,则认为食物是合适的
|
||||
// 如果是乌拉族,则认为食物是合适的
|
||||
__result = true;
|
||||
return false; // 跳过原版方法
|
||||
}
|
||||
else
|
||||
{
|
||||
// 如果不是乌拉族,则认为食物不合适
|
||||
__result = false;
|
||||
return false; // 跳过原版方法
|
||||
}
|
||||
}
|
||||
return true; // 继续执行原版方法
|
||||
}
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
using System.Collections.Generic;
|
||||
using Verse;
|
||||
using Verse.AI;
|
||||
using RimWorld; // Added for AbilityDef
|
||||
|
||||
namespace WulaFallenEmpire
|
||||
{
|
||||
public class JobDriver_CastEmergencyEnergyRestore : JobDriver
|
||||
{
|
||||
public override bool TryMakePreToilReservations(bool errorOnFailed)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
protected override IEnumerable<Toil> MakeNewToils()
|
||||
{
|
||||
this.FailOnDespawnedOrNull(TargetIndex.A);
|
||||
yield return new Toil
|
||||
{
|
||||
initAction = delegate
|
||||
{
|
||||
var ability = pawn.abilities.GetAbility(DefDatabase<AbilityDef>.GetNamed("WULA_EmergencyEnergyRestore"));
|
||||
if (ability != null)
|
||||
{
|
||||
ability.Activate(pawn.Position, pawn);
|
||||
}
|
||||
},
|
||||
defaultCompleteMode = ToilCompleteMode.Instant
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -48,6 +48,10 @@ namespace WulaFallenEmpire
|
||||
|
||||
protected override Job TryGiveJob(Pawn pawn)
|
||||
{
|
||||
if (pawn.Downed)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
Need_WulaEnergy energyNeed = pawn.needs.TryGetNeed<Need_WulaEnergy>();
|
||||
if (energyNeed == null || energyNeed.CurLevelPercentage > minEnergyLevelPercentage)
|
||||
{
|
||||
|
||||
@@ -88,6 +88,7 @@
|
||||
<Compile Include="EmergencyAbilityPatches.cs" />
|
||||
<Compile Include="JobGiver_WulaGetEnergy.cs" />
|
||||
<Compile Include="JobGiverDefExtension_WulaGetEnergy.cs" />
|
||||
<Compile Include="JobDriver_CastEmergencyEnergyRestore.cs" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
|
||||
|
||||
Reference in New Issue
Block a user