到底有多强

This commit is contained in:
Tourswen
2025-11-12 00:32:52 +08:00
parent 40b0cdbb05
commit c2b23554cc
67 changed files with 769 additions and 425 deletions

View File

@@ -0,0 +1,76 @@
using Verse;
using RimWorld;
namespace WulaFallenEmpire
{
public class CompProperties_SkyfallerPawnSpawner : CompProperties
{
public PawnKindDef pawnKind;
public FactionDef faction;
public bool spawnDrafted = false;
public bool spawnHostile = false;
public CompProperties_SkyfallerPawnSpawner()
{
compClass = typeof(CompSkyfallerPawnSpawner);
}
}
public class CompSkyfallerPawnSpawner : ThingComp
{
public CompProperties_SkyfallerPawnSpawner Props => (CompProperties_SkyfallerPawnSpawner)props;
public void SpawnPawn(Map map, IntVec3 position)
{
if (Props.pawnKind == null)
{
Log.Error("CompSkyfallerPawnSpawner: pawnKind is null");
return;
}
// 创建 Pawn
PawnGenerationRequest request = new PawnGenerationRequest(
Props.pawnKind,
faction: GetFaction(),
context: PawnGenerationContext.NonPlayer,
fixedBiologicalAge: 0,
fixedChronologicalAge: 0
);
Pawn pawn = PawnGenerator.GeneratePawn(request);
// 设置阵营关系
if (Props.spawnHostile)
{
pawn.SetFaction(Faction.OfAncientsHostile);
}
// 生成 Pawn
GenSpawn.Spawn(pawn, position, map);
// 如果需要,设置为征召状态
if (Props.spawnDrafted && pawn.drafter != null)
{
pawn.drafter.Drafted = true;
}
// 发送生成消息
Messages.Message("SkyfallerPawnLanded".Translate(pawn.LabelShortCap), pawn, MessageTypeDefOf.NeutralEvent);
}
private Faction GetFaction()
{
if (Props.faction != null)
{
return FactionUtility.DefaultFactionFrom(Props.faction);
}
if (Props.spawnHostile)
{
return Faction.OfAncientsHostile;
}
return Faction.OfAncients;
}
}
}

View File

@@ -0,0 +1,50 @@
using Verse;
using RimWorld;
using System.Collections.Generic;
namespace WulaFallenEmpire
{
public class Skyfaller_PawnSpawner : Skyfaller
{
private CompSkyfallerPawnSpawner pawnSpawnerComp;
public override void PostPostMake()
{
base.PostPostMake();
pawnSpawnerComp = GetComp<CompSkyfallerPawnSpawner>();
}
protected override void Impact()
{
// 在调用基类 Impact 之前保存位置信息
IntVec3 impactPosition = base.Position;
Map impactMap = base.Map;
// 调用基类 Impact 方法(这会处理爆炸、碎片等效果)
base.Impact();
// 生成 Pawn
if (pawnSpawnerComp != null && impactMap != null)
{
pawnSpawnerComp.SpawnPawn(impactMap, impactPosition);
}
}
// 可选:重写 SpawnThings 方法以防止生成原版的内容
protected override void SpawnThings()
{
// 如果我们要生成 Pawn可能不想生成原版的物品
// 但保留原版逻辑以防有其他内容需要生成
base.SpawnThings();
}
public override void ExposeData()
{
base.ExposeData();
if (Scribe.mode == LoadSaveMode.LoadingVars)
{
pawnSpawnerComp = GetComp<CompSkyfallerPawnSpawner>();
}
}
}
}