This commit is contained in:
2025-11-04 09:16:47 +08:00
parent 9905782298
commit 498367194b
7 changed files with 0 additions and 883 deletions

View File

@@ -836,46 +836,4 @@
<heatPerTickWhileWorking>0.10</heatPerTickWhileWorking>
</building>
</ThingDef>
<ThingDef ParentName="BuildingBase">
<defName>WULA_ResourceSubmitter</defName>
<label>乌拉帝国物资交换舱</label>
<description>乌拉帝国从地面向舰队提交资源的特殊交换仓。</description>
<thingClass>WulaFallenEmpire.Building_ResourceSubmitter</thingClass>
<graphicData>
<texPath>Things/Building/Furniture/Shelf</texPath>
<graphicClass>Graphic_Multi</graphicClass>
<drawSize>(1,1)</drawSize>
</graphicData>
<size>(1,1)</size>
<rotatable>false</rotatable>
<tickerType>Normal</tickerType>
<altitudeLayer>BuildingOnTop</altitudeLayer>
<passability>PassThroughOnly</passability>
<castEdgeShadows>false</castEdgeShadows>
<designationHotKey>Misc12</designationHotKey>
<fillPercent>0.5</fillPercent>
<designationCategory>WULA_Buildings</designationCategory>
<uiOrder>2200</uiOrder>
<statBases>
<MaxHitPoints>250</MaxHitPoints>
<WorkToBuild>1600</WorkToBuild>
<Flammability>0.5</Flammability>
</statBases>
<costList>
<Steel>20</Steel>
</costList>
<comps>
<li Class="WulaFallenEmpire.CompProperties_ResourceSubmitter">
<massCapacity>500</massCapacity>
</li>
</comps>
<inspectorTabs>
<li>ITab_Storage</li>
<!-- <li>WulaFallenEmpire.ITab_ResourceSubmitterContents</li> -->
</inspectorTabs>
<placeWorkers>
<li>PlaceWorker_NotUnderRoof</li>
</placeWorkers>
<uiIconScale>0.65</uiIconScale>
</ThingDef>
</Defs>

View File

@@ -1,71 +0,0 @@
using RimWorld;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using Verse;
using System;
using System.Text;
namespace WulaFallenEmpire
{
public class Building_ResourceSubmitter : Building
{
public CompPowerTrader powerComp;
public CompRefuelable refuelableComp;
public CompFlickable flickableComp;
public CompResourceSubmitter submitterComp;
public override void SpawnSetup(Map map, bool respawningAfterLoad)
{
base.SpawnSetup(map, respawningAfterLoad);
powerComp = GetComp<CompPowerTrader>();
refuelableComp = GetComp<CompRefuelable>();
flickableComp = GetComp<CompFlickable>();
submitterComp = GetComp<CompResourceSubmitter>();
}
public bool IsOperational
{
get
{
if (powerComp != null && !powerComp.PowerOn)
return false;
if (refuelableComp != null && !refuelableComp.HasFuel)
return false;
if (flickableComp != null && !flickableComp.SwitchIsOn)
return false;
return true;
}
}
public string GetInoperativeReason()
{
if (powerComp != null && !powerComp.PowerOn)
return "WULA_NoPower".Translate();
if (refuelableComp != null && !refuelableComp.HasFuel)
return "WULA_NoFuel".Translate();
if (flickableComp != null && !flickableComp.SwitchIsOn)
return "WULA_SwitchOff".Translate();
return "WULA_UnknownReason".Translate();
}
public override string GetInspectString()
{
StringBuilder stringBuilder = new StringBuilder();
string baseString = base.GetInspectString();
if (!baseString.NullOrEmpty())
{
stringBuilder.Append(baseString);
}
if (!IsOperational)
{
if (stringBuilder.Length > 0) stringBuilder.AppendLine();
stringBuilder.Append($"{"WULA_Status".Translate()}: {"WULA_Inoperative".Translate()} - {GetInoperativeReason()}");
}
return stringBuilder.ToString();
}
}
}

View File

