Merge branch 'master' of https://git.ra3battle.cn/Kalospacer/ArachnaeSwarm
This commit is contained in:
@@ -1,19 +1,18 @@
|
||||
using RimWorld;
|
||||
using Verse;
|
||||
using Verse.Sound;
|
||||
|
||||
namespace ArachnaeSwarm
|
||||
{
|
||||
[DefOf]
|
||||
public static class ARA_HediffDefOf
|
||||
{
|
||||
public static HediffDef ARA_AcidCoverd;
|
||||
public static HediffDef ARA_HiveMindMaster;
|
||||
public static HediffDef ARA_HiveMindDrone;
|
||||
public static HediffDef ARA_HiveMindWorker;
|
||||
public static HediffDef ARA_HiveMindWorker; // 如果存在这个Def
|
||||
|
||||
static ARA_HediffDefOf()
|
||||
{
|
||||
DefOfHelper.EnsureInitializedInCtor(typeof(HediffDefOf));
|
||||
DefOfHelper.EnsureInitializedInCtor(typeof(ARA_HediffDefOf));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -193,6 +193,7 @@
|
||||
<Compile Include="Hediffs\MoharHediffs\HediffComp_Spawner.cs" />
|
||||
<Compile Include="Hediffs\MoharHediffs\Tools.cs" />
|
||||
<Compile Include="Hediffs\ProphecyGearEffect.cs" />
|
||||
<Compile Include="HediffComp_TimedExplosion.cs" />
|
||||
<Compile Include="Hediffs\WULA_HediffDamgeShield\DRMDamageShield.cs" />
|
||||
<Compile Include="Hediffs\WULA_HediffDamgeShield\Hediff_DamageShield.cs" />
|
||||
<Compile Include="Thing_Comps\ARA_ThingComp_GuardianPsyField\Hediff_DynamicInterceptor.cs" />
|
||||
@@ -278,7 +279,6 @@
|
||||
<Compile Include="PowerArmor\CompPowerArmorStation.cs" />
|
||||
<Compile Include="PowerArmor\Gizmo_StructurePanel.cs" />
|
||||
<Compile Include="PowerArmor\JobDriver_EnterPowerArmor.cs" />
|
||||
<Compile Include="PowerArmor\Harmony_ThingWithComps_GetFloatMenuOptions.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Jobs\JobDriver_SuperCarry\SuperCarryExtension.cs" />
|
||||
|
||||
@@ -7,13 +7,27 @@ namespace ArachnaeSwarm
|
||||
{
|
||||
public class CompProperties_RefuelableNutrition : CompProperties_Refuelable
|
||||
{
|
||||
public bool silent = false;
|
||||
|
||||
public CompProperties_RefuelableNutrition()
|
||||
{
|
||||
compClass = typeof(CompRefuelableNutrition);
|
||||
// 默认启用这些Gizmo,除非在XML中明确设置为false
|
||||
this.targetFuelLevelConfigurable = true;
|
||||
this.showAllowAutoRefuelToggle = true;
|
||||
}
|
||||
|
||||
public override IEnumerable<StatDrawEntry> SpecialDisplayStats(StatRequest req)
|
||||
{
|
||||
if (silent)
|
||||
{
|
||||
yield break; // If silent, return nothing.
|
||||
}
|
||||
|
||||
foreach (var stat in base.SpecialDisplayStats(req))
|
||||
{
|
||||
yield return stat;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[StaticConstructorOnStartup]
|
||||
|
||||
244
Source/ArachnaeSwarm/HediffComp_TimedExplosion.cs
Normal file
244
Source/ArachnaeSwarm/HediffComp_TimedExplosion.cs
Normal file
@@ -0,0 +1,244 @@
|
||||
using RimWorld;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using UnityEngine;
|
||||
using Verse;
|
||||
using Verse.Noise;
|
||||
|
||||
namespace ArachnaeSwarm // 修正命名空间
|
||||
{
|
||||
public class HediffComp_TimedExplosion : HediffComp
|
||||
{
|
||||
// 倒计时相关字段
|
||||
public int ticksToDisappear;
|
||||
public int disappearsAfterTicks;
|
||||
public int seed;
|
||||
|
||||
// 配置属性快捷访问
|
||||
public HediffCompProperties_TimedExplosion Props =>
|
||||
(HediffCompProperties_TimedExplosion)props;
|
||||
|
||||
// 消失判定属性
|
||||
public override bool CompShouldRemove
|
||||
{
|
||||
get
|
||||
{
|
||||
if (ticksToDisappear > 0) return false;
|
||||
if (Props.requiredMentalState != null)
|
||||
{
|
||||
return parent.pawn.MentalStateDef != Props.requiredMentalState;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
// 进度计算
|
||||
public float Progress =>
|
||||
1f - (float)ticksToDisappear / Mathf.Max(1, disappearsAfterTicks);
|
||||
|
||||
public int EffectiveTicksToDisappear => ticksToDisappear / TicksLostPerTick;
|
||||
|
||||
public float NoisyProgress => AddNoiseToProgress(Progress, seed);
|
||||
|
||||
public virtual int TicksLostPerTick => 1;
|
||||
|
||||
public override string CompLabelInBracketsExtra
|
||||
{
|
||||
get
|
||||
{
|
||||
if (Props.showRemainingTime)
|
||||
{
|
||||
if (EffectiveTicksToDisappear < 2500)
|
||||
{
|
||||
return EffectiveTicksToDisappear.ToStringSecondsFromTicks("F0");
|
||||
}
|
||||
return EffectiveTicksToDisappear.ToStringTicksToPeriod(allowSeconds: true, shortForm: true, canUseDecimals: true, allowYears: true, Props.canUseDecimalsShortForm);
|
||||
}
|
||||
return base.CompLabelInBracketsExtra;
|
||||
}
|
||||
}
|
||||
|
||||
private static float AddNoiseToProgress(float progress, int seed)
|
||||
{
|
||||
float num = (float)Perlin.GetValue(progress, 0.0, 0.0, 9.0, seed);
|
||||
float num2 = 0.25f * (1f - progress);
|
||||
return Mathf.Clamp01(progress + num2 * num);
|
||||
}
|
||||
|
||||
// 初始化
|
||||
public override void CompPostMake()
|
||||
{
|
||||
base.CompPostMake();
|
||||
disappearsAfterTicks = Props.disappearsAfterTicks.RandomInRange;
|
||||
seed = Rand.Int;
|
||||
ticksToDisappear = disappearsAfterTicks;
|
||||
}
|
||||
|
||||
// 每帧更新
|
||||
public override void CompPostTick(ref float severityAdjustment)
|
||||
{
|
||||
ticksToDisappear--;
|
||||
if (CompShouldRemove)
|
||||
{
|
||||
parent.pawn.health.RemoveHediff(parent);
|
||||
}
|
||||
}
|
||||
|
||||
// 移除后处理
|
||||
public override void CompPostPostRemoved()
|
||||
{
|
||||
base.CompPostPostRemoved();
|
||||
|
||||
// 处理新鲜伤口状态
|
||||
if (!Props.leaveFreshWounds && parent.Part != null)
|
||||
{
|
||||
foreach (BodyPartRecord part in parent.Part.GetPartAndAllChildParts())
|
||||
{
|
||||
Hediff_MissingPart hediff = parent.pawn.health.hediffSet.GetMissingPartFor(part) as Hediff_MissingPart;
|
||||
if (hediff != null)
|
||||
{
|
||||
hediff.IsFresh = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 触发爆炸逻辑
|
||||
if (ShouldTriggerExplosion())
|
||||
{
|
||||
TriggerExplosion();
|
||||
DestroyGearIfNeeded();
|
||||
}
|
||||
|
||||
// 发送消息通知
|
||||
if (!Props.messageOnDisappear.NullOrEmpty() && PawnUtility.ShouldSendNotificationAbout(parent.pawn))
|
||||
{
|
||||
Messages.Message(
|
||||
Props.messageOnDisappear.Formatted(parent.pawn.Named("PAWN")),
|
||||
parent.pawn,
|
||||
MessageTypeDefOf.NeutralEvent
|
||||
);
|
||||
}
|
||||
|
||||
// 发送信件通知
|
||||
if (!Props.letterTextOnDisappear.NullOrEmpty() &&
|
||||
!Props.letterLabelOnDisappear.NullOrEmpty() &&
|
||||
PawnUtility.ShouldSendNotificationAbout(parent.pawn))
|
||||
{
|
||||
Find.LetterStack.ReceiveLetter(
|
||||
Props.letterLabelOnDisappear.Formatted(parent.pawn.Named("PAWN")),
|
||||
Props.letterTextOnDisappear.Formatted(parent.pawn.Named("PAWN")),
|
||||
LetterDefOf.NegativeEvent,
|
||||
parent.pawn
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// 爆炸条件检查
|
||||
private bool ShouldTriggerExplosion()
|
||||
{
|
||||
return parent.pawn.Spawned &&
|
||||
Props.explosionRadius > 0.01f &&
|
||||
Props.damageDef != null &&
|
||||
parent.pawn.Map != null;
|
||||
}
|
||||
|
||||
// 执行爆炸
|
||||
private void TriggerExplosion()
|
||||
{
|
||||
GenExplosion.DoExplosion(
|
||||
center: parent.pawn.Position,
|
||||
map: parent.pawn.Map,
|
||||
radius: Props.explosionRadius,
|
||||
damType: Props.damageDef,
|
||||
instigator: parent.pawn,
|
||||
damAmount: Props.damageAmount,
|
||||
armorPenetration: Props.armorPenetration,
|
||||
explosionSound: Props.soundDef,
|
||||
weapon: null,
|
||||
projectile: null,
|
||||
intendedTarget: null,
|
||||
postExplosionSpawnThingDef: Props.postExplosionSpawnThingDef,
|
||||
postExplosionSpawnChance: Props.postExplosionSpawnChance,
|
||||
postExplosionSpawnThingCount: Props.postExplosionSpawnThingCount,
|
||||
postExplosionGasType: null,
|
||||
applyDamageToExplosionCellsNeighbors: false,
|
||||
chanceToStartFire: Props.chanceToStartFire,
|
||||
damageFalloff: Props.damageFalloff,
|
||||
direction: null,
|
||||
ignoredThings: new List<Thing> { parent.pawn }
|
||||
);
|
||||
}
|
||||
|
||||
// 装备销毁
|
||||
private void DestroyGearIfNeeded()
|
||||
{
|
||||
if (!Props.destroyGear) return;
|
||||
|
||||
if (parent.pawn.equipment != null)
|
||||
{
|
||||
parent.pawn.equipment.DestroyAllEquipment(DestroyMode.Vanish);
|
||||
}
|
||||
if (parent.pawn.apparel != null)
|
||||
{
|
||||
parent.pawn.apparel.DestroyAll(DestroyMode.Vanish);
|
||||
}
|
||||
}
|
||||
|
||||
// 数据持久化
|
||||
public override void CompExposeData()
|
||||
{
|
||||
Scribe_Values.Look(ref ticksToDisappear, "ticksToDisappear", 0);
|
||||
Scribe_Values.Look(ref disappearsAfterTicks, "disappearsAfterTicks", 0);
|
||||
Scribe_Values.Look(ref seed, "seed", 0);
|
||||
}
|
||||
|
||||
// 调试信息
|
||||
public override string CompDebugString()
|
||||
{
|
||||
return $"倒计时: {ticksToDisappear}\n爆炸半径: {Props.explosionRadius}";
|
||||
}
|
||||
}
|
||||
|
||||
public class HediffCompProperties_TimedExplosion : HediffCompProperties
|
||||
{
|
||||
[Header("消失设置")]
|
||||
public IntRange disappearsAfterTicks = new IntRange(600, 1200);
|
||||
public bool showRemainingTime = true;
|
||||
public bool canUseDecimalsShortForm;
|
||||
public MentalStateDef requiredMentalState;
|
||||
public bool leaveFreshWounds = true;
|
||||
|
||||
[Header("爆炸设置")]
|
||||
public float explosionRadius = 3f;
|
||||
public DamageDef damageDef;
|
||||
public int damageAmount = 20;
|
||||
public float armorPenetration;
|
||||
public SoundDef soundDef;
|
||||
public float chanceToStartFire;
|
||||
public bool damageFalloff = true;
|
||||
|
||||
[Header("后续效果")]
|
||||
public bool destroyGear;
|
||||
public GasType gasType;
|
||||
public ThingDef postExplosionSpawnThingDef;
|
||||
public float postExplosionSpawnChance;
|
||||
public int postExplosionSpawnThingCount = 1;
|
||||
|
||||
[Header("通知设置")]
|
||||
[MustTranslate]
|
||||
public string messageOnDisappear;
|
||||
[MustTranslate]
|
||||
public string letterLabelOnDisappear;
|
||||
[MustTranslate]
|
||||
public string letterTextOnDisappear;
|
||||
public bool sendLetterOnDisappearIfDead = true;
|
||||
|
||||
public HediffCompProperties_TimedExplosion()
|
||||
{
|
||||
compClass = typeof(HediffComp_TimedExplosion);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -19,6 +19,7 @@ namespace ArachnaeSwarm
|
||||
public float structurePointsMax = 500f;
|
||||
public HediffDef hediffOnEmptyFuel;
|
||||
public float fuelConsumptionRate = 0.5f; // Nutrition per day
|
||||
public ThingDef powerArmorWeapon;
|
||||
}
|
||||
|
||||
[StaticConstructorOnStartup]
|
||||
@@ -51,6 +52,18 @@ namespace ArachnaeSwarm
|
||||
public float StructurePointsPercent => StructurePoints / StructurePointsMax;
|
||||
|
||||
public Building sourceBuilding;
|
||||
private ThingWithComps originalWeapon; // Still needed to store pawn's original weapon
|
||||
private ThingWithComps currentPowerArmorWeapon; // Track the currently equipped power armor weapon
|
||||
|
||||
public void SetOriginalWeapon(ThingWithComps weapon)
|
||||
{
|
||||
originalWeapon = weapon;
|
||||
}
|
||||
|
||||
public void SetCurrentPowerArmorWeapon(ThingWithComps weapon)
|
||||
{
|
||||
currentPowerArmorWeapon = weapon;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Ticker
|
||||
@@ -110,6 +123,8 @@ namespace ArachnaeSwarm
|
||||
base.ExposeData();
|
||||
Scribe_Values.Look(ref structurePoints, "structurePoints", -1f);
|
||||
Scribe_References.Look(ref sourceBuilding, "sourceBuilding");
|
||||
Scribe_References.Look(ref originalWeapon, "originalWeapon");
|
||||
Scribe_References.Look(ref currentPowerArmorWeapon, "currentPowerArmorWeapon"); // Save/load current power armor weapon
|
||||
}
|
||||
#endregion
|
||||
|
||||
@@ -137,12 +152,49 @@ namespace ArachnaeSwarm
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
||||
#region State-Switching
|
||||
public override void Notify_Unequipped(Pawn pawn)
|
||||
{
|
||||
base.Notify_Unequipped(pawn);
|
||||
|
||||
// Handle power armor weapon destruction and original weapon restoration
|
||||
if (Ext?.powerArmorWeapon != null)
|
||||
{
|
||||
// Destroy the power armor weapon, wherever it might be.
|
||||
// We track it with currentPowerArmorWeapon, so we don't rely on pawn.equipment.Primary.
|
||||
if (currentPowerArmorWeapon != null)
|
||||
{
|
||||
if (pawn?.equipment != null && pawn.equipment.Contains(currentPowerArmorWeapon))
|
||||
{
|
||||
pawn.equipment.Remove(currentPowerArmorWeapon);
|
||||
}
|
||||
else if (pawn?.inventory?.innerContainer != null && pawn.inventory.innerContainer.Contains(currentPowerArmorWeapon))
|
||||
{
|
||||
pawn.inventory.innerContainer.Remove(currentPowerArmorWeapon);
|
||||
}
|
||||
// If it's on the map, destroy it there.
|
||||
else if (currentPowerArmorWeapon.Spawned)
|
||||
{
|
||||
currentPowerArmorWeapon.DeSpawn();
|
||||
}
|
||||
string destroyedWeaponLabel = currentPowerArmorWeapon.Label;
|
||||
currentPowerArmorWeapon.Destroy();
|
||||
Log.Message($"[PA_Debug] Notify_Unequipped: Destroyed power armor weapon {destroyedWeaponLabel}.");
|
||||
currentPowerArmorWeapon = null;
|
||||
}
|
||||
|
||||
// Restore original weapon if saved
|
||||
if (originalWeapon != null && pawn?.equipment != null)
|
||||
{
|
||||
string originalWeaponLabel = originalWeapon.Label;
|
||||
pawn.equipment.MakeRoomFor(originalWeapon);
|
||||
pawn.equipment.AddEquipment(originalWeapon);
|
||||
Log.Message($"[PA_Debug] Notify_Unequipped: Restored original weapon {originalWeaponLabel}.");
|
||||
originalWeapon = null;
|
||||
}
|
||||
}
|
||||
|
||||
Building building = sourceBuilding;
|
||||
|
||||
// If the source building reference is lost, create a new one as a fallback.
|
||||
@@ -171,6 +223,12 @@ namespace ArachnaeSwarm
|
||||
buildingFuelComp.ReceiveFuel(apparelFuelComp.Fuel);
|
||||
}
|
||||
|
||||
// Sync quality back to building
|
||||
if (this.TryGetComp<CompQuality>() is CompQuality apparelQuality && building.TryGetComp<CompQuality>() is CompQuality buildingQuality)
|
||||
{
|
||||
buildingQuality.SetQuality(apparelQuality.Quality, ArtGenerationContext.Colony);
|
||||
}
|
||||
|
||||
Log.Message($"[PA_Debug] Notify_Unequipped: Before spawning building (ID: {building.thingIDNumber}) - HitPoints: {building.HitPoints}, StackCount: {building.stackCount}");
|
||||
|
||||
// Ensure stackCount is at least 1 for buildings, as 0 stackCount causes errors during spawning
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
using RimWorld;
|
||||
using Verse;
|
||||
using System.Collections.Generic;
|
||||
using Verse.AI; // For PathEndMode and Danger
|
||||
using UnityEngine; // For Texture2D
|
||||
|
||||
namespace ArachnaeSwarm
|
||||
{
|
||||
@@ -16,5 +19,45 @@ namespace ArachnaeSwarm
|
||||
public class CompPowerArmorStation : ThingComp
|
||||
{
|
||||
public CompProperties_PowerArmorStation Props => (CompProperties_PowerArmorStation)props;
|
||||
|
||||
public override void CompTick()
|
||||
{
|
||||
base.CompTick();
|
||||
var fuelComp = parent.GetComp<CompRefuelableNutrition>();
|
||||
if (fuelComp != null)
|
||||
{
|
||||
// Set consumption rate to 0 when in building form
|
||||
fuelComp.currentConsumptionRate = 0f;
|
||||
}
|
||||
}
|
||||
|
||||
public override IEnumerable<FloatMenuOption> CompFloatMenuOptions(Pawn selPawn)
|
||||
{
|
||||
foreach (FloatMenuOption option in base.CompFloatMenuOptions(selPawn))
|
||||
{
|
||||
yield return option;
|
||||
}
|
||||
|
||||
// Check if there's an apparelDef defined
|
||||
if (Props.apparelDef == null)
|
||||
{
|
||||
yield break; // No apparel to wear
|
||||
}
|
||||
|
||||
// Check if the pawn can interact with the building
|
||||
if (!selPawn.CanReserveAndReach(parent, PathEndMode.InteractionCell, Danger.Deadly))
|
||||
{
|
||||
yield return new FloatMenuOption("CannotEnterPowerArmor".Translate() + ": " + "CannotReach".Translate(), null);
|
||||
}
|
||||
else
|
||||
{
|
||||
void enterAction()
|
||||
{
|
||||
Job job = JobMaker.MakeJob(DefDatabase<JobDef>.GetNamed("ARA_EnterPowerArmor"), parent);
|
||||
selPawn.jobs.TryTakeOrderedJob(job, JobTag.Misc);
|
||||
}
|
||||
yield return new FloatMenuOption("EnterPowerArmor".Translate(parent.Label), enterAction);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,59 +0,0 @@
|
||||
using HarmonyLib;
|
||||
using RimWorld;
|
||||
using System.Collections.Generic;
|
||||
using Verse;
|
||||
using Verse.AI;
|
||||
|
||||
namespace ArachnaeSwarm
|
||||
{
|
||||
[HarmonyPatch(typeof(ThingWithComps), "GetFloatMenuOptions")]
|
||||
public static class Harmony_ThingWithComps_GetFloatMenuOptions
|
||||
{
|
||||
[HarmonyPostfix]
|
||||
public static IEnumerable<FloatMenuOption> Postfix(IEnumerable<FloatMenuOption> values, ThingWithComps __instance, Pawn selPawn)
|
||||
{
|
||||
// First, return all original options
|
||||
foreach (var value in values)
|
||||
{
|
||||
yield return value;
|
||||
}
|
||||
|
||||
// --- DEBUG LOGGING ---
|
||||
// Use a more specific check to avoid log spam
|
||||
if (__instance.def.defName != null && __instance.def.defName.StartsWith("ARA_"))
|
||||
{
|
||||
Log.Message($"[PA_Debug] GetFloatMenuOptions Postfix triggered for: {__instance.def.defName}");
|
||||
}
|
||||
|
||||
// Check if the thing is our power armor building
|
||||
var comp = __instance.GetComp<CompPowerArmorStation>();
|
||||
|
||||
if (comp == null && __instance.def.defName != null && __instance.def.defName.StartsWith("ARA_"))
|
||||
{
|
||||
Log.Message($"[PA_Debug] CompPowerArmorStation is NULL for {__instance.def.defName}");
|
||||
}
|
||||
|
||||
if (comp != null)
|
||||
{
|
||||
Log.Message($"[PA_Debug] CompPowerArmorStation FOUND for {__instance.def.defName}. Checking reachability.");
|
||||
|
||||
// Check if the pawn can interact
|
||||
if (!selPawn.CanReserveAndReach(__instance, PathEndMode.InteractionCell, Danger.Deadly))
|
||||
{
|
||||
yield return new FloatMenuOption("CannotEnterPowerArmor".Translate() + ": " + "CannotReach".Translate(), null);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Action to give the job
|
||||
void enterAction()
|
||||
{
|
||||
Job job = JobMaker.MakeJob(DefDatabase<JobDef>.GetNamed("ARA_EnterPowerArmor"), __instance);
|
||||
selPawn.jobs.TryTakeOrderedJob(job, JobTag.Misc);
|
||||
}
|
||||
|
||||
yield return new FloatMenuOption("EnterPowerArmor".Translate(__instance.Label), enterAction);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -50,11 +50,40 @@ namespace ArachnaeSwarm
|
||||
apparelFuelComp.ReceiveFuel(buildingFuelComp.Fuel);
|
||||
}
|
||||
|
||||
// Sync quality
|
||||
if (building.TryGetComp<CompQuality>() is CompQuality buildingQuality && apparel.TryGetComp<CompQuality>() is CompQuality apparelQuality)
|
||||
{
|
||||
apparelQuality.SetQuality(buildingQuality.Quality, ArtGenerationContext.Colony);
|
||||
}
|
||||
|
||||
// Wear the apparel. The second argument 'false' is lockWhileWorn.
|
||||
// The third argument 'false' is playerForced, which is CRITICAL.
|
||||
// If playerForced is true, the game automatically locks the apparel.
|
||||
actor.apparel.Wear(apparel, false, false);
|
||||
|
||||
|
||||
// Handle weapon switching
|
||||
if (apparel.Ext.powerArmorWeapon != null)
|
||||
{
|
||||
if (actor.equipment.Primary != null)
|
||||
{
|
||||
apparel.SetOriginalWeapon(actor.equipment.Primary);
|
||||
actor.equipment.TryDropEquipment(actor.equipment.Primary, out _, actor.Position, false);
|
||||
}
|
||||
|
||||
ThingWithComps weapon = (ThingWithComps)ThingMaker.MakeThing(apparel.Ext.powerArmorWeapon);
|
||||
|
||||
// Sync weapon quality with armor quality
|
||||
if (apparel.TryGetComp<CompQuality>() is CompQuality existingApparelQuality && weapon.TryGetComp<CompQuality>() is CompQuality weaponQuality)
|
||||
{
|
||||
weaponQuality.SetQuality(existingApparelQuality.Quality, ArtGenerationContext.Colony);
|
||||
}
|
||||
|
||||
actor.equipment.MakeRoomFor(weapon);
|
||||
actor.equipment.AddEquipment(weapon);
|
||||
// Track the power armor weapon so it can be destroyed later
|
||||
apparel.SetCurrentPowerArmorWeapon(weapon);
|
||||
}
|
||||
|
||||
// Despawn the building
|
||||
building.DeSpawn();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user