powerfun-unity/Assets/Scripts/UI/Prefab/Panel/GameRoomDetailController.cs

309 lines
9.4 KiB
C#

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<float>
{
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<MainNav>().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<ReceiveMsgModel> 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<GameRoomPlayerPanel>();
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<GameRoomPlayerPanel>();
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);
}
}