2
This commit is contained in:
@@ -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");
|
||||
}
|
||||
|
||||
// 公共方法:强制生成伴飞
|
||||
|
||||
Reference in New Issue
Block a user