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; using UnityEngine.EventSystems; public class GameRoomDetailController : PFUIPanel,IProgress { public Text versionText; 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; } private bool isQuit = false; private bool DataSourceChanged { get; set; } float timer = 0f; private bool isOwner { get; set; } = true; private MapRoute route { get; set; } protected override void Start() { base.Start(); UIManager.AddBackHandler(QuitGameRoom); transform.Find("MainNav").GetComponent().ShowBack(); Utils.DisplayHead(Avatar, App.CurrentUser.WxHeadImg); UIManager.AddEvent(startBtn, UnityEngine.EventSystems.EventTriggerType.PointerClick,StartRide); UIManager.AddEvent(readyBtn, UnityEngine.EventSystems.EventTriggerType.PointerClick,Ready); UIManager.AddEvent(cancelBtn, UnityEngine.EventSystems.EventTriggerType.PointerClick,CancelReady); UIManager.AddEvent(quitBtn, UnityEngine.EventSystems.EventTriggerType.PointerClick,LeaveGameRoom); } private void LeaveGameRoom(BaseEventData data) { if (Status == 1) { Utils.showToast(gameObject, App.GetLocalString("CancelReadyToQuit")); return; } App.gameRoomDetail = null; isQuit = true; MapUDPService.SendGameRoomKick(GameRoom.RoomId, App.CurrentUser.Id, App.CurrentUser.Id); UIManager.ShowGameRoomListPanel(); } private void CancelReady(BaseEventData data) { Status = 0; readyBtn.SetActive(true); cancelBtn.SetActive(false); MapUDPService.SendGameRoomReadyStatus(App.gameRoomDetail.RoomId, App.CurrentUser.Id, Status); } private void Ready(BaseEventData data) { Status = 1; readyBtn.SetActive(false); cancelBtn.SetActive(true); MapUDPService.SendGameRoomReadyStatus(App.gameRoomDetail.RoomId, App.CurrentUser.Id, Status); } private void StartRide(BaseEventData data) { var list = GameRoom.RoomPlayerList; var notReady = list.Any(c => c.Status == 0 && c.IsOwner == false); if (notReady) { Utils.showToast(gameObject, App.GetLocalString("have to wait for all ready!")); } else { MapUDPService.SendGameRoomStartTime(App.gameRoomDetail.RoomId, App.CurrentUser.Id); } } private void QuitGameRoom(string e) { MapUDPService.SendGameRoomKick(GameRoom.RoomId,App.CurrentUser.Id,App.CurrentUser.Id); App.gameRoomDetail = null; } public override void Show() { base.Show(); Initialize(); } private void ListenerHandler(List message) { var detail = message.FirstOrDefault(); if (detail == null || message.Count > 1) return; if (detail.RoomList == null) { DataSourceChanged = true; GameRoom = null; return; } GameRoom = detail.RoomList.FirstOrDefault(c => c.RoomId == GameRoom.RoomId); if (GameRoom != null) { DataSourceChanged = true; } } private void Update() { TcpHandler(); } private void Initialize() { DataSourceChanged = false; App.Model = "GameRoom"; versionText.text = "V"+App.AppVersion; 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); MapUDPService.SendQueryGameRoomList(App.CurrentUser.Id, 0, 1, GameRoom.RoomId.ToString()); var isOwner = GameRoom.UserId == App.CurrentUser.Id; readyBtn.SetActive(!isOwner); cancelBtn.SetActive(!isOwner); startBtn.SetActive(isOwner); 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)}%"; RenderBestPlayer(); GetMapRoute(); 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 GetMapRoute() { var result = ConfigHelper.mapApi.GetById(GameRoom.MapRouteId); if (result != null && result.result) { this.route = result.data; } } //查询某线路最佳 private void RenderBestPlayer() { 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); } } private void TcpHandler() { if (!DataSourceChanged) return; //房间被销毁了返回房间列表 if (GameRoom == null) { UIManager.ShowGameRoomListPanel(); return; } var playerList = FindObjectsOfType(); SetRoomOwner(); CreatePlayers(playerList); RemovePlayers(playerList); LoadScene(); DataSourceChanged = false; } //自己是否是房主 private void SetRoomOwner() { var mine = GameRoom.RoomPlayerList.FirstOrDefault(c => c.UserId == App.CurrentUser.Id); if (mine != null && isOwner != mine.IsOwner) { isOwner = mine.IsOwner; readyBtn.SetActive(!isOwner); startBtn.SetActive(isOwner); cancelBtn.SetActive(!isOwner); } } //收到服务器开始命令进入 loading页面 private void LoadScene() { if (GameRoom.Status != 1) return; App.RouteIdParam = GameRoom.MapRouteId; App.MainSceneParam["Name"] = "GameRoomList"; SceneManager.LoadScene(GameRoom.EnableAR?"VideoPlay":"Ride"); } private void CreatePlayers(GameRoomPlayerPanel[] playerList) { foreach (var item in GameRoom.RoomPlayerList) { 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); } } } private void RemovePlayers(GameRoomPlayerPanel[] playerList) { foreach (var item in playerList) { if (item.UserId == 0) continue; var current = GameRoom.RoomPlayerList.FirstOrDefault(c => c.UserId == item.UserId); if (current == null) { item.ShowInviteModal(); } //被移除房间/掉线 var myself = GameRoom.RoomPlayerList.FirstOrDefault(c => c.UserId == App.CurrentUser.Id); if (myself == null && !isQuit ) { Utils.showToast(gameObject, App.GetLocalString("you have been kicked out of the room")); UIManager.ShowGameRoomListPanel(); } } } protected override void OnDisable() { App.Model = ""; } public void Report(float value) { Debug.Log(value); } }