using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Mirror;
using LitJson;
using System;
using UnityCommon;
namespace DTYJ
{
///
/// 网络动画播放器
///
public class NetworkAnimPlayer : NetworkBehaviour
{
public static NetworkAnimPlayer instance;
private void Awake()
{
instance = this;
}
///
/// 普通一次性动画 电梯上下行、紧急停车按钮动画等
///
///
///
[Command(requiresAuthority = false)]
public void CmdPlayAnim(string path, string animName)
{
RPCPlayAnim(path, animName);
}
[ClientRpc]
public void RPCPlayAnim(string path, string animName)
{
var anim = GameObject.Find(path).GetComponent();
anim.Play(string.IsNullOrEmpty(animName) ? anim.name : animName);
}
#region 普通门的动画
///
/// 记录门开关状态 string 动画路径 bool true - 开
///
private Dictionary dicNormalAnimSwitch = new Dictionary();
///
/// 普通开关动画 如:门等
///
///
///
[Command(requiresAuthority = false)]
public void CmdPlayAnimNormalSwitch(string path_animName)
{
if (dicNormalAnimSwitch.ContainsKey(path_animName))
dicNormalAnimSwitch[path_animName] = !dicNormalAnimSwitch[path_animName];
else
dicNormalAnimSwitch[path_animName] = true;
RpcPlayAnimNormalSwitch(path_animName, dicNormalAnimSwitch[path_animName]);
}
[ClientRpc]
public void RpcPlayAnimNormalSwitch(string path_animName, bool isOpen)
{
Debug.Log(path_animName + isOpen);
var arr = path_animName.Split('|');
var anim = GameObject.Find(arr[0]).GetComponent();
var animationName = arr[1];
Debug.Log(anim);
Debug.Log("animationName:" + animationName);
Debug.Log(anim.clip.name);
anim[animationName].time = isOpen ? 0 : anim[animationName].length;
anim[animationName].speed = isOpen ? 1 : -1;
anim[animationName].wrapMode = WrapMode.Once;
anim.CrossFade(animationName);
}
[TargetRpc]
public void RpcPlayAnimNormalSwitch_conn(NetworkConnection target, string path_animName, bool isOpen)
{
var arr = path_animName.Split('|');
var anim = GameObject.Find(arr[0]).GetComponent();
var animationName = arr[1];
anim[animationName].time = isOpen ? 0 : anim[animationName].length;
anim[animationName].speed = isOpen ? 1 : -1;
anim[animationName].wrapMode = WrapMode.Once;
anim.CrossFade(animationName);
}
///
/// 同步门动画状态
///
[Server]
public void AsyncPlayAnimNormalSwitch(NetworkConnection target)
{
foreach (var item in dicNormalAnimSwitch)
{
RpcPlayAnimNormalSwitch_conn(target, item.Key, item.Value);
}
}
#endregion
#region 设置设备状态
public void SendCmdToServer(int cmd, object obj)
{
var cmdData = new { cmd = cmd, data = obj };
CmdSendCmdToServer(Newtonsoft.Json.JsonConvert.SerializeObject(cmdData));
}
///
/// 发送命令到协同服务器
///
///
[Command(requiresAuthority = false)]
public void CmdSendCmdToServer(string json)
{
Debug.Log("发送消息到协同服务器:" + json);
try
{
//CMDData cMDData = new CMDData();
//cMDData.cmd = cmd;
//cMDData.data = JsonMapper.ToObject(jsonData);
//var json = JsonMapper.ToJson(cMDData);
OnlineCtrl.Instance.SendCmdToServer(json);
}
catch (Exception e)
{
Debug.LogError(e.Message);
}
}
//[Command(requiresAuthority = false)]
//public void CmdSetEquipState(string equipType, int state_0, int state_2)
//{
// RpcSetEquipState(equipType, state_0, state_2);
//}
//[ClientRpc]
//public void RpcSetEquipState(string equipType, int state_0, int state_2)
//{
//}
#endregion
#region 消息处理
[Server]
public void OnMsgReceived2(int cmd, JsonData obj)
{
string jsonStr = obj.ToJson();
switch (cmd)
{
case 10101:
TrainHandle(jsonStr);
break;
case 10105:
TrainDoorHandle(jsonStr);
break;
case 10201:
AFCGateMachine(jsonStr);
break;
case 10202:
AFCTVM(jsonStr);
break;
case 10301:
PlatformDoorClose(jsonStr);
break;
case 10302:
PlatformDoorCtrl(jsonStr);
break;
case 10401:
VerticalElevator(jsonStr);
break;
case 10402:
Elevator(jsonStr);
break;
case 10501:
KeLiu(jsonStr);
break;
case 10601:
ShuiZai(jsonStr);
break;
default:
break;
}
}
//[Server]
//public void OnMsgReceived(CMDData cmdData)
//{
//switch (cmdData.cmd)
//{
// case 10101:
// TrainHandle(cmdData);
// break;
// case 10201:
// AFCGateMachine(cmdData);
// break;
// case 10202:
// AFCTVM(cmdData);
// break;
// case 10301:
// PlatformDoorClose(cmdData);
// break;
// case 10302:
// PlatformDoorCtrl(cmdData);
// break;
// case 10401:
// VerticalElevator(cmdData);
// break;
// case 10402:
// Elevator(cmdData);
// break;
// default:
// break;
//}
//}
#region 列车控制
readonly Dictionary dicTrains = new Dictionary();
public void TrainHandle(string jsonData)
{
var trainInfo = JsonMapper.ToObject(jsonData);
//var trainInfo = cmdData.GetData();
if (dicTrains.ContainsKey(trainInfo.trainNo))
dicTrains[trainInfo.trainNo].MsgHandle(trainInfo);
else
{
var prefabTrain = OnlineNetworkManager.singleton.spawnPrefabs[2];
GameObject train = GameObject.Instantiate(prefabTrain);
train.transform.position = Vector3.up * 1000 * dicTrains.Count;
train.name = trainInfo.trainNo;
NetworkServer.Spawn(train);
//train.transform.position = Vector3.up * 1000 * dicTrains.Count;
//train.name = trainInfo.trainNo;
dicTrains[trainInfo.trainNo] = train.GetComponent();
dicTrains[trainInfo.trainNo].RpcSetName(trainInfo.trainNo);
}
}
public void TrainDoorHandle(string jsonData)
{
TrainDoorState trainDoorState = JsonMapper.ToObject(jsonData);
RpcSetTrainDoor(trainDoorState.trainNo, trainDoorState.state);
if (trainDoorState.state == 1)
{
if (TrainCtrl.trainStop_xiaxing == trainDoorState.trainNo)
{
OnlineCtrl.Instance.chengKeCtrl.ShangChe(2);
OnlineCtrl.Instance.chengKeCtrl.XiaChe(trainDoorState.trainNo);
}
if (TrainCtrl.trainStop_shangxing == trainDoorState.trainNo)
{
OnlineCtrl.Instance.chengKeCtrl.ShangChe(1);
OnlineCtrl.Instance.chengKeCtrl.XiaChe(trainDoorState.trainNo);
}
}
}
[ClientRpc]
public void RpcSetTrainDoor(string trainNo, int doorState)
{
if (TrainCtrl.TrainCtrlDic.ContainsKey(trainNo))
TrainCtrl.TrainCtrlDic[trainNo].TrainDoor(doorState);
}
#endregion
///
/// 闸机控制
///
///
public void AFCGateMachine(string jsonStr)
{
AFCZhaJi data = JsonMapper.ToObject(jsonStr);
RpcAFCGateMachine(data.gateMachineNo, data.state, data.direction);
}
[ClientRpc]
public void RpcAFCGateMachine(string gateMachineNo, int state, int dir)
{
ZhaJiCtrl.Instance.SetGateState(gateMachineNo, state, dir);
}
public void AFCTVM(string jsonStr)
{
AFCTVM data = JsonMapper.ToObject(jsonStr);
RpcAFCTVM(data.tvmNo, data.state);
}
[ClientRpc]
public void RpcAFCTVM(string tvmNo, int state)
{
TvmCtrl.Instance.SetTVM(tvmNo, state);
}
public void PlatformDoorClose(string jsonStr)
{
ZhanTaiMenSuoBi data = JsonMapper.ToObject(jsonStr);
RpcPlatformDoorCtrl(data.platformDoorNo, data.state);
}
///
/// 单活动门控制状态
///
///
public void PlatformDoorCtrl(string jsonStr)
{
//ZhanTaiMenKongZhi data = JsonMapper.ToObject(jsonStr);
//RpcPlatformDoorCtrl(data.platformDoorNo, data.state);
}
[ClientRpc]
public void RpcPlatformDoorCtrl(string platformDoorNo, int state)
{
PlatformDoorController.Instance.SetDoor(platformDoorNo, state);
}
public void VerticalElevator(string jsonStr) { }
public void Elevator(string jsonStr)
{
DianFuTi data = JsonMapper.ToObject(jsonStr);
RpcElevator(data.elevatorNo, data.state);
}
[ClientRpc]
public void RpcElevator(string nnumber, int state)
{
DianFuTiCtrl.Instance.SetState(nnumber, state);
}
public void KeLiu(string jsonStr)
{
KeLiuData data = JsonMapper.ToObject(jsonStr);
ControllerPanel.instance?.CmdSetJinZhanSpeed((int)data.speedOfEntry);
}
private void ShuiZai(string jsonStr)
{
ShuiZaiData data = JsonMapper.ToObject(jsonStr);
ControllerPanel.instance?.CmdSetShuiZai(data.isTurnOn, (float)data.strength);
}
#endregion
}
}