using Assets.Scenes.Ride.Scripts; using Assets.Scripts; using Assets.Scripts.Apis.Models; using System; using System.Linq; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; using UnityEngine.UI; using Assets.Scenes.Ride.Scripts.Model; public class GameRoomDetailController : PFUIPanel { public RawImage Avatar; public Text idText; public Text roomName; public Text routeName; public Text distanceText; public Text eleText; public Text slopeText; public Text rideText; public RawImage altitudeGraph; public GameObject bestTab; public Text bestTabName; public Text bestTabTimer; public RawImage bestTabHead; public GameObject readyBtn; public GameObject startBtn; public GameObject quitBtn; public GameObject cancelBtn; public GameObject d2; public GameObject d3; public GameObject ar; public GameRoomModel GameRoom { get; set; } public DateTime? StartTime { get; set; } public int Status { get; set; } protected override void Start() { base.Start(); UIManager.AddBackHandler((e) => { MapUDPService.SendGameRoomKick(GameRoom.RoomId,App.CurrentUser.Id,App.CurrentUser.Id); App.gameRoomDetail = null; }); transform.Find("MainNav").GetComponent().ShowBack(); Utils.DisplayHead(Avatar, App.CurrentUser.WxHeadImg); UIManager.AddEvent(startBtn, UnityEngine.EventSystems.EventTriggerType.PointerClick, (e) => { var list = GameRoom.RoomPlayerList; var notReady = list.Where(c => c.Status == 0 && c.IsOwner == false).Any(); if (notReady) { Utils.showToast(gameObject, App.GetLocalString("have to wait for all ready!")); } else { MapUDPService.SendGameRoomStartTime(App.gameRoomDetail.RoomId, App.CurrentUser.Id); } }); //准备 UIManager.AddEvent(readyBtn, UnityEngine.EventSystems.EventTriggerType.PointerClick, (e) => { Status = 1; readyBtn.SetActive(false); cancelBtn.SetActive(true); MapUDPService.SendGameRoomReadyStatus(App.gameRoomDetail.RoomId, App.CurrentUser.Id, Status); }); //取消准备 UIManager.AddEvent(cancelBtn, UnityEngine.EventSystems.EventTriggerType.PointerClick, (e) => { Status = 0; readyBtn.SetActive(true); cancelBtn.SetActive(false); MapUDPService.SendGameRoomReadyStatus(App.gameRoomDetail.RoomId, App.CurrentUser.Id, Status); }); //退出 UIManager.AddEvent(quitBtn, UnityEngine.EventSystems.EventTriggerType.PointerClick, (e) => { App.gameRoomDetail = null; MapUDPService.SendGameRoomKick(GameRoom.RoomId, App.CurrentUser.Id, App.CurrentUser.Id); UIManager.ShowGameRoomListPanel(); }); } public override void Show() { base.Show(); Init(); } private bool DataSourceChanged { get; set; } private void ListenerHandler(List message) { try { var detail = message.FirstOrDefault(); if (detail != null) { if (detail.RoomList != null) { GameRoom = detail.RoomList.Where(c => c.RoomId == GameRoom.RoomId).FirstOrDefault(); DataSourceChanged = true; } } } catch (Exception e) { } } float timer = 0f; private void Update() { TcpHandler(); timer -= Time.deltaTime; while (timer < 0) { timer += 1f; } } private void Init() { App.Model = "GameRoom"; MapUDPService.MessageListener = ListenerHandler; GameRoom = App.gameRoomDetail; var enable2d = !GameRoom.Enable3D && !GameRoom.EnableAR; var enable3d = GameRoom.Enable3D && !GameRoom.EnableAR; d2.SetActive(enable2d); d3.SetActive(enable3d); ar.SetActive(GameRoom.EnableAR); DataSourceChanged = true; MapUDPService.SendQueryGameRoomList(App.CurrentUser.Id, 0, 1, GameRoom.RoomId.ToString()); readyBtn.SetActive(true); cancelBtn.SetActive(false); startBtn.SetActive(false); idText.text = GameRoom.RoomId.ToString().PadLeft(7, '0'); roomName.text = GameRoom.Name; routeName.text = GameRoom.MapRouteName; distanceText.text = $"{Math.Round(GameRoom.Distance, 1)}KM"; eleText.text = $"{Math.Round(GameRoom.TotalClimb, 0)}M"; slopeText.text = $"{Math.Round(GameRoom.AverageGrade, 1)}%"; //查询某线路最佳 var result = ConfigHelper.mapApi.GetMapBestInfo(GameRoom.MapRouteId); if (result.result && !string.IsNullOrEmpty(result.data.BestNickName)) { bestTab.SetActive(true); bestTabName.text = result.data.BestNickName; bestTabTimer.text = result.data.BestTotalTime; Utils.DisplayHead(bestTabHead, result.data.BestWxHeadImg); } Utils.DisplayHead(altitudeGraph, GameRoom.AltitudeGraph); var playerList = FindObjectsOfType(); foreach (var item in playerList) { if (GameRoom.MaxMembers - item.sort < 0) { item.NotInUse(); } else { item.ShowInviteModal(); } } } private void TcpHandler() { if (DataSourceChanged) { var playerList = FindObjectsOfType(); var list = GameRoom.RoomPlayerList; //自己 var mine = list.Where(c => c.UserId == App.CurrentUser.Id).FirstOrDefault(); if (mine != null) { //是否是房主 var owner = mine.IsOwner; readyBtn.SetActive(!owner); startBtn.SetActive(owner); } //新增/更新 foreach (var item in list) { var userName =item.Name; var headurl = item.WxHeadImage; var ftp = item.FTP; var weight = item.Weight; var sex = item.Sex; var current = playerList.Where(c => c.UserId == item.UserId).FirstOrDefault(); if (current == null) { var s = playerList.Where(c => c.UserId == 0 && c.NotUse == false).OrderBy(c => c.sort).FirstOrDefault(); if (s != null) { s.Init(item.UserId, userName, headurl, weight, ftp, item.IsOwner, item.Status,sex); } } else { current.UpdatePlayer(item.UserId, userName, headurl, weight, ftp, item.IsOwner, item.Status,sex); } } //删除 foreach (var item in playerList) { if (item.UserId != 0) { var current = list.Where(c => c.UserId == item.UserId).FirstOrDefault(); if (current == null) { item.ShowInviteModal(); } var myself = list.Where(c => c.UserId == App.CurrentUser.Id).FirstOrDefault(); //被移除房间 or 掉线 or if (myself == null) { //Utils.showToast(gameObject, App.GetLocalString("you've been kicked out of the room")); UIManager.ShowGameRoomListPanel(); } } } //收到服务器开始命令进入 loading页面 if (GameRoom.Status == 1) { //路线 App.RouteIdParam = GameRoom.MapRouteId; if (GameRoom.EnableAR) { SceneManager.LoadScene("VideoPlay"); } else { SceneManager.LoadScene("Ride"); } } DataSourceChanged = false; } } protected override void OnDisable() { } protected override void OnDestroy() { } }