315 lines
7.9 KiB
C#
315 lines
7.9 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using Logic.Audio;
|
|
using Logic.Multilingual;
|
|
using TH1_Logic.Net;
|
|
using TH1_Logic.Steam;
|
|
using TH1Renderer;
|
|
using TH1_UI.View.Common;
|
|
using TMPro;
|
|
using UnityEngine;
|
|
using UnityEngine.UI;
|
|
using RuntimeData;
|
|
using TH1_Logic.Core;
|
|
using TH1_UI.Core;
|
|
using UnityEngine.Serialization;
|
|
|
|
namespace TH1_UI.View.Bottom
|
|
{
|
|
public class UIBottomNetView : Base.View
|
|
{
|
|
public ViDelegateAssisstant.Dele OnBtnCloseClick;
|
|
public ViDelegateAssisstant.Dele<string> OnChatMessageSend;
|
|
|
|
public GameObject NetRowPrefab;
|
|
public RectTransform NetRowContainer;
|
|
// NetInfo related
|
|
public RectTransform NetInfo;
|
|
public RectTransform ScrollViewRect;
|
|
|
|
// ChatArea
|
|
public RectTransform ChatAreaRoot;
|
|
public RectTransform NetErrorPanelRoot;
|
|
|
|
private UIChatAreaMono _chatArea;
|
|
private GameObject _chatAreaGo;
|
|
private UINetErrorAreaMono _netErrorArea;
|
|
private GameObject _netErrorAreaGo;
|
|
|
|
private List<UIBottomNetRowMono> _netInfoRowList = null;
|
|
private bool _initialized = false;
|
|
private int _lastNetMemberCount = -1;
|
|
|
|
protected override void OnInit()
|
|
{
|
|
base.OnInit();
|
|
_netInfoRowList = new List<UIBottomNetRowMono>();
|
|
}
|
|
|
|
|
|
public void SetContent()
|
|
{
|
|
Init();
|
|
UpdateView();
|
|
}
|
|
|
|
// Initializes the room member state when entering a match.
|
|
private void Init()
|
|
{
|
|
_initialized = true;
|
|
if(Main.MapData == null) return;
|
|
bool isMulti = Main.MapData.Net.Mode == NetMode.Multi;
|
|
if (NetInfo != null)
|
|
NetInfo.gameObject.SetActive(isMulti);
|
|
|
|
// ChatArea and NetErrorArea follow NetInfo lifetime.
|
|
if (isMulti)
|
|
{
|
|
InitChatArea();
|
|
InitNetErrorArea();
|
|
}
|
|
else
|
|
{
|
|
CloseChatArea();
|
|
CloseNetErrorArea();
|
|
}
|
|
|
|
if (!isMulti) return;
|
|
|
|
RenderNetRows();
|
|
}
|
|
|
|
private void ResizeScrollView(int activeRowCount)
|
|
{
|
|
if (ScrollViewRect == null || activeRowCount <= 0) return;
|
|
float rowHeight = ((RectTransform)NetRowPrefab.transform).sizeDelta.y;
|
|
var layout = NetRowContainer.GetComponent<VerticalLayoutGroup>();
|
|
float spacing = layout != null ? layout.spacing : 0f;
|
|
float totalHeight = activeRowCount * rowHeight + Mathf.Max(0, activeRowCount - 1) * spacing;
|
|
if (layout != null)
|
|
totalHeight += layout.padding.top + layout.padding.bottom;
|
|
var sd = ScrollViewRect.sizeDelta;
|
|
sd.y = totalHeight;
|
|
ScrollViewRect.sizeDelta = sd;
|
|
}
|
|
|
|
// UpdateView only changes NetStatus and room owner marker.
|
|
public void UpdateView()
|
|
{
|
|
|
|
if (!_initialized) return;
|
|
if(Main.MapData == null) return;
|
|
bool isMulti = Main.MapData.Net.Mode == NetMode.Multi;
|
|
if (NetInfo != null)
|
|
NetInfo.gameObject.SetActive(isMulti);
|
|
if (!isMulti) return;
|
|
|
|
var lobbyInfo = LobbyManager.Instance.Lobby as SteamLobbyManager;
|
|
if (lobbyInfo == null) return;
|
|
var mids = lobbyInfo.GetAllMemberInfo();
|
|
PlayMemberEnterAudioIfNeeded(mids.Count);
|
|
RenderNetRows();
|
|
|
|
}
|
|
|
|
private void RenderNetRows()
|
|
{
|
|
var lobbyInfo = LobbyManager.Instance.Lobby as SteamLobbyManager;
|
|
var mapConfig = Main.MapData?.MapConfig ?? Main.Instance?.MapConfig;
|
|
if (lobbyInfo == null || mapConfig == null) return;
|
|
|
|
var seats = BuildNetSeats(mapConfig);
|
|
var memberInfos = lobbyInfo.GetAllMemberInfo();
|
|
var ownerId = lobbyInfo.GetLobbyOwnerId();
|
|
var activeCount = seats.Count;
|
|
|
|
EnsureNetRowCount(activeCount);
|
|
for (int i = 0; i < _netInfoRowList.Count; i++)
|
|
{
|
|
var row = _netInfoRowList[i];
|
|
var active = i < activeCount;
|
|
row.gameObject.SetActive(active);
|
|
if (!active) continue;
|
|
|
|
var seat = seats[i];
|
|
memberInfos.TryGetValue(seat.MemberId, out var memberInfo);
|
|
row.InitContent(seat, memberInfo, lobbyInfo.IsLobbyOwner(), ownerId);
|
|
}
|
|
|
|
ResizeScrollView(activeCount);
|
|
}
|
|
|
|
private List<MemberCiv> BuildNetSeats(MapConfig mapConfig)
|
|
{
|
|
var seats = new List<MemberCiv>();
|
|
var slots = mapConfig.MultiCivs;
|
|
if (slots == null) return seats;
|
|
|
|
foreach (var slot in slots)
|
|
{
|
|
if (slot == null || slot.MemberId == 0) continue;
|
|
seats.Add(slot);
|
|
}
|
|
|
|
return seats;
|
|
}
|
|
|
|
private void EnsureNetRowCount(int count)
|
|
{
|
|
while (_netInfoRowList.Count < count)
|
|
{
|
|
var obj = Instantiate(NetRowPrefab, NetRowContainer);
|
|
var cpn = obj.GetComponent<UIBottomNetRowMono>();
|
|
if (cpn == null)
|
|
{
|
|
Destroy(obj);
|
|
break;
|
|
}
|
|
_netInfoRowList.Add(cpn);
|
|
}
|
|
}
|
|
|
|
private void PlayMemberEnterAudioIfNeeded(int memberCount)
|
|
{
|
|
if (_lastNetMemberCount >= 0 && memberCount > _lastNetMemberCount)
|
|
AudioManager.Instance.PlayAudio("SFX/UI_playerenter");
|
|
_lastNetMemberCount = memberCount;
|
|
}
|
|
|
|
private void Update()
|
|
{
|
|
UpdateView();
|
|
}
|
|
|
|
private void OnChatMessageSendInternal(string message)
|
|
{
|
|
OnChatMessageSend?.Invoke(message);
|
|
}
|
|
|
|
private void InitChatArea()
|
|
{
|
|
if (_chatArea != null) return;
|
|
|
|
var prefab = Resources.Load<GameObject>("Prefab/UI/Common/Chat/ChatAreaPanel");
|
|
if (prefab == null)
|
|
{
|
|
Debug.LogError("[UIBottomNet] ChatAreaPanel prefab not found.");
|
|
return;
|
|
}
|
|
|
|
var parent = GetChatAreaRoot();
|
|
_chatAreaGo = Instantiate(prefab, parent);
|
|
FitToRoot(_chatAreaGo.transform as RectTransform, parent);
|
|
_chatArea = _chatAreaGo.GetComponent<UIChatAreaMono>();
|
|
if (_chatArea == null)
|
|
{
|
|
Debug.LogError("[UIBottomNet] ChatAreaPanel missing UIChatAreaMono.");
|
|
Destroy(_chatAreaGo);
|
|
_chatAreaGo = null;
|
|
return;
|
|
}
|
|
|
|
_chatArea.OnSendMessage -= OnChatMessageSendInternal;
|
|
_chatArea.OnSendMessage += OnChatMessageSendInternal;
|
|
_chatArea.Init();
|
|
}
|
|
|
|
private void FitToRoot(RectTransform rectTransform, RectTransform root)
|
|
{
|
|
if (rectTransform == null || root == null) return;
|
|
rectTransform.anchorMin = Vector2.zero;
|
|
rectTransform.anchorMax = Vector2.one;
|
|
rectTransform.offsetMin = Vector2.zero;
|
|
rectTransform.offsetMax = Vector2.zero;
|
|
rectTransform.localScale = Vector3.one;
|
|
}
|
|
|
|
private RectTransform GetChatAreaRoot()
|
|
{
|
|
var bottomBarRoot = ViewControllerManager.UIBottomBottomBarController?.WindowScript?.ChatAreaRoot;
|
|
if (bottomBarRoot != null) return bottomBarRoot;
|
|
return ChatAreaRoot != null ? ChatAreaRoot : transform as RectTransform;
|
|
}
|
|
|
|
private void CloseChatArea()
|
|
{
|
|
if (_chatArea != null)
|
|
{
|
|
_chatArea.OnSendMessage -= OnChatMessageSendInternal;
|
|
_chatArea.Shutdown();
|
|
}
|
|
|
|
if (_chatAreaGo != null)
|
|
Destroy(_chatAreaGo);
|
|
|
|
_chatArea = null;
|
|
_chatAreaGo = null;
|
|
}
|
|
|
|
private void InitNetErrorArea()
|
|
{
|
|
if (_netErrorArea != null) return;
|
|
|
|
var prefab = Resources.Load<GameObject>("Prefab/UI/Common/Chat/NetErrorAreaPanel");
|
|
if (prefab == null)
|
|
{
|
|
Debug.LogError("[UIBottomNet] NetErrorAreaPanel prefab not found.");
|
|
return;
|
|
}
|
|
|
|
var parent = GetNetErrorPanelRoot();
|
|
_netErrorAreaGo = Instantiate(prefab, parent);
|
|
FitToRoot(_netErrorAreaGo.transform as RectTransform, parent);
|
|
_netErrorAreaGo.transform.SetAsLastSibling();
|
|
_netErrorArea = _netErrorAreaGo.GetComponent<UINetErrorAreaMono>();
|
|
if (_netErrorArea == null)
|
|
{
|
|
Debug.LogError("[UIBottomNet] NetErrorAreaPanel missing UINetErrorAreaMono.");
|
|
Destroy(_netErrorAreaGo);
|
|
_netErrorAreaGo = null;
|
|
return;
|
|
}
|
|
|
|
_netErrorArea.Init();
|
|
}
|
|
|
|
private RectTransform GetNetErrorPanelRoot()
|
|
{
|
|
if (NetErrorPanelRoot != null) return NetErrorPanelRoot;
|
|
|
|
var root = transform.Find("NetErrorPanelRoot") as RectTransform;
|
|
if (root != null)
|
|
{
|
|
NetErrorPanelRoot = root;
|
|
return NetErrorPanelRoot;
|
|
}
|
|
|
|
return GetChatAreaRoot();
|
|
}
|
|
|
|
private void CloseNetErrorArea()
|
|
{
|
|
if (_netErrorArea != null)
|
|
_netErrorArea.Shutdown();
|
|
|
|
if (_netErrorAreaGo != null)
|
|
Destroy(_netErrorAreaGo);
|
|
|
|
_netErrorArea = null;
|
|
_netErrorAreaGo = null;
|
|
}
|
|
|
|
public void CloseView()
|
|
{
|
|
_initialized = false;
|
|
_lastNetMemberCount = -1;
|
|
|
|
// 娓呯悊 ChatArea
|
|
CloseChatArea();
|
|
CloseNetErrorArea();
|
|
|
|
//AudioManager.Instance.StopMusic();
|
|
}
|
|
}
|
|
}
|