using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System.IO;
using LitJson;
using System;
///
/// 断线重连管理
///
public class ReconnectMgr : SingletonMono
{
[HideInInspector]
public float recordDuration = -1;
private float recordCountdown = -1;
private TB_UserExamStat UserExamStat = new TB_UserExamStat();
private string localStatPath = "";
private string localStatFileName = "realtimeStat.json";
///
/// 初始化函数,记录时间间隔
///
public void Init( )
{
localStatPath = Application.streamingAssetsPath + "/" + localStatFileName;
//if (File.Exists( localStatPath ))//启动后检查有没有之前的遗留
//{
// File.Delete( localStatPath );
//}
}
ReconnectMgr()//构造函数
{
Init( );
}
///
/// 记录用户状态
///
public void RealtimeStatWriter()
{
//记录步骤相关各项信息
UserExamStat.schemeID = ProcessManager.Instance.schemeID;
//记录得分情况
ScoreBase scoreBase = FindFirstObjectByType();
UserExamStat.systemID = scoreBase.systemId;
UserExamStat.allSubScore.Clear();
if ( scoreBase != null )
{
foreach (var item in scoreBase.GetStepScore())
{
ReconnectSubScoreInfo sub = new ReconnectSubScoreInfo();
sub.index = item.Key;
sub.subProcessId = item.Value.subProcessId;
sub.currentScore = item.Value.currentScore;
sub.isDone = item.Value.isDone;
UserExamStat.allSubScore.Add( sub );
};
}
/*UserExamStat.processId = ProcessManager.Instance.processId;
UserExamStat.subProcessId = ProcessManager.Instance.subProcessId;
UserExamStat.subProcessStepId = ProcessManager.Instance.subProcessStepId;*/
//记录装备材料信息
UserExamStat.allToolAndMaterial.Clear();
Dictionary> toolAndMaterialDic = PacksackBagMgr.Instance.GetCurrentBagData();
foreach (var item in toolAndMaterialDic)
{
foreach (var itemInfo in item.Value)
{
UserExamStat.allToolAndMaterial.Add(((ItemInfo)itemInfo).toolName);
}
}
//记录已穿戴设备
UserExamStat.allWear.Clear();
Dictionary wearDic = PacksackBagMgr.Instance.wearDic;
foreach (var item in wearDic)
{
UserExamStat.allWear.Add(((ItemInfo)item.Value).toolName);
}
//获取当前所加载场景的名字
UserExamStat.sceneName = UnityEngine.SceneManagement.SceneManager.GetActiveScene().name;
//获取场景内(工具间)所有可以装备材料的物品
UserExamStat.currentSceneTools.Clear();
BaseToolOrDevice[] allThings = FindObjectsOfType();
foreach (BaseToolOrDevice item in allThings)
{
//Debug.Log(item.itemInfo.toolName);
ReconnectItemInfo rec = new ReconnectItemInfo();
rec.toolId = item.itemInfo.toolId;
rec.toolName = item.itemInfo.toolName;
rec.triggerID = item.itemInfo.triggerID;
//rec.toolOrDeviceOrMaterial = item.itemInfo.toolOrDeviceOrMaterial;
rec.selfPosInToolRoom = item.itemInfo.selfPosInToolRoom;
UserExamStat.currentSceneTools.Add(rec);
}
//获取场景内(现场)所有可以出发的装置
UserExamStat.currentSceneTriggers.Clear();
PermanentTriggerBase[] allPermanentTriggers = FindObjectsOfType();
foreach (PermanentTriggerBase item in allPermanentTriggers)
{
ReconnectTriggerInfo ret = new ReconnectTriggerInfo();
ret.triggerName = item.triggerName;
ret.triggerID = item.triggerID;
ret.selfPosInScene = item.transform.localPosition;
ret.selfRotInScene = item.transform.localEulerAngles;
UserExamStat.currentSceneTriggers.Add(ret);
}
//转换为JSON
string UserJson = JsonConvert.SerializeObject(UserExamStat, Formatting.Indented);
Debug.Log("自动保存成功");
File.WriteAllText(localStatPath, UserJson);
}
///
/// 读取用户状态(先使用同步,后用异步)
///
public bool RealtimeStatReader()
{
if (File.Exists(localStatPath))
{
try
{
StreamReader sr = new StreamReader(localStatPath);
string user_last_stat = sr.ReadToEnd();
sr.Close();
UserExamStat = JsonMapper.ToObject(user_last_stat);
return true;
}
catch (System.Exception e)
{
Debug.LogError(e.ToString());
return false;
}
}
else {
return false;
}
}
///
/// 恢复现场
///
public void RecoverScene()
{
//先恢复场景
ScenesManager.Instance.LoadSceneAsyn(UserExamStat.sceneName, () => {
//右侧工具栏切换
GameManager.EventMgr.EventTrigger(Enum_EventType.SwitchScene, GameManager.RunModelMgr.SceneType);
//恢复场景中各项装备
BaseToolOrDevice[] allThings = FindObjectsOfType();
foreach (BaseToolOrDevice item in allThings)
{
item.gameObject.SetActive(false);//先全部隐藏
foreach (ReconnectItemInfo rec in UserExamStat.currentSceneTools)
{
if (item.itemInfo.toolName.Equals(rec.toolName) && item.itemInfo.toolId == rec.toolId)
{
if (item.itemInfo.selfPosInToolRoom.Equals(rec.selfPosInToolRoom))
{
item.gameObject.SetActive(true);
break;
}
}
}
}
//恢复背包中的装备
List itemInPack = ToolAndmaterialMgr.Instance.CreateItemInfoByName(UserExamStat.allToolAndMaterial);
foreach (ItemInfo item in itemInPack)
{
PacksackBagMgr.Instance.AddOneToolOrMater(item);
}
//恢复已穿戴的装备
List itemWear = ToolAndmaterialMgr.Instance.CreateItemInfoByName(UserExamStat.allWear);
foreach (ItemInfo item in itemWear)
{
PacksackBagMgr.Instance.WearItemState(item, true);
}
//恢复场景内各个触发器状态
PermanentTriggerBase[] allPermanentTriggers = FindObjectsOfType();
List allReconTrigs = UserExamStat.currentSceneTriggers;
foreach (PermanentTriggerBase item in allPermanentTriggers)
{
item.gameObject.SetActive(false);
foreach (ReconnectTriggerInfo ret in allReconTrigs)
{
if (item.triggerName == ret.triggerName)
{
item.gameObject.SetActive(true);
item.transform.localPosition = ret.selfPosInScene;
item.transform.localEulerAngles = ret.selfRotInScene;
break;
}
}
}
});
}
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown(KeyCode.T))//测试用,按T读取状态保存
{
RealtimeStatWriter();
Debug.Log("当前场景:" + UserExamStat.sceneName);
}
else if(Input.GetKeyDown(KeyCode.Y))
{
RealtimeStatReader();
RecoverScene();
/*ProcessManager.Instance.HandoverProcess(UserExamStat.processId, UserExamStat.subProcessId, UserExamStat.subProcessStepId);
StepStateControl.instance.InvokeInitStepState(GameManager.Instance.systemId, GameManager.ProcessMgr.d_Scheme.id, UserExamStat.subProcessId);
GameManager.EventMgr.EventTrigger(Enum_EventType.SwitchSubProcess, UserExamStat.subProcessId);
GameManager.EventMgr.EventTrigger(Enum_EventType.SwitchSubProcessStepTriggerID, ProcessManager.Instance.subProcessStepTriggerID);*/
}
}
}