@@ -1,21 +0,0 @@
using RimWorld;
using UnityEngine;
using Verse;
namespace WulaFallenEmpire
{
public class Command_LoadToResourceSubmitter : Command
{
public CompResourceSubmitter submitterComp;
public override void ProcessInput(Event ev)
{
base.ProcessInput(ev);
if (submitterComp?.parent == null) return;
// 打开装载界面,类似运输舱的界面
Find.WindowStack.Add(new Dialog_LoadResourceSubmitter(submitterComp));
}
}
}

View File

@@ -1,391 +0,0 @@
using RimWorld;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using Verse;
using System;
using System.Text;
namespace WulaFallenEmpire
{
public class CompResourceSubmitter : ThingComp, IThingHolder
{
public ThingOwner innerContainer;
public List<TransferableOneWay> leftToLoad;
private bool massUsageDirty = true;
private float cachedMassUsage;
public CompProperties_ResourceSubmitter Props => (CompProperties_ResourceSubmitter)props;
public float MassUsage
{
get
{
if (massUsageDirty)
{
massUsageDirty = false;
cachedMassUsage = CollectionsMassCalculator.MassUsage(innerContainer, IgnorePawnsInventoryMode.IgnoreIfAssignedToUnload, includePawnsMass: false);
}
return cachedMassUsage;
}
}
public bool OverMassCapacity => MassUsage > Props.massCapacity;
public bool AnythingLeftToLoad => FirstThingLeftToLoad != null;
public Thing FirstThingLeftToLoad
{
get
{
if (leftToLoad == null) return null;
for (int i = 0; i < leftToLoad.Count; i++)
{
if (leftToLoad[i].CountToTransfer != 0 && leftToLoad[i].HasAnyThing)
return leftToLoad[i].AnyThing;
}
return null;
}
}
public CompResourceSubmitter()
{
innerContainer = new ThingOwner<Thing>(this);
}
public override void PostExposeData()
{
base.PostExposeData();
Scribe_Deep.Look(ref innerContainer, "innerContainer", this);
Scribe_Collections.Look(ref leftToLoad, "leftToLoad", LookMode.Deep);
if (Scribe.mode == LoadSaveMode.Saving)
{
leftToLoad?.RemoveWhere(t => t == null);
}
}
public ThingOwner GetDirectlyHeldThings()
{
return innerContainer;
}
public void GetChildHolders(List<IThingHolder> outChildren)
{
ThingOwnerUtility.AppendThingHoldersFromThings(outChildren, GetDirectlyHeldThings());
}
// 在 CompResourceSubmitter 类中添加或更新以下方法:
public override void PostSpawnSetup(bool respawningAfterLoad)
{
base.PostSpawnSetup(respawningAfterLoad);
massUsageDirty = true;
}
public override void PostDeSpawn(Map map, DestroyMode mode = DestroyMode.Vanish)
{
base.PostDeSpawn(map, mode);
if (mode != DestroyMode.WillReplace)
{
innerContainer.TryDropAll(parent.Position, map, ThingPlaceMode.Near);
}
}
public override IEnumerable<Gizmo> CompGetGizmosExtra()
{
foreach (Gizmo g in base.CompGetGizmosExtra())
{
yield return g;
}
// 装载命令
Command_LoadToResourceSubmitter loadCommand = new Command_LoadToResourceSubmitter();
loadCommand.defaultLabel = "WULA_LoadResourceSubmitter".Translate();
loadCommand.defaultDesc = "WULA_LoadResourceSubmitterDesc".Translate();
loadCommand.icon = ContentFinder<Texture2D>.Get("UI/Commands/LoadTransporter");
loadCommand.submitterComp = this;
// 禁用检查
if (!parent.Spawned)
{
loadCommand.Disable("WULA_NotSpawned".Translate());
}
else if (!IsOperational())
{
loadCommand.Disable(GetInoperativeReason());
}
yield return loadCommand;
// 取消装载/卸载命令
if (innerContainer.Any || AnythingLeftToLoad)
{
Command_Action cancelCommand = new Command_Action();
cancelCommand.defaultLabel = innerContainer.Any ? "WULA_Unload".Translate() : "WULA_CancelLoad".Translate();
cancelCommand.defaultDesc = innerContainer.Any ? "WULA_UnloadDesc".Translate() : "WULA_CancelLoadDesc".Translate();
cancelCommand.icon = ContentFinder<Texture2D>.Get("UI/Designators/Cancel");
cancelCommand.action = CancelLoad;
yield return cancelCommand;
}
// 发射命令
Command_Action launchCommand = new Command_Action();
launchCommand.defaultLabel = "WULA_LaunchSubmitter".Translate();
launchCommand.defaultDesc = "WULA_LaunchSubmitterDesc".Translate();
launchCommand.icon = ContentFinder<Texture2D>.Get("UI/Commands/Launch");
launchCommand.action = TryLaunch;
// 发射条件检查
if (!parent.Spawned)
{
launchCommand.Disable("WULA_NotSpawned".Translate());
}
else if (!IsOperational())
{
launchCommand.Disable(GetInoperativeReason());
}
else if (!innerContainer.Any)
{
launchCommand.Disable("WULA_NoItemsToSubmit".Translate());
}
else if (OverMassCapacity)
{
launchCommand.Disable("WULA_OverMassCapacity".Translate(MassUsage.ToString("F1"), Props.massCapacity.ToString("F1")));
}
yield return launchCommand;
}
public override string CompInspectStringExtra()
{
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.Append("WULA_SubmitterContents".Translate() + ": " + innerContainer.ContentsString.CapitalizeFirst());
string massString = "WULA_Mass".Translate() + ": " + MassUsage.ToString("F1") + " / " + Props.massCapacity.ToString("F1") + " kg";
stringBuilder.AppendLine().Append(OverMassCapacity ? massString.Colorize(ColorLibrary.RedReadable) : massString);
if (!IsOperational())
{
stringBuilder.AppendLine().Append("WULA_Status".Translate() + ": " + "WULA_Inoperative".Translate().Colorize(ColorLibrary.RedReadable));
}
return stringBuilder.ToString();
}
public void AddToTheToLoadList(TransferableOneWay t, int count)
{
if (!t.HasAnyThing || count <= 0) return;
if (leftToLoad == null)
{
leftToLoad = new List<TransferableOneWay>();
}
TransferableOneWay existing = TransferableUtility.TransferableMatching(t.AnyThing, leftToLoad, TransferAsOneMode.PodsOrCaravanPacking);
if (existing != null)
{
for (int i = 0; i < t.things.Count; i++)
{
if (!existing.things.Contains(t.things[i]))
{
existing.things.Add(t.things[i]);
}
}
if (existing.CanAdjustBy(count).Accepted)
{
existing.AdjustBy(count);
}
}
else
{
TransferableOneWay newTransferable = new TransferableOneWay();
leftToLoad.Add(newTransferable);
newTransferable.things.AddRange(t.things);
newTransferable.AdjustTo(count);
}
}
public void Notify_ThingAdded(Thing t)
{
SubtractFromToLoadList(t, t.stackCount);
massUsageDirty = true;
}
public void Notify_ThingRemoved(Thing t)
{
massUsageDirty = true;
}
public void Notify_ThingAddedAndMergedWith(Thing t, int mergedCount)
{
SubtractFromToLoadList(t, mergedCount);
massUsageDirty = true;
}
private int SubtractFromToLoadList(Thing t, int count)
{
if (leftToLoad == null) return 0;
TransferableOneWay transferable = TransferableUtility.TransferableMatchingDesperate(t, leftToLoad, TransferAsOneMode.PodsOrCaravanPacking);
if (transferable == null || transferable.CountToTransfer <= 0) return 0;
int num = Mathf.Min(count, transferable.CountToTransfer);
transferable.AdjustBy(-num);
if (transferable.CountToTransfer <= 0)
{
leftToLoad.Remove(transferable);
}
return num;
}
private void CancelLoad()
{
if (leftToLoad != null)
{
leftToLoad.Clear();
}
innerContainer.TryDropAll(parent.Position, parent.Map, ThingPlaceMode.Near);
massUsageDirty = true;
}
private void TryLaunch()
{
if (!IsOperational())
{
Messages.Message(GetInoperativeReason(), MessageTypeDefOf.RejectInput);
return;
}
if (!innerContainer.Any)
{
Messages.Message("WULA_NoItemsToSubmit".Translate(), MessageTypeDefOf.RejectInput);
return;
}
if (OverMassCapacity)
{
Messages.Message("WULA_OverMassCapacity".Translate(MassUsage.ToString("F1"), Props.massCapacity.ToString("F1")), MessageTypeDefOf.RejectInput);
return;
}
if (SubmitContentsToStorage())
{
CreateLaunchEffect();
parent.Destroy();
}
}
private bool SubmitContentsToStorage()
{
try
{
var globalStorage = Find.World.GetComponent<GlobalStorageWorldComponent>();
if (globalStorage == null)
{
Log.Error("GlobalStorageWorldComponent not found");
return false;
}
int submittedCount = 0;
List<Thing> processedItems = new List<Thing>();
// 复制列表以避免修改时迭代
List<Thing> itemsToProcess = innerContainer.ToList();
foreach (Thing item in itemsToProcess)
{
if (item == null || item.Destroyed) continue;
if (IsEquipment(item.def))
{
globalStorage.AddToOutputStorage(item.def, item.stackCount);
}
else
{
globalStorage.AddToInputStorage(item.def, item.stackCount);
}
processedItems.Add(item);
submittedCount += item.stackCount;
}
// 从容器中移除已提交的物品
foreach (Thing item in processedItems)
{
innerContainer.Remove(item);
}
Messages.Message("WULA_ItemsSubmitted".Translate(submittedCount), MessageTypeDefOf.PositiveEvent);
Log.Message($"Successfully submitted {submittedCount} items to global storage");
return submittedCount > 0;
}
catch (Exception ex)
{
Log.Error($"Error submitting items to storage: {ex}");
Messages.Message("WULA_SubmissionFailed".Translate(), MessageTypeDefOf.NegativeEvent);
return false;
}
}
private bool IsEquipment(ThingDef thingDef)
{
return thingDef.IsApparel || thingDef.IsWeapon || thingDef.category == ThingCategory.Building;
}
private void CreateLaunchEffect()
{
try
{
// 使用自定义的 Skyfaller 定义
ThingDef skyfallerDef = DefDatabase<ThingDef>.GetNamedSilentFail("ResourceSubmitterSkyfaller");
if (skyfallerDef == null)
{
// 备用:使用运输舱效果
skyfallerDef = DefDatabase<ThingDef>.GetNamedSilentFail("DropPodIncoming");
}
if (skyfallerDef != null)
{
Skyfaller skyfaller = (Skyfaller)ThingMaker.MakeThing(skyfallerDef);
GenSpawn.Spawn(skyfaller, parent.Position, parent.Map);
}
// 视觉效果
for (int i = 0; i < 3; i++)
{
FleckMaker.ThrowLightningGlow(parent.DrawPos, parent.Map, 2f);
}
FleckMaker.ThrowSmoke(parent.DrawPos, parent.Map, 3f);
}
catch (Exception ex)
{
Log.Error($"Error creating launch effect: {ex}");
}
}
private bool IsOperational()
{
var building = parent as Building_ResourceSubmitter;
return building?.IsOperational ?? false;
}
private string GetInoperativeReason()
{
var building = parent as Building_ResourceSubmitter;
return building?.GetInoperativeReason() ?? "WULA_UnknownReason".Translate();
}
}
public class CompProperties_ResourceSubmitter : CompProperties
{
public float massCapacity = 150f;
public CompProperties_ResourceSubmitter()
{
compClass = typeof(CompResourceSubmitter);
}
}
}

