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;
///
/// 系统模式
///
public SystemMode systemMode;
///
/// 本人账户信息
///
[HideInInspector]
public User me;
///
/// 当前训练 (进房间前赋值)
///
[HideInInspector]
public practice currentPractice = null;
///
/// 当前科目
///
[HideInInspector]
public practicesubject currentPracticeSubejct = null;
///
/// 当前岗位
///
[HideInInspector]
public practiceseat currentPracticeSeat = null;
///
/// 当前步骤
///
[HideInInspector]
public practicesubjectstep currentPracticeSubjectStep = null;
///
/// 本人在训练中所有岗位信息
///
[HideInInspector]
public List myPracticeSeat = new List();
///
/// 训练科目 (进房间前赋值)
///
[HideInInspector]
public List psubjects;
///
/// 训练步骤
///
[HideInInspector]
public List psteps;
///
/// 训练岗位
///
[HideInInspector]
public List pseats;
///
/// 音量大小
///
[DisplayOnly]
public float SourceLiangValue;
///
/// 音效大小
///
[DisplayOnly]
public float SourceXiaoValue;
[HideInInspector]
public string MyId;
///
/// 房间域 "1room"
///
[DisplayOnly]
public string currentRoomArea;
///
/// 同步Id
///
[DisplayOnly]
public int SyncId;
///
/// 训练状态
///
public static ProgramState programState = ProgramState.结束;
///
/// 是否暂停
///
public static bool isPause;
///
/// 与RoomServer通信
///
[DisplayOnly]
public MyNetMQClient RSclient;
#region UDP
[HideInInspector]
public UdpClient udpClient;
bool udpRun;
int refreshTime = 0;
#endregion
///
/// 人员
///
public static List persons = new List();
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 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
{
}
}
}
///
/// 发送udp消息
///
///
///
public void UdpSend(byte[] data, IPEndPoint endPoint)
{
udpClient.Send(data, data.Length, endPoint);
}
///
/// 获取所有本系统人员数据,导调角色,操作手
///
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 tmp = new List();
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 tmp2 = new List();
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);
}
}));
}
///
/// 创建与roomServer通信的客户端
///
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();
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置空");
}
}
///
/// RoomServer,mono
///
///
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);
}
}
}
///
/// RoomServer,mono
///
///
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(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(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(true).ToList().Find(a => a.code.ToString() == ys[2]).transform.Find(ys[3]).GetComponent();
tmp.Isright = true;
tmp.index = int.Parse(ys[4]);
}
Debug.Log("打分恢复:" + str);
}
///
/// 心跳检测响应
///
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
}