This commit is contained in:
2025-12-07 18:32:28 +08:00
parent 1607946af8
commit dab94bbbb7
2 changed files with 22 additions and 16 deletions

View File

@@ -265,12 +265,19 @@ namespace WulaFallenEmpire
return null; return null;
} }
private struct ThingToTeleport
{
public Thing thing;
public IntVec3 relativePos;
}
private void TeleportContents(Map targetMap, IntVec3 targetCenter) private void TeleportContents(Map targetMap, IntVec3 targetCenter)
{ {
Map sourceMap = parent.Map;
CellRect rect = CellRect.CenteredOn(parent.Position, Props.areaSize.x, Props.areaSize.z); CellRect rect = CellRect.CenteredOn(parent.Position, Props.areaSize.x, Props.areaSize.z);
IntVec3 center = parent.Position; IntVec3 center = parent.Position;
List<Thing> thingsToTeleport = new List<Thing>(); List<ThingToTeleport> thingsToTeleport = new List<ThingToTeleport>();
List<Pair<IntVec3, TerrainDef>> terrainToTeleport = new List<Pair<IntVec3, TerrainDef>>(); List<Pair<IntVec3, TerrainDef>> terrainToTeleport = new List<Pair<IntVec3, TerrainDef>>();
Log.Message($"[WULA] Collecting data from {rect.Area} cells around {center} with size {Props.areaSize}"); Log.Message($"[WULA] Collecting data from {rect.Area} cells around {center} with size {Props.areaSize}");
@@ -279,11 +286,11 @@ namespace WulaFallenEmpire
HashSet<Thing> collectedThings = new HashSet<Thing>(); HashSet<Thing> collectedThings = new HashSet<Thing>();
foreach (IntVec3 cell in rect) foreach (IntVec3 cell in rect)
{ {
if (!cell.InBounds(parent.Map)) continue; if (!cell.InBounds(sourceMap)) continue;
terrainToTeleport.Add(new Pair<IntVec3, TerrainDef>(cell - center, cell.GetTerrain(parent.Map))); terrainToTeleport.Add(new Pair<IntVec3, TerrainDef>(cell - center, cell.GetTerrain(sourceMap)));
List<Thing> thingList = parent.Map.thingGrid.ThingsListAt(cell); List<Thing> thingList = sourceMap.thingGrid.ThingsListAt(cell);
for (int i = thingList.Count - 1; i >= 0; i--) for (int i = thingList.Count - 1; i >= 0; i--)
{ {
Thing t = thingList[i]; Thing t = thingList[i];
@@ -295,19 +302,19 @@ namespace WulaFallenEmpire
if (!t.def.destroyable) continue; if (!t.def.destroyable) continue;
collectedThings.Add(t); collectedThings.Add(t);
thingsToTeleport.Add(t); thingsToTeleport.Add(new ThingToTeleport { thing = t, relativePos = t.Position - center });
} }
} }
} }
// 2. 准备传送 (PreSwapMap) // 2. 准备传送 (PreSwapMap)
foreach (Thing t in thingsToTeleport) t.PreSwapMap(); foreach (var data in thingsToTeleport) data.thing.PreSwapMap();
parent.PreSwapMap(); parent.PreSwapMap();
// 3. 从源地图移除 (DeSpawn) // 3. 从源地图移除 (DeSpawn)
foreach (Thing t in thingsToTeleport) foreach (var data in thingsToTeleport)
{ {
if (t.Spawned) t.DeSpawn(DestroyMode.WillReplace); if (data.thing.Spawned) data.thing.DeSpawn(DestroyMode.WillReplace);
} }
if (parent.Spawned) parent.DeSpawn(DestroyMode.WillReplace); if (parent.Spawned) parent.DeSpawn(DestroyMode.WillReplace);
@@ -326,25 +333,24 @@ namespace WulaFallenEmpire
if (pair.Second != null) if (pair.Second != null)
{ {
targetMap.terrainGrid.SetTerrain(newPos, pair.Second); targetMap.terrainGrid.SetTerrain(newPos, pair.Second);
parent.Map.terrainGrid.SetTerrain(center + pair.First, TerrainDefOf.Soil); sourceMap.terrainGrid.SetTerrain(center + pair.First, TerrainDefOf.Soil);
} }
} }
// 5. 放置到新地图 (Spawn) // 5. 放置到新地图 (Spawn)
foreach (Thing t in thingsToTeleport) foreach (var data in thingsToTeleport)
{ {
if (t.Destroyed) continue; if (data.thing.Destroyed) continue;
IntVec3 relativePos = t.Position - center; IntVec3 newPos = targetCenter + data.relativePos;
IntVec3 newPos = targetCenter + relativePos;
newPos = newPos.ClampInsideMap(targetMap); newPos = newPos.ClampInsideMap(targetMap);
GenSpawn.Spawn(t, newPos, targetMap, t.Rotation); GenSpawn.Spawn(data.thing, newPos, targetMap, data.thing.Rotation);
} }
GenSpawn.Spawn(parent, targetCenter, targetMap, parent.Rotation); GenSpawn.Spawn(parent, targetCenter, targetMap, parent.Rotation);
// 6. 传送后处理 (PostSwapMap) // 6. 传送后处理 (PostSwapMap)
foreach (Thing t in thingsToTeleport) foreach (var data in thingsToTeleport)
{ {
if (!t.Destroyed) t.PostSwapMap(); if (!data.thing.Destroyed) data.thing.PostSwapMap();
} }
parent.PostSwapMap(); parent.PostSwapMap();