This commit is contained in:
Tourswen
2025-11-19 00:46:26 +08:00
parent 878657af47
commit 0d6fb3bf19
7 changed files with 473 additions and 245 deletions

View File

@@ -17,6 +17,11 @@ namespace WulaFallenEmpire
// 存储每个伴飞的缩放和遮罩数据
private Dictionary<FlyOver, EscortVisualData> escortVisualData = new Dictionary<FlyOver, EscortVisualData>();
// 新增伴飞ID映射用于解决存档加载时的引用问题
private Dictionary<int, EscortVisualData> escortDataByID = new Dictionary<int, EscortVisualData>();
private List<int> escortIDs = new List<int>();
private List<EscortVisualData> escortDataList = new List<EscortVisualData>();
public override void Initialize(CompProperties props)
{
base.Initialize(props);
@@ -76,7 +81,18 @@ namespace WulaFallenEmpire
{
FlyOver removedEscort = activeEscorts[i];
activeEscorts.RemoveAt(i);
escortVisualData.Remove(removedEscort);
// 从两个字典中都移除
if (escortVisualData.ContainsKey(removedEscort))
{
escortVisualData.Remove(removedEscort);
}
int escortID = GetEscortID(removedEscort);
if (escortDataByID.ContainsKey(escortID))
{
escortDataByID.Remove(escortID);
}
}
}
}
@@ -114,6 +130,11 @@ namespace WulaFallenEmpire
{
activeEscorts.Add(escort);
escortVisualData[escort] = visualData;
// 添加到ID映射
int escortID = GetEscortID(escort);
escortDataByID[escortID] = visualData;
successfulSpawns++;
Log.Message($"Spawned escort #{successfulSpawns} for FlyOver at {mainFlyOver.DrawPos}, scale: {visualData.scale:F2}, maskAlpha: {visualData.heightMaskAlpha:F2}");
@@ -452,40 +473,109 @@ namespace WulaFallenEmpire
}
activeEscorts.Clear();
escortVisualData.Clear();
escortDataByID.Clear();
}
}
// 新增获取伴飞的唯一ID
private int GetEscortID(FlyOver escort)
{
return escort?.thingIDNumber ?? 0;
}
// 修复的序列化方法
public override void PostExposeData()
{
base.PostExposeData();
Scribe_Values.Look(ref ticksUntilNextSpawn, "ticksUntilNextSpawn", 0f);
Scribe_Collections.Look(ref activeEscorts, "activeEscorts", LookMode.Reference);
Scribe_Values.Look(ref hasInitialized, "hasInitialized", false);
// 保存视觉数据(如果需要)
// 修复使用ID映射来保存和恢复视觉数据
if (Scribe.mode == LoadSaveMode.Saving)
{
List<FlyOver> keys = new List<FlyOver>(escortVisualData.Keys);
List<EscortVisualData> values = new List<EscortVisualData>(escortVisualData.Values);
Scribe_Collections.Look(ref keys, "escortKeys", LookMode.Reference);
Scribe_Collections.Look(ref values, "escortValues", LookMode.Deep);
// 保存时将视觉数据转换为ID映射
escortIDs.Clear();
escortDataList.Clear();
escortDataByID.Clear();
foreach (var kvp in escortVisualData)
{
if (kvp.Key != null && !kvp.Key.Destroyed)
{
int escortID = GetEscortID(kvp.Key);
escortIDs.Add(escortID);
escortDataList.Add(kvp.Value);
escortDataByID[escortID] = kvp.Value;
}
}
Scribe_Collections.Look(ref escortIDs, "escortIDs", LookMode.Value);
Scribe_Collections.Look(ref escortDataList, "escortDataList", LookMode.Deep);
}
else if (Scribe.mode == LoadSaveMode.LoadingVars)
{
List<FlyOver> keys = new List<FlyOver>();
List<EscortVisualData> values = new List<EscortVisualData>();
Scribe_Collections.Look(ref keys, "escortKeys", LookMode.Reference);
Scribe_Collections.Look(ref values, "escortValues", LookMode.Deep);
// 加载时,先清空现有数据
escortVisualData.Clear();
escortDataByID.Clear();
if (keys != null && values != null && keys.Count == values.Count)
// 加载ID和视觉数据列表
Scribe_Collections.Look(ref escortIDs, "escortIDs", LookMode.Value);
Scribe_Collections.Look(ref escortDataList, "escortDataList", LookMode.Deep);
// 重建ID映射
if (escortIDs != null && escortDataList != null && escortIDs.Count == escortDataList.Count)
{
escortVisualData.Clear();
for (int i = 0; i < keys.Count; i++)
for (int i = 0; i < escortIDs.Count; i++)
{
escortVisualData[keys[i]] = values[i];
escortDataByID[escortIDs[i]] = escortDataList[i];
}
}
Log.Message($"Loaded escort visual data: {escortDataByID.Count} entries");
}
else if (Scribe.mode == LoadSaveMode.PostLoadInit)
{
// 在PostLoadInit阶段重建视觉数据字典
RebuildEscortVisualData();
}
}
// 新增:重建伴飞视觉数据字典
private void RebuildEscortVisualData()
{
escortVisualData.Clear();
foreach (var escort in activeEscorts)
{
if (escort != null && !escort.Destroyed)
{
int escortID = GetEscortID(escort);
if (escortDataByID.TryGetValue(escortID, out var visualData))
{
// 恢复保存的视觉数据
escortVisualData[escort] = visualData;
// 重新设置伴飞的缩放
escort.escortScale = visualData.scale;
Log.Message($"Rebuilt visual data for escort {escortID}: scale={visualData.scale:F2}");
}
else
{
// 如果没有保存的数据,重新生成
var newVisualData = GenerateEscortVisualData();
escortVisualData[escort] = newVisualData;
escort.escortScale = newVisualData.scale;
Log.Message($"Regenerated visual data for escort {escortID}: scale={newVisualData.scale:F2}");
}
}
}
Log.Message($"Rebuilt escort visual data: {escortVisualData.Count} escorts");
}
// 公共方法:强制生成伴飞