View File

@@ -1,354 +0,0 @@
using RimWorld;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using Verse;
using Verse.AI;
namespace WulaFallenEmpire
{
public class Dialog_LoadResourceSubmitter : Window
{
private CompResourceSubmitter submitterComp;
private Vector2 scrollPosition;
private float scrollViewHeight;
private List<TransferableOneWay> transferables;
public override Vector2 InitialSize => new Vector2(800f, 600f);
public Dialog_LoadResourceSubmitter(CompResourceSubmitter submitterComp)
{
this.submitterComp = submitterComp;
forcePause = true;
doCloseX = true;
doCloseButton = true;
absorbInputAroundWindow = true;
transferables = new List<TransferableOneWay>();
RefreshTransferables();
}
public override void DoWindowContents(Rect inRect)
{
Rect titleRect = new Rect(0f, 0f, inRect.width, 35f);
Text.Font = GameFont.Medium;
Widgets.Label(titleRect, "WULA_LoadResourceSubmitter".Translate());
Text.Font = GameFont.Small;
// 简化的物品列表
Rect listRect = new Rect(0f, 40f, inRect.width, inRect.height - 100f);
DoSimpleTransferableList(listRect);
// 按钮区域
Rect buttonRect = new Rect(0f, inRect.height - 55f, inRect.width, 30f);
DoButtons(buttonRect);
// 状态信息
Rect statusRect = new Rect(0f, inRect.height - 25f, inRect.width, 25f);
DoStatusInfo(statusRect);
}
private void DoSimpleTransferableList(Rect rect)
{
Widgets.DrawMenuSection(rect);
Rect outRect = rect.ContractedBy(10f);
Rect viewRect = new Rect(0f, 0f, outRect.width - 16f, scrollViewHeight);
Widgets.BeginScrollView(outRect, ref scrollPosition, viewRect);
float curY = 0f;
// 列标题
Rect headerRect = new Rect(0f, curY, viewRect.width, 25f);
DoColumnHeaders(headerRect);
curY += 30f;
if (transferables.Count == 0)
{
Rect emptyRect = new Rect(0f, curY, viewRect.width, 30f);
Text.Anchor = TextAnchor.MiddleCenter;
Widgets.Label(emptyRect, "WULA_NoItemsAvailable".Translate());
Text.Anchor = TextAnchor.UpperLeft;
curY += 35f;
}
else
{
foreach (var transferable in transferables)
{
if (transferable.things.Count == 0) continue;
Thing sampleThing = transferable.things[0];
Rect rowRect = new Rect(0f, curY, viewRect.width, 30f);
if (DoTransferableRow(rowRect, transferable, sampleThing))
{
TooltipHandler.TipRegion(rowRect, GetThingTooltip(sampleThing, transferable.CountToTransfer));
}
curY += 35f;
}
}
if (Event.current.type == EventType.Layout)
{
scrollViewHeight = curY;
}
Widgets.EndScrollView();
}
private void DoColumnHeaders(Rect rect)
{
float columnWidth = rect.width / 4f;
// 物品名称列
Rect nameRect = new Rect(rect.x, rect.y, columnWidth * 2f, rect.height);
Text.Anchor = TextAnchor.MiddleLeft;
Widgets.Label(nameRect, "WULA_ItemName".Translate());
// 可用数量列
Rect availableRect = new Rect(rect.x + columnWidth * 2f, rect.y, columnWidth, rect.height);
Text.Anchor = TextAnchor.MiddleCenter;
Widgets.Label(availableRect, "WULA_Available".Translate());
// 装载数量列
Rect loadRect = new Rect(rect.x + columnWidth * 3f, rect.y, columnWidth, rect.height);
Widgets.Label(loadRect, "WULA_ToLoad".Translate());
Text.Anchor = TextAnchor.UpperLeft;
// 标题下划线
Widgets.DrawLineHorizontal(rect.x, rect.yMax - 2f, rect.width);
}
private bool DoTransferableRow(Rect rect, TransferableOneWay transferable, Thing sampleThing)
{
Widgets.DrawHighlightIfMouseover(rect);
float columnWidth = rect.width / 4f;
// 图标
Rect iconRect = new Rect(rect.x + 2f, rect.y + 2f, 26f, 26f);
Widgets.ThingIcon(iconRect, sampleThing);
// 名称
Rect nameRect = new Rect(rect.x + 32f, rect.y, columnWidth * 2f - 32f, rect.height);
Text.Anchor = TextAnchor.MiddleLeft;
string label = sampleThing.LabelCap;
if (label.Length > 25)
{
label = label.Substring(0, 25) + "...";
}
Widgets.Label(nameRect, label);
// 可用数量
int availableCount = transferable.things.Sum(t => t.stackCount);
Rect availableRect = new Rect(rect.x + columnWidth * 2f, rect.y, columnWidth, rect.height);
Text.Anchor = TextAnchor.MiddleCenter;
Widgets.Label(availableRect, availableCount.ToString());
// 装载数量调整
Rect adjustRect = new Rect(rect.x + columnWidth * 3f, rect.y, columnWidth, rect.height);
DoCountAdjust(adjustRect, transferable, availableCount);
Text.Anchor = TextAnchor.UpperLeft;
return Mouse.IsOver(rect);
}
private void DoCountAdjust(Rect rect, TransferableOneWay transferable, int availableCount)
{
int currentCount = transferable.CountToTransfer;
Rect labelRect = new Rect(rect.x, rect.y, 40f, rect.height);
Rect minusRect = new Rect(rect.x + 45f, rect.y, 25f, rect.height);
Rect plusRect = new Rect(rect.x + 75f, rect.y, 25f, rect.height);
Rect maxRect = new Rect(rect.x + 105f, rect.y, 35f, rect.height);
Text.Anchor = TextAnchor.MiddleCenter;
// 当前数量
Widgets.Label(labelRect, currentCount.ToString());
// 减少按钮
if (Widgets.ButtonText(minusRect, "-") && currentCount > 0)
{
transferable.AdjustBy(-1);
}
// 增加按钮
if (Widgets.ButtonText(plusRect, "+") && currentCount < availableCount)
{
transferable.AdjustBy(1);
}
// 最大按钮
if (Widgets.ButtonText(maxRect, "WULA_Max".Translate()) && availableCount > 0)
{
Find.WindowStack.Add(new Dialog_Slider(
"WULA_SetLoadCount".Translate(transferable.AnyThing.LabelCap),
0, availableCount,
value => transferable.AdjustTo(value),
currentCount
));
}
Text.Anchor = TextAnchor.UpperLeft;
}
private void DoButtons(Rect rect)
{
float buttonWidth = rect.width / 2f - 5f;
// 加载所有按钮
Rect loadAllRect = new Rect(rect.x, rect.y, buttonWidth, rect.height);
if (Widgets.ButtonText(loadAllRect, "WULA_LoadAll".Translate()))
{
foreach (var transferable in transferables)
{
transferable.AdjustTo(transferable.things.Sum(t => t.stackCount));
}
}
// 清除所有按钮
Rect clearAllRect = new Rect(rect.x + buttonWidth + 10f, rect.y, buttonWidth, rect.height);
if (Widgets.ButtonText(clearAllRect, "WULA_ClearAll".Translate()))
{
foreach (var transferable in transferables)
{
transferable.AdjustTo(0);
}
}
}
private void DoStatusInfo(Rect rect)
{
Widgets.DrawMenuSection(rect);
Rect innerRect = rect.ContractedBy(5f);
Text.Anchor = TextAnchor.MiddleLeft;
// 计算总质量
float totalMass = 0f;
foreach (var transferable in transferables)
{
if (transferable.CountToTransfer > 0)
{
float thingMass = transferable.AnyThing.GetStatValue(StatDefOf.Mass);
totalMass += thingMass * transferable.CountToTransfer;
}
}
// 质量信息
string massText = "WULA_Mass".Translate() + ": " + totalMass.ToString("F1") + " / " + submitterComp.Props.massCapacity.ToString("F1") + " kg";
if (totalMass > submitterComp.Props.massCapacity)
{
massText = massText.Colorize(ColorLibrary.RedReadable);
}
Widgets.Label(innerRect, massText);
Text.Anchor = TextAnchor.UpperLeft;
}
private string GetThingTooltip(Thing thing, int count)
{
float mass = thing.GetStatValue(StatDefOf.Mass);
float value = thing.MarketValue * count;
return $"{thing.LabelCap}\n{"WULA_Mass".Translate()}: {mass:F2} kg\n{"WULA_Value".Translate()}: {value}\n{"WULA_Description".Translate()}: {thing.def.description}";
}
private void RefreshTransferables()
{
transferables.Clear();
// 获取地图上所有可搬运的物品
foreach (Thing thing in submitterComp.parent.Map.listerThings.ThingsInGroup(ThingRequestGroup.HaulableAlways))
{
if ((thing.IsInValidStorage() || thing.Spawned) && !thing.Position.Fogged(thing.Map))
{
AddToTransferables(thing);
}
}
// 按物品类型排序
transferables.SortBy(t => t.AnyThing.def.label);
}
private void AddToTransferables(Thing thing)
{
if (thing.def.category == ThingCategory.Item)
{
TransferableOneWay transferable = TransferableUtility.TransferableMatching(thing, transferables, TransferAsOneMode.PodsOrCaravanPacking);
if (transferable == null)
{
transferable = new TransferableOneWay();
transferables.Add(transferable);
transferable.things.Add(thing);
}
else
{
transferable.things.Add(thing);
}
}
}
public override void PostClose()
{
base.PostClose();
// 应用装载设置到提交器
if (submitterComp != null)
{
submitterComp.leftToLoad?.Clear();
foreach (TransferableOneWay transferable in transferables)
{
if (transferable.CountToTransfer > 0)
{
submitterComp.AddToTheToLoadList(transferable, transferable.CountToTransfer);
}
}
// 开始装载工作
StartLoadingJobs();
}
}
private void StartLoadingJobs()
{
if (submitterComp?.parent?.Map == null) return;
foreach (TransferableOneWay transferable in transferables)
{
if (transferable.CountToTransfer > 0)
{
foreach (Thing thing in transferable.things)
{
if (transferable.CountToTransfer <= 0) break;
// 创建搬运到提交器的工作
Job job = JobMaker.MakeJob(JobDefOf.HaulToContainer, thing, submitterComp.parent);
job.count = Mathf.Min(thing.stackCount, transferable.CountToTransfer);
job.haulMode = HaulMode.ToContainer;
// 寻找殖民者执行工作
Pawn pawn = FindBestPawnForJob(job);
if (pawn != null)
{
pawn.jobs.TryTakeOrderedJob(job);
transferable.AdjustBy(-job.count);
}
}
}
}
Messages.Message("WULA_LoadingJobsCreated".Translate(), MessageTypeDefOf.PositiveEvent);
}
private Pawn FindBestPawnForJob(Job job)
{
return submitterComp.parent.Map.mapPawns.FreeColonistsSpawned
.Where(p => p.workSettings.WorkIsActive(WorkTypeDefOf.Hauling))
.FirstOrDefault(p => p.CanReserveAndReach(job.targetA, PathEndMode.ClosestTouch, Danger.Some));
}
}
}

View File

@@ -108,10 +108,6 @@
<Compile Include="Flyover\WULA_SpawnFlyOver\CompAbilityEffect_SpawnFlyOver.cs" />
<Compile Include="Flyover\WULA_SpawnFlyOver\CompProperties_AbilitySpawnFlyOver.cs" />
<Compile Include="GlobalWorkTable\Building_GlobalWorkTable.cs" />
<Compile Include="GlobalWorkTable\Building_ResourceSubmitter.cs" />
<Compile Include="GlobalWorkTable\Command_LoadToResourceSubmitter.cs" />
<Compile Include="GlobalWorkTable\CompResourceSubmitter.cs" />
<Compile Include="GlobalWorkTable\Dialog_LoadResourceSubmitter.cs" />
<Compile Include="GlobalWorkTable\GlobalProductionOrder.cs" />
<Compile Include="GlobalWorkTable\GlobalProductionOrderStack.cs" />
<Compile Include="GlobalWorkTable\GlobalStorageWorldComponent.cs" />