diff --git a/Assets/PerfectWorld/Scripts/Chat/Chat_GameSession.cs b/Assets/PerfectWorld/Scripts/Chat/Chat_GameSession.cs index 20346f8e42..5c46495b68 100644 --- a/Assets/PerfectWorld/Scripts/Chat/Chat_GameSession.cs +++ b/Assets/PerfectWorld/Scripts/Chat/Chat_GameSession.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Runtime.InteropServices; +using System.Text; using BrewMonster.Network; using BrewMonster.Scripts.UI; using BrewMonster.UI; @@ -501,8 +502,60 @@ namespace BrewMonster.Scripts.Chat p.emotion);*/ return true; - } + + /*public static void OnTaskChatMessage(byte[] buffer, int size) + { + const int iNameLen = 20; + + int expectedSize = 4 * 5 + iNameLen * 2; + + if (size < expectedSize) + return; + + int offset = 0; + + int self_id = BitConverter.ToInt32(buffer, offset); offset += 4; + uint task_id = BitConverter.ToUInt32(buffer, offset); offset += 4; + int channel = BitConverter.ToInt32(buffer, offset); offset += 4; + int param = BitConverter.ToInt32(buffer, offset); offset += 4; + int map_id = BitConverter.ToInt32(buffer, offset); offset += 4; + + // name (UTF16 20 chars) + string name = Encoding.Unicode.GetString(buffer, offset, iNameLen * 2); + name = name.TrimEnd('\0'); + + var pTempl = EC_Game.GetTaskTemplateMan() + .GetTaskTemplByID(task_id); + + if (pTempl == null) + return; + + var tribute = pTempl.GetTribute(); + + if (string.IsNullOrEmpty(tribute)) + return; + + // register player name + EC_Game.GetGameRun().AddPlayerName(self_id, name); + + string strMsg = tribute; + + // replace $name + strMsg = strMsg.Replace("$name", $"&{name}&"); + + // replace $map + string strMap = ""; + + var instance = EC_Game.GetGameRun().GetInstance(map_id); + + if (instance != null) + strMap = instance.GetName(); + + strMsg = strMsg.Replace("$map", strMap); + + EC_Game.GetGameRun().AddChatMessage(strMsg, channel); + }*/ public class AUICTranslate { diff --git a/Assets/PerfectWorld/Scripts/Chat/UI.meta b/Assets/PerfectWorld/Scripts/Chat/UI.meta new file mode 100644 index 0000000000..5b95658c75 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Chat/UI.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3d2c00e6fd97fce4c8061a0c54327a5f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PerfectWorld/Scripts/Chat/UI/ChatMessageView.cs b/Assets/PerfectWorld/Scripts/Chat/UI/ChatMessageView.cs new file mode 100644 index 0000000000..15dce687f2 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Chat/UI/ChatMessageView.cs @@ -0,0 +1,15 @@ +using TMPro; +using UnityEngine; + +namespace BrewMonster +{ + public class ChatMessageView : MonoBehaviour + { + public TextMeshProUGUI messageText; + + public void Bind(string message) + { + messageText.text = message; + } + } +} diff --git a/Assets/PerfectWorld/Scripts/Chat/UI/ChatMessageView.cs.meta b/Assets/PerfectWorld/Scripts/Chat/UI/ChatMessageView.cs.meta new file mode 100644 index 0000000000..96290dd492 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Chat/UI/ChatMessageView.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 179d32c667fc2f641bdcb7afb18046b9 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Chat/UI/ChatPanelUI.cs b/Assets/PerfectWorld/Scripts/Chat/UI/ChatPanelUI.cs new file mode 100644 index 0000000000..18348232e5 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Chat/UI/ChatPanelUI.cs @@ -0,0 +1,136 @@ +using System.Collections.Generic; +using CSNetwork; +using UnityEngine; +using UnityEngine.Pool; +using UnityEngine.UI; + +namespace BrewMonster.Scripts.ChatUI +{ + public class ChatPanelUI : MonoBehaviour + { + [Header("UI")] public ScrollRect scrollRect; + public RectTransform content; + public ChatMessageView messagePrefab; + //public GameObject newMessageIndicator; + + [Header("Config")] public int maxVisibleMessages = 30; + public int maxStoredMessages = 2000; + + private List _messages = new(); + private List _visibleViews = new(); + + private ObjectPool _pool; + + private bool _userAtBottom = true; + + void Awake() + { + EventBus.Subscribe( + (x) => AddMessage(x.context)); + _pool = new ObjectPool( + CreateItem, + OnGetItem, + OnReleaseItem, + OnDestroyItem, + false, + 10, + 100 + ); + + scrollRect.onValueChanged.AddListener(OnScrollChanged); + } + + ChatMessageView CreateItem() + { + var item = Instantiate(messagePrefab); + item.transform.SetParent(content, false); + return item; + } + + void OnGetItem(ChatMessageView item) + { + item.gameObject.SetActive(true); + } + + void OnReleaseItem(ChatMessageView item) + { + item.gameObject.SetActive(false); + } + + void OnDestroyItem(ChatMessageView item) + { + Destroy(item.gameObject); + } + + void OnScrollChanged(Vector2 pos) + { + _userAtBottom = scrollRect.verticalNormalizedPosition <= 0.001f; + + if (_userAtBottom) + { + //newMessageIndicator.SetActive(false); + } + } + + bool IsAtBottom() + { + return scrollRect.verticalNormalizedPosition <= 0.001f; + } + + public void AddMessage(string msg) + { + _messages.Add(msg); + + if (_messages.Count > maxStoredMessages) + _messages.RemoveAt(0); + + RefreshVisible(); + + if (_userAtBottom) + { + ScrollToBottom(); + } + else + { + //newMessageIndicator.SetActive(true); + } + } + + void RefreshVisible() + { + foreach (var view in _visibleViews) + _pool.Release(view); + + _visibleViews.Clear(); + + int start = Mathf.Max(0, _messages.Count - maxVisibleMessages); + + for (int i = start; i < _messages.Count; i++) + { + var view = _pool.Get(); + view.transform.SetParent(content, false); + view.Bind(_messages[i]); + + _visibleViews.Add(view); + } + + Canvas.ForceUpdateCanvases(); + } + + public void ScrollToBottom() + { + Canvas.ForceUpdateCanvases(); + scrollRect.verticalNormalizedPosition = 0f; + //newMessageIndicator.SetActive(false); + } + + public void ClearChat() + { + foreach (var view in _visibleViews) + _pool.Release(view); + + _visibleViews.Clear(); + _messages.Clear(); + } + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Chat/UI/ChatPanelUI.cs.meta b/Assets/PerfectWorld/Scripts/Chat/UI/ChatPanelUI.cs.meta new file mode 100644 index 0000000000..8c8314a16a --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Chat/UI/ChatPanelUI.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 5790dcd71bafcec4697f10b5366bec2c \ No newline at end of file