first commit
This commit is contained in:
24
NitroxClient/GameLogic/ChatUI/ChatLogEntry.cs
Normal file
24
NitroxClient/GameLogic/ChatUI/ChatLogEntry.cs
Normal file
@@ -0,0 +1,24 @@
|
||||
using System;
|
||||
using UnityEngine;
|
||||
|
||||
namespace NitroxClient.GameLogic.ChatUI
|
||||
{
|
||||
public class ChatLogEntry
|
||||
{
|
||||
public string PlayerName { get; }
|
||||
public string MessageText { get; set; }
|
||||
public Color32 PlayerColor { get; }
|
||||
public string Time { get; set; }
|
||||
public GameObject EntryObject { get; set; }
|
||||
|
||||
public ChatLogEntry(string playerName, string messageText, Color32 playerColor)
|
||||
{
|
||||
PlayerName = playerName;
|
||||
MessageText = messageText;
|
||||
PlayerColor = playerColor;
|
||||
UpdateTime();
|
||||
}
|
||||
|
||||
public void UpdateTime() => Time = DateTime.Now.ToString("HH:mm");
|
||||
}
|
||||
}
|
131
NitroxClient/GameLogic/ChatUI/PlayerChatManager.cs
Normal file
131
NitroxClient/GameLogic/ChatUI/PlayerChatManager.cs
Normal file
@@ -0,0 +1,131 @@
|
||||
using System.Collections;
|
||||
using NitroxClient.Communication.Abstract;
|
||||
using NitroxClient.GameLogic.Settings;
|
||||
using NitroxClient.MonoBehaviours.Gui.Chat;
|
||||
using NitroxModel.Helper;
|
||||
using NitroxModel.Packets;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
using UWE;
|
||||
using static NitroxClient.Unity.Helper.AssetBundleLoader;
|
||||
|
||||
namespace NitroxClient.GameLogic.ChatUI
|
||||
{
|
||||
public class PlayerChatManager
|
||||
{
|
||||
private readonly IMultiplayerSession multiplayerSession;
|
||||
|
||||
private const char SERVER_COMMAND_PREFIX = '/';
|
||||
|
||||
public bool IsChatSelected
|
||||
{
|
||||
get => PlayerChat.IsReady && playerChat.selected;
|
||||
}
|
||||
|
||||
public PlayerChatManager(IMultiplayerSession multiplayerSession)
|
||||
{
|
||||
this.multiplayerSession = multiplayerSession;
|
||||
|
||||
if (NitroxEnvironment.IsNormal) //Testing would fail because it's trying to access runtime MonoBehaviours.
|
||||
{
|
||||
CoroutineHost.StartCoroutine(LoadChatLogAsset());
|
||||
}
|
||||
}
|
||||
|
||||
private PlayerChat playerChat;
|
||||
private GameObject chatKeyHint;
|
||||
public Transform PlayerChaTransform => playerChat.transform;
|
||||
|
||||
public void ShowChat() => Player.main.StartCoroutine(ShowChatAsync());
|
||||
private IEnumerator ShowChatAsync()
|
||||
{
|
||||
yield return new WaitUntil(() => PlayerChat.IsReady);
|
||||
playerChat.Show();
|
||||
}
|
||||
|
||||
public void HideChat() => Player.main.StartCoroutine(HideChatAsync());
|
||||
private IEnumerator HideChatAsync()
|
||||
{
|
||||
yield return new WaitUntil(() => PlayerChat.IsReady);
|
||||
playerChat.Deselect();
|
||||
playerChat.Hide();
|
||||
}
|
||||
|
||||
public void SelectChat() => Player.main.StartCoroutine(SelectChatAsync());
|
||||
private IEnumerator SelectChatAsync()
|
||||
{
|
||||
yield return new WaitUntil(() => PlayerChat.IsReady);
|
||||
playerChat.Show();
|
||||
playerChat.Select();
|
||||
|
||||
if (!NitroxPrefs.ChatUsed.Value)
|
||||
{
|
||||
DisableChatKeyHint();
|
||||
}
|
||||
}
|
||||
|
||||
public void DeselectChat() => Player.main.StartCoroutine(DeselectChatAsync());
|
||||
private IEnumerator DeselectChatAsync()
|
||||
{
|
||||
yield return new WaitUntil(() => PlayerChat.IsReady);
|
||||
playerChat.Deselect();
|
||||
}
|
||||
|
||||
public void AddMessage(string playerName, string message, Color color) => Player.main.StartCoroutine(AddMessageAsync(playerName, message, color));
|
||||
private IEnumerator AddMessageAsync(string playerName, string message, Color color)
|
||||
{
|
||||
yield return new WaitUntil(() => PlayerChat.IsReady);
|
||||
playerChat.WriteLogEntry(playerName, message, color);
|
||||
}
|
||||
|
||||
public void SendMessage()
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(playerChat.InputText))
|
||||
{
|
||||
playerChat.Select();
|
||||
return;
|
||||
}
|
||||
|
||||
string trimmedInput = playerChat.InputText.Trim();
|
||||
if (trimmedInput[0] == SERVER_COMMAND_PREFIX)
|
||||
{
|
||||
// Server command
|
||||
multiplayerSession.Send(new ServerCommand(trimmedInput.Substring(1)));
|
||||
playerChat.InputText = "";
|
||||
playerChat.Select();
|
||||
return;
|
||||
}
|
||||
|
||||
// We shouldn't add the message to the local chat instantly but instead let the server tell us if this message is added or not
|
||||
multiplayerSession.Send(new ChatMessage(multiplayerSession.Reservation.PlayerId, trimmedInput));
|
||||
playerChat.InputText = "";
|
||||
playerChat.Select();
|
||||
}
|
||||
|
||||
private IEnumerator LoadChatLogAsset()
|
||||
{
|
||||
yield return LoadUIAsset(NitroxAssetBundle.CHAT_LOG, true);
|
||||
|
||||
GameObject playerChatGameObject = (GameObject)NitroxAssetBundle.CHAT_LOG.LoadedAssets[0];
|
||||
playerChat = playerChatGameObject.AddComponent<PlayerChat>();
|
||||
|
||||
yield return playerChat.SetupChatComponents();
|
||||
}
|
||||
|
||||
public IEnumerator LoadChatKeyHint()
|
||||
{
|
||||
if (!NitroxPrefs.ChatUsed.Value)
|
||||
{
|
||||
yield return LoadUIAsset(NitroxAssetBundle.CHAT_KEY_HINT, false);
|
||||
chatKeyHint = NitroxAssetBundle.CHAT_KEY_HINT.LoadedAssets[0] as GameObject;
|
||||
}
|
||||
}
|
||||
|
||||
private void DisableChatKeyHint()
|
||||
{
|
||||
chatKeyHint.GetComponentInChildren<Text>().CrossFadeAlpha(0, 1, false);
|
||||
chatKeyHint.GetComponentInChildren<Image>().CrossFadeAlpha(0, 1, false);
|
||||
NitroxPrefs.ChatUsed.Value = true;
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user