using System; using System.Collections.Generic; using Cielonos.MainGame; using Cielonos.MainGame.Inventory; using UnityEngine; namespace Cielonos.MainGame.Characters { public partial class PlayerInventorySubcontroller { /// /// 将当前玩家的整个背包与装备槽位状态打包生成 SaveData。 /// public PlayerInventorySaveData GetSaveData() { var data = new PlayerInventorySaveData(); // 1. 保存背包中的所有主武器 foreach (var weapon in backpackSm.mainWeapons) { if (weapon != null) { data.mainWeapons.Add(CreateSaveDataFromItem(weapon)); } } // 2. 保存快速切换(Prepared)列表中的主武器 foreach (var weapon in equipmentSm.preparedMainWeapons) { if (weapon != null) { data.preparedMainWeapons.Add(CreateSaveDataFromItem(weapon)); } } // 3. 保存当前手持的主武器 if (equipmentSm.currentMainWeapon != null) { data.currentMainWeapon = CreateSaveDataFromItem(equipmentSm.currentMainWeapon); } // 4. 保存背包中所有的辅助装备 foreach (var support in backpackSm.supportEquipments) { if (support != null) { data.supportEquipments.Add(CreateSaveDataFromItem(support)); } } // 5. 保存装备槽(0~3)中穿戴的辅助装备 for (int i = 0; i < equipmentSm.currentSupportEquipments.Count; i++) { var slotSupport = equipmentSm.currentSupportEquipments[i]; if (slotSupport != null) { data.currentSupportEquipments.Add(CreateSaveDataFromItem(slotSupport)); } else { data.currentSupportEquipments.Add(null); } } // 6. 保存背包中的所有被动装备 foreach (var passive in backpackSm.passiveEquipments) { if (passive != null) { data.passiveEquipments.Add(CreateSaveDataFromItem(passive)); } } // 7. 保存背包中的所有消耗品 foreach (var consumable in backpackSm.consumables) { if (consumable != null) { data.consumables.Add(CreateSaveDataFromItem(consumable)); } } return data; } /// /// 根据保存的 SaveData,一键还原玩家的背包和当前装备槽位。 /// public void ApplySaveData(PlayerInventorySaveData data) { if (data == null) return; // 1. 彻底清理默认装配的武器与背包实体,防止状态和逻辑堆叠 ClearInventory(); // 2. 第一阶段:生成所有背包内的主武器 var restoredWeaponsDict = new Dictionary(); foreach (var weaponData in data.mainWeapons) { if (weaponData == null) continue; MainWeaponBase weaponInstance = weaponData.RestoreItem() as MainWeaponBase; if (weaponInstance != null) { restoredWeaponsDict[weaponData.itemClass] = weaponInstance; } } if (data.preparedMainWeapons is { Count: > 0 }) { // 3. 第二阶段:将指定的主武器加入备用快速切换(Prepare)列表 foreach (var prepData in data.preparedMainWeapons) { if (prepData != null && restoredWeaponsDict.TryGetValue(prepData.itemClass, out var prepWeapon)) { equipmentSm.PrepareMainWeapon(prepWeapon); } } } else if(data.mainWeapons.Count > 0) { // 兜底:如果存档中没有记录 Prepare 列表,默认将背包中的第一把武器加入 Prepare 列表 var firstWeapon = restoredWeaponsDict[data.mainWeapons[0].itemClass]; equipmentSm.PrepareMainWeapon(firstWeapon); } // 4. 第三阶段:装备当前手持激活的主武器 if (data.currentMainWeapon != null && restoredWeaponsDict.TryGetValue(data.currentMainWeapon.itemClass, out var activeWeapon)) { equipmentSm.EquipMainWeapon(activeWeapon); } else if (equipmentSm.preparedMainWeapons.Count > 0) { // 兜底:如果存档中没有记录当前手持,默认装备切换列表中的第一把武器 equipmentSm.EquipMainWeapon(equipmentSm.preparedMainWeapons[0]); } // 5. 第一阶段:生成所有背包内的辅助装备 var restoredSupportDict = new Dictionary(); foreach (var supportData in data.supportEquipments) { if (supportData == null) continue; SupportEquipmentBase supportInstance = supportData.RestoreItem() as SupportEquipmentBase; if (supportInstance != null) { restoredSupportDict[supportData.itemClass] = supportInstance; } } // 6. 第二阶段:将对应的辅助装备装配到指定的槽位 (0 ~ 3) for (int i = 0; i < data.currentSupportEquipments.Count; i++) { var slotData = data.currentSupportEquipments[i]; if (slotData != null && restoredSupportDict.TryGetValue(slotData.itemClass, out var supportInstance)) { equipmentSm.EquipSupportEquipment(supportInstance, i); } } // 7. 还原背包内的被动装备 foreach (var passiveData in data.passiveEquipments) { if (passiveData != null) { passiveData.RestoreItem(); } } // 8. 还原背包内的消耗品 foreach (var consumableData in data.consumables) { if (consumableData != null) { consumableData.RestoreItem(); } } Debug.Log("[SaveSystem] 背包与全部槽位配置还原成功!"); } } }