NewN_UAVPlane/Assets/Zion/Scripts/manage/LoadManage.cs

793 lines
30 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using System.Text;
using UnityEngine;
using UnityEngine.SceneManagement;
using System.Linq;
using System.Collections;
using DataModel.Model;
using System.Net.Sockets;
using System.Threading;
using System.Net;
using LitJson;
using TMPro;
using System.IO;
public class LoadManage : MonoBehaviour
{
public static LoadManage Instance;
/// <summary>
/// 系统模式
/// </summary>
public SystemMode systemMode;
/// <summary>
/// 本人账户信息
/// </summary>
[HideInInspector]
public User me;
/// <summary>
/// 当前训练 (进房间前赋值)
/// </summary>
[HideInInspector]
public practice currentPractice = null;
/// <summary>
/// 当前科目
/// </summary>
[HideInInspector]
public practicesubject currentPracticeSubejct = null;
/// <summary>
/// 当前岗位
/// </summary>
[HideInInspector]
public practiceseat currentPracticeSeat = null;
/// <summary>
/// 当前步骤
/// </summary>
[HideInInspector]
public practicesubjectstep currentPracticeSubjectStep = null;
/// <summary>
/// 本人在训练中所有岗位信息
/// </summary>
[HideInInspector]
public List<practiceseat> myPracticeSeat = new List<practiceseat>();
/// <summary>
/// 训练科目 (进房间前赋值)
/// </summary>
[HideInInspector]
public List<practicesubject> psubjects;
/// <summary>
/// 训练步骤
/// </summary>
[HideInInspector]
public List<practicesubjectstep> psteps;
/// <summary>
/// 训练岗位
/// </summary>
[HideInInspector]
public List<practiceseat> pseats;
/// <summary>
/// 音量大小
/// </summary>
[DisplayOnly]
public float SourceLiangValue;
/// <summary>
/// 音效大小
/// </summary>
[DisplayOnly]
public float SourceXiaoValue;
[HideInInspector]
public string MyId;
/// <summary>
/// 房间域 "1room"
/// </summary>
[DisplayOnly]
public string currentRoomArea;
/// <summary>
/// 同步Id
/// </summary>
[DisplayOnly]
public int SyncId;
/// <summary>
/// 训练状态
/// </summary>
public static ProgramState programState = ProgramState.;
/// <summary>
/// 是否暂停
/// </summary>
public static bool isPause;
/// <summary>
/// 与RoomServer通信
/// </summary>
[DisplayOnly]
public MyNetMQClient RSclient;
#region UDP
[HideInInspector]
public UdpClient udpClient;
bool udpRun;
int refreshTime = 0;
#endregion
/// <summary>
/// 人员
/// </summary>
public static List<sys_user> persons = new List<sys_user>();
private void Awake()
{
Instance = this;
DontDestroyOnLoad(gameObject);
//启动(测试用)
udpClient = new UdpClient(8889);
udpRun = true;
Thread thread = new Thread(UdpRecive);
thread.IsBackground = true;
thread.Start();
#if UNITY_EDITOR
UnityEngine.Debug.unityLogger.logEnabled = true;
#else
UnityEngine.Debug.unityLogger.logEnabled = false;
#endif
}
void Start()
{
//设置不休眠
Screen.sleepTimeout = SleepTimeout.NeverSleep;
List<string> tmps = File.ReadAllLines(Application.streamingAssetsPath + "/MainSetting.txt").ToList();
int porta, portb, portc;
IPAddress ipd;
tmps.ForEach(a =>
{
string[] data = a.Split('=');
if (a.Split('=')[0] == "协同交互服务UDP")
{
IPAddress.Parse(data[1].Split(':')[0]);
if (int.TryParse(data[1].Split(':')[1], out portb))
{
//MyNetMQClient.SyncServerIP = data[1];
MyNetMQClient.SyncServerIP = "192.168.0.103";
}
else
{
Debug.LogError("协同交互服务UDP配置错误");
}
}
});
GetAllUser();
}
private void Update()
{
if (refreshTime > 0)
{
//刷新房间列表
if (RoomListPanel.instance != null && UnityEngine.SceneManagement.SceneManager.GetActiveScene().name.Contains("MainSence"))
{
RoomListPanel.instance.Refresh();
refreshTime = 0;
}
}
}
private void UdpRecive()
{
while (udpRun)
{
try
{
IPEndPoint iPEndPoint = new IPEndPoint(IPAddress.Any, 0);
byte[] data = udpClient.Receive(ref iPEndPoint);
int type = BitConverter.ToInt32(data, 0);
if (type == 13)
{
if (LoadManage.programState == ProgramState.)
{
//开启房间成功
UnityEngine.Debug.Log("开启房间成功");
string practiceid = Encoding.UTF8.GetString(data, 4, data.Length - 4);
refreshTime++;
}
}
else if (type == 26)
{
if (LoadManage.programState == ProgramState.)
{
//开启二维软件失败
int length = BitConverter.ToInt32(data, 4);
string arg = Encoding.UTF8.GetString(data, 8, length);
string[] tmps = arg.Split(':');
SoftManage.Instance.ChangeSoftSubject(tmps[0], tmps[1], SoftManage.Instance.softName, tmps[2], tmps[3]);
}
}
}
catch
{
}
}
}
/// <summary>
/// 发送udp消息
/// </summary>
/// <param name="data"></param>
/// <param name="endPoint"></param>
public void UdpSend(byte[] data, IPEndPoint endPoint)
{
udpClient.Send(data, data.Length, endPoint);
}
/// <summary>
/// 获取所有本系统人员数据,导调角色,操作手
/// </summary>
private void GetAllUser()
{
//使用真实接口
//172.16.1.92:8087
//获取士兵
StartCoroutine(MyNetMQClient.CallGet("http://" + MyNetMQClient.userIP + ":8087/role?roleName=士兵", result1 =>
{
JsonData jd = JsonMapper.ToObject(result1);
if (jd["success"].ValueAsBoolean())
{
List<int> tmp = new List<int>();
foreach (JsonData item in jd["value"])
{
tmp.Add(int.Parse(item["roleId"].ToString()));
}
if (tmp.Count > 0)
{
string tmpjsonvalue = JsonMapper.ToJson(tmp);
//获取所有士兵user
StartCoroutine(MyNetMQClient.InvokeWebPostByUploadhandler("http://" + MyNetMQClient.userIP + ":8087/user/queryAllUsers", JsonMapper.ToJson(new { limit = 1000, roleDtoList = tmpjsonvalue }), (ok, result2) =>
{
if (ok)
{
JsonData jd2 = JsonMapper.ToObject(result2);
if (jd2["success"].ValueAsBoolean())
{
foreach (JsonData item in jd2["value"]["results"])
{
sys_user tmpUser = new sys_user();
//在这里取数据
tmpUser.user_name = item["userName"].ToString();
if (item["userCode"] != null)
tmpUser.user_code = item["userCode"].ToString();
tmpUser.user_id = int.Parse(item["userId"].ToString());
if (item["deptId"] != null)
tmpUser.dept_id = int.Parse(item["deptId"].ToString());
if (item["jobId"] != null)
tmpUser.job_id = int.Parse(item["jobId"].ToString());
if (item["nickName"] != null)
tmpUser.nickName = item["nickName"].ToString();
if (item["avatar"] != null)
tmpUser.avatar = item["avatar"].ToString();
if (item["certificateNumber"] != null)
tmpUser.introduce = item["certificateNumber"].ToString();
persons.Add(tmpUser);
}
//获取所有指挥员
StartCoroutine(MyNetMQClient.CallGet("http://" + MyNetMQClient.userIP + ":8087/role?roleName=指挥员", result3 =>
{
JsonData jd3 = JsonMapper.ToObject(result3);
if (jd3["success"].ValueAsBoolean())
{
List<int> tmp2 = new List<int>();
foreach (JsonData item in jd3["value"])
{
tmp2.Add(int.Parse(item["roleId"].ToString()));
}
if (tmp2.Count > 0)
{
string tmpjsonvalue2 = JsonMapper.ToJson(tmp2);
//获取所有指挥员user
StartCoroutine(MyNetMQClient.InvokeWebPostByUploadhandler("http://" + MyNetMQClient.userIP + ":8087/user/queryAllUsers", JsonMapper.ToJson(new { limit = 1000, roleDtoList = tmpjsonvalue2 }), (ok2, result4) =>
{
if (ok2)
{
JsonData jd4 = JsonMapper.ToObject(result4);
if (jd4["success"].ValueAsBoolean())
{
foreach (JsonData item in jd4["value"]["results"])
{
sys_user tmpUser = new sys_user();
//在这里取数据
tmpUser.user_name = item["userName"].ToString();
if (item["userCode"] != null)
tmpUser.user_code = item["userCode"].ToString();
tmpUser.user_id = int.Parse(item["userId"].ToString());
if (item["deptId"] != null)
tmpUser.dept_id = int.Parse(item["deptId"].ToString());
if (item["jobId"] != null)
tmpUser.job_id = int.Parse(item["jobId"].ToString());
if (item["nickName"] != null)
tmpUser.nickName = item["nickName"].ToString();
persons.Add(tmpUser);
}
Debug.Log("获取人员完成");
//获取考核配置
StartCoroutine(MyNetMQClient.CallGet("http://" + MyNetMQClient.CallIP + "/3DConfig/考核动作标题配置.xml", back =>
{
ScoreManage.SetXml(back);
Debug.Log("考核配置获取完成");
//跳转
if (systemMode == SystemMode.PC)
{
SceneManager.LoadScene("LoginSencePC");
}
else if (systemMode == SystemMode.MR)
{
SceneManager.LoadScene("LoginSenceMR");
}
}));
}
else
{
string msg = jd4["msg"].ToJson();
MessagePanel.ShowMessage(msg, GameObject.Find("Canvas").transform, null);
}
}
else
{
MessagePanel.ShowMessage(result4, GameObject.Find("Canvas").transform, null);
}
}));
}
}
else
{
string msg = jd3["msg"].ToJson();
MessagePanel.ShowMessage(msg, GameObject.Find("Canvas").transform, null);
}
}));
}
else
{
string msg = jd2["msg"].ToJson();
MessagePanel.ShowMessage(msg, GameObject.Find("Canvas").transform, null);
}
}
else
{
MessagePanel.ShowMessage(result2, GameObject.Find("Canvas").transform, null);
}
}));
}
}
else
{
string msg = jd["msg"].ToJson();
MessagePanel.ShowMessage(msg, GameObject.Find("Canvas").transform, null);
}
}));
}
/// <summary>
/// 创建与roomServer通信的客户端
/// </summary>
public void CreateRoomServerClient(string roomServerSubIP, string roomServerPubIP, string roomArea, int syncId)
{
if (RSclient == null)
{
//测试
//roomServerPubIP = "tcp://192.168.1.125:56987";
// roomServerSubIP = "tcp://192.168.1.125:56991";
RSclient = gameObject.AddComponent<MyNetMQClient>();
SyncId = syncId;
currentRoomArea = roomArea;
RSclient.Init(roomServerPubIP, roomServerSubIP, roomArea, ReciveFromRoomServerInThread, ReciveFromRoomServerInMono, "roomServer");
Debug.Log("开启roomServer:" + roomServerPubIP + "------" + roomServerSubIP + "-------" + roomArea);
}
}
public void RemoveRoomServerClient()
{
if (RSclient != null)
{
RSclient.Destroy();
// RSclient = null;
Debug.Log("RSclient置空");
}
}
/// <summary>
/// RoomServermono
/// </summary>
/// <param name="stS"></param>
private void ReciveFromRoomServerInThread(st_Motions stS)
{
//同步域
if (programState == ProgramState.)
{
if (stS.m_iOperaType == 10006)
{
//单值同步
int syncid = BitConverter.ToInt32(stS.m_sOperaData, 0);
if (LoadManage.Instance.SyncId != syncid)
{
int legth = BitConverter.ToInt32(stS.m_sOperaData, 4);
string id = Encoding.UTF8.GetString(stS.m_sOperaData, 8, legth);
if (OneValueSyncObject.OneAxisSyncObjectList.ContainsKey(id))
{
if (stS.m_sOperaData[9 + legth] == 0)
{
//无回调
OneValueSyncObject.OneAxisSyncObjectList[id].SetValue(8 + legth, stS.m_sOperaData);
}
else
{
//有回调
RSclient._netMqListener.AddToMono(stS);
}
}
}
}
else if (stS.m_iOperaType == 10007)
{
//坐标角度同步
int syncid = BitConverter.ToInt32(stS.m_sOperaData, 0);
if (LoadManage.Instance.SyncId != syncid)
{
int legth = BitConverter.ToInt32(stS.m_sOperaData, 4);
string id = Encoding.UTF8.GetString(stS.m_sOperaData, 8, legth);
if (FunctionSync_PositionRoate.positionRoateSyncObejctList.ContainsKey(id))
{
FunctionSync_PositionRoate.positionRoateSyncObejctList[id].SetValue(8 + legth, stS.m_sOperaData);
}
}
}
else if (stS.m_iOperaType == 61)
{
//心跳检测
//XinTiaoCheck();
}
else
{
RSclient._netMqListener.AddToMono(stS);
}
}
}
/// <summary>
/// RoomServermono
/// </summary>
/// <param name="data"></param>
public void ReciveFromRoomServerInMono(st_Motions data)
{
#if !UNITY_EDITOR
try
{
#endif
switch (data.m_iOperaType)
{
case 16:
{
//结束房间
if (GameManage.Instance != null)
{
GameManage.Instance.action_close.Invoke();
}
}
break;
case 25:
{
//二维通信2维-->3维
int length = BitConverter.ToInt32(data.m_sOperaData, 0);
string msg = Encoding.UTF8.GetString(data.m_sOperaData, 4, length);
MessageModel messageModel = JsonMapper.ToObject<MessageModel>(msg);
if (SoftManage.Instance != null)
{
SoftManage.Instance.SoftHandle(messageModel);
}
}
break;
case 31:
{
//开始暂停
int length = BitConverter.ToInt32(data.m_sOperaData, 0);
string practiceid = Encoding.UTF8.GetString(data.m_sOperaData, 4, length);
isPause = (data.m_sOperaData[4 + length] == 1 ? false : true);
if (GameManage.Instance.action_Pause != null)
{
GameManage.Instance.action_Pause.Invoke(isPause);
}
}
break;
case 33://得到房间所有数据
if (programState == ProgramState.)
{
GetRoomData(data.m_sOperaData);
}
break;
case 41:
{
//科目启停
int length = BitConverter.ToInt32(data.m_sOperaData, 0);
string msg = Encoding.UTF8.GetString(data.m_sOperaData, 4, length);
if (GameManage.Instance != null)
{
GameManage.Instance.SubjectChange(msg);
}
}
break;
case 51:
{
//步骤启停
int length = BitConverter.ToInt32(data.m_sOperaData, 0);
string msg = Encoding.UTF8.GetString(data.m_sOperaData, 4, length);
if (GameManage.Instance != null)
{
GameManage.Instance.StepChange(msg);
}
}
break;
case 1000://测试
break;
case 10006://单值同步
if (programState == ProgramState.)
{
int legth = BitConverter.ToInt32(data.m_sOperaData, 4);
string id = Encoding.UTF8.GetString(data.m_sOperaData, 8, legth);
OneValueSyncObject.OneAxisSyncObjectList[id].SetValue(8 + legth, data.m_sOperaData);
OneValueSyncObject.OneAxisSyncObjectList[id].callbackInmono.Invoke(id, false);
}
break;
case 10008://生成物体
if (programState == ProgramState.)
{
int syncId = BitConverter.ToInt32(data.m_sOperaData, 0);
if (LoadManage.Instance.SyncId != syncId)
{
if (FunctionSync_CreateObejct.Instance != null)
{
FunctionSync_CreateObejct.Instance.CallBack(data.m_sOperaData);
}
}
}
break;
case 10010:
if (programState == ProgramState.)
{
//自己也要执行
int legth = BitConverter.ToInt32(data.m_sOperaData, 0);
string id = Encoding.UTF8.GetString(data.m_sOperaData, 4, legth);
if (FunctionSync_Media.functionSync_MediaDic.ContainsKey(id))
{
FunctionSync_Media.functionSync_MediaDic[id].CallBack(data.m_sOperaData);
}
}
break;
}
#if !UNITY_EDITOR
}
catch (Exception e)
{
Debug.LogError(e.Message);
}
#endif
}
public void GetRoomData(byte[] data)
{
//索引
int index = 0;
//暂停
isPause = (data[0] == 1 ? true : false);
index++;
Debug.Log(isPause ? "暂停" : "开始");
if (GameManage.Instance.action_Pause != null)
{
GameManage.Instance.action_Pause.Invoke(isPause);
}
//打分
int countScore = BitConverter.ToInt32(data, index);
index += 4;
for (int i = 0; i < countScore; i++)
{
//取数据
int tmpnum = BitConverter.ToInt32(data, index);
index += 4;
byte[] tmp = new byte[tmpnum];
Array.Copy(data, index, tmp, 0, tmpnum);
index += tmpnum;
//解析
HandleScore(Encoding.UTF8.GetString(tmp));
}
//10008生成
int countCreate = BitConverter.ToInt32(data, index);
index += 4;
for (int i = 0; i < countCreate; i++)
{
//取数据
int tmpnum = BitConverter.ToInt32(data, index);
index += 4;
byte[] tmp = new byte[tmpnum];
Array.Copy(data, index, tmp, 0, tmpnum);
index += tmpnum;
//解析
FunctionSync_CreateObejct.Instance.CallBack(tmp);
}
//10006单值
int couOneValue = BitConverter.ToInt32(data, index);
index += 4;
for (int i = 0; i < couOneValue; i++)
{
//取数据
int tmpnum = BitConverter.ToInt32(data, index);
index += 4;
byte[] tmp = new byte[tmpnum];
Array.Copy(data, index, tmp, 0, tmpnum);
index += tmpnum;
//解析
int legth = BitConverter.ToInt32(tmp, 4);
string id = Encoding.UTF8.GetString(tmp, 8, legth);
if (OneValueSyncObject.OneAxisSyncObjectList.ContainsKey(id))
{
OneValueSyncObject.OneAxisSyncObjectList[id].SetValue(8 + legth, tmp);
if (tmp[9 + legth] == 1)
{
OneValueSyncObject.OneAxisSyncObjectList[id].callbackInmono.Invoke(id, true);
}
}
else
{
Debug.LogError("不存在此物体:" + id);
}
}
//10007坐标旋转
int countPosRot = BitConverter.ToInt32(data, index);
index += 4;
for (int i = 0; i < countPosRot; i++)
{
//取数据
int tmpnum = BitConverter.ToInt32(data, index);
index += 4;
byte[] tmp = new byte[tmpnum];
Array.Copy(data, index, tmp, 0, tmpnum);
index += tmpnum;
//解析
int legth = BitConverter.ToInt32(tmp, 4);
string id = Encoding.UTF8.GetString(tmp, 8, legth);
if (FunctionSync_PositionRoate.positionRoateSyncObejctList.ContainsKey(id))
{
FunctionSync_PositionRoate.positionRoateSyncObejctList[id].SetValue(8 + legth, tmp);
}
}
Debug.Log("数据已恢复");
}
private void HandleScore(string str)
{
var ys = str.Split('|');
if (ys[0] == "评估点")
{
//评估点 | 科目物体名称 | 评估点序号 | 当前index
ScoreBase sb = GameManage.Instance.scoreManage.transform.Find(ys[1]).GetComponentsInChildren<ScoreBase>(true).ToList().Find(a => a.code.ToString() == ys[2]);
sb.IsRight = true;
sb.Completed = int.Parse(ys[3]);
}
else if (ys[1] == "操作点")
{
//操作点 | 科目物体名称 | 评估点序号 | 操作点物体名称 | index
ScoreJudge_FixedValue tmp = GameManage.Instance.scoreManage.transform.Find(ys[1]).GetComponentsInChildren<ScoreBase>(true).ToList().Find(a => a.code.ToString() == ys[2]).transform.Find(ys[3]).GetComponent<ScoreJudge_FixedValue>();
tmp.Isright = true;
tmp.index = int.Parse(ys[4]);
}
Debug.Log("打分恢复:" + str);
}
/// <summary>
/// 心跳检测响应
/// </summary>
public void XinTiaoCheck()
{
if (programState == ProgramState. && LoadManage.Instance != null && !string.IsNullOrEmpty(LoadManage.Instance.MyId) && !string.IsNullOrEmpty(LoadManage.Instance.currentRoomArea))
{
if (GameManage.Instance != null)
{
UnityEngine.Debug.Log("重置6秒");
GameManage.Instance.checkTime = 6;
}
byte[] tmp = Encoding.UTF8.GetBytes(LoadManage.Instance.MyId);
byte[] data = new byte[4 + tmp.Length];
Array.Copy(BitConverter.GetBytes(tmp.Length), 0, data, 0, 4);
Array.Copy(tmp, 0, data, 4, tmp.Length);
RSclient.Send(LoadManage.Instance.currentRoomArea, 6, data);
Debug.Log("心跳" + LoadManage.Instance.currentRoomArea);
}
}
//public void StartRoom(string roomid)
//{
// byte[] roomidbytes = Encoding.UTF8.GetBytes(roomid);
// byte[] tmp = new byte[4 + roomidbytes.Length];
// Array.Copy(BitConverter.GetBytes(roomidbytes.Length), 0, tmp, 0, 4);
// Array.Copy(roomidbytes, 0, tmp, 4, roomidbytes.Length);
// MSclient.Send("mainServer", 100, tmp);
// Debug.Log("启动房间:" + roomidbytes);
//}
//public void CloseRoom(string roomId, string pcArea, string roomArea)
//{
// //string roomId = "abcdasdadasd";
// byte[] roomidbytes = Encoding.UTF8.GetBytes(roomId);
// //string pcArea = "pcserver125";
// byte[] pcbytes = Encoding.UTF8.GetBytes(pcArea);
// //string roomArea = "room1";
// byte[] roombytes = Encoding.UTF8.GetBytes(roomArea);
// byte[] tmp = new byte[12 + roomidbytes.Length + pcbytes.Length + roombytes.Length];
// Array.Copy(BitConverter.GetBytes(roomidbytes.Length), 0, tmp, 0, 4);
// Array.Copy(roomidbytes, 0, tmp, 4, roomidbytes.Length);
// Array.Copy(BitConverter.GetBytes(pcbytes.Length), 0, tmp, 4 + roomidbytes.Length, 4);
// Array.Copy(pcbytes, 0, tmp, 8 + roomidbytes.Length, pcbytes.Length);
// Array.Copy(BitConverter.GetBytes(roombytes.Length), 0, tmp, 8 + roomidbytes.Length + pcbytes.Length, 4);
// Array.Copy(roombytes, 0, tmp, 12 + roomidbytes.Length + pcbytes.Length, roombytes.Length);
// MSclient.Send("mainServer", 110, tmp);
// Debug.Log("关闭房间:" + roomId);
//}
private void OnDestroy()
{
Debug.Log("OnDestroy");
udpRun = false;
if (RSclient != null)
{
RSclient.Destroy();
}
if (udpClient != null)
{
udpClient.Close();
}
}
}
public enum SystemMode
{
PC,
MR
}