using System; using System.Collections.Generic; using System.Linq; using ExitGames.Client.Photon; using Photon.Pun; using Photon.Realtime; using UnityEngine; public class ChatBackendPUN : MonoBehaviour, IOnEventCallback { public static ChatBackendPUN Instance; [SerializeField] [Tooltip("The number of previous messages to query after joining the room.")] [Range(5f, 30f)] private int previousMessagesCount = 10; public bool IsConnected { get; private set; } public List ChatMessages { get; private set; } public static event Action On_JoinRoomChat; public static event Action On_LeaveRoomChat; public static event Action On_MessageSent; public static event Action On_MessageReceived; public static event Action On_MessageReceivedFishCatch; public static event Action> On_ReceivePreviousMessages; public void SendMessageChat(string message, ChatManager.LanguageFiltr languageFiltr) { SendChatMessageEvent(message, languageFiltr); ChatManager.Message message2 = new ChatManager.Message(); message2.SetMessage(ChatManager.Message.MessageType.Normal, languageFiltr.ToString(), Singleton.Instance.GetCurrentPlayerData().PlayerName, message); ChatBackendPUN.On_MessageSent?.Invoke(message2, message, MultiplayerManager.Instance.UserId); } public void SendMessageSystem(string message) { ChatManager.Message message2 = new ChatManager.Message(); message2.SetMessage(ChatManager.Message.MessageType.System, ChatManager.LanguageFiltr.System.ToString(), "System", message); ChatBackendPUN.On_MessageSent?.Invoke(message2, message, MultiplayerManager.Instance.UserId); ChatMessages.Add(message2); ChatBackendPUN.On_MessageReceived?.Invoke(message2, message, MultiplayerManager.Instance.UserId); } public void SendMessageFishCatch(int fishID, float fishWeight) { SendChatMessageFishCatchEvent(fishID, fishWeight); ChatManager.Message message = new ChatManager.Message(); string text = LanguageManager.Instance.GetText("CHAT_FISH_CATCH") + " " + GameManager.GetFishNameFromSpecies((GameManager.FishSpecies)fishID) + " " + GameManager.Instance.ConvertWeight(fishWeight); message.SetMessage(ChatManager.Message.MessageType.Normal, LanguageManager.Instance.currentLanguage, Singleton.Instance.GetCurrentPlayerData().PlayerName, text); ChatBackendPUN.On_MessageSent?.Invoke(message, text, MultiplayerManager.Instance.UserId); } private void SceneLoader_OnBeginSceneLoad(string sceneLoadName) { if (IsConnected) { SendChatMessageLeaveEvent(); ChatBackendPUN.On_LeaveRoomChat?.Invoke(); } IsConnected = false; ChatMessages = new List(); } private void MultiplayerManager_On_EnterRoomLocation() { if (!IsConnected) { IsConnected = true; SendChatMessageJoinEvent(); ChatBackendPUN.On_JoinRoomChat?.Invoke(); SendChatRequestPreviousMessagesEvent(); } } private void Event_ChatMessage(ChatManager.Message.MessageType type, string country, string player, string playerID, string message) { ChatManager.Message message2 = new ChatManager.Message(); message2.SetMessage(type, country, player, message); ChatMessages.Add(message2); ChatBackendPUN.On_MessageReceived?.Invoke(message2, message, playerID); } private void Event_ChatMessageJoin(ChatManager.Message.MessageType type, string country, string player, string playerID) { ChatManager.Message message = new ChatManager.Message(); message.SetMessage(type, country, player, ""); ChatMessages.Add(message); ChatBackendPUN.On_MessageReceived?.Invoke(message, "", playerID); } private void Event_ChatMessageLeave(ChatManager.Message.MessageType type, string country, string player, string playerID) { ChatManager.Message message = new ChatManager.Message(); message.SetMessage(type, country, player, ""); ChatMessages.Add(message); ChatBackendPUN.On_MessageReceived?.Invoke(message, "", playerID); } private void Event_ChatMessageFishCatch(ChatManager.Message.MessageType type, string country, string player, string playerID, int fishID, float fishWeight) { ChatManager.Message message = new ChatManager.Message(); string text = LanguageManager.Instance.GetText("CHAT_FISH_CATCH") + " " + GameManager.GetFishNameFromSpecies((GameManager.FishSpecies)fishID) + " " + GameManager.Instance.ConvertWeight(fishWeight); message.SetMessage(type, country, player, text); ChatMessages.Add(message); ChatBackendPUN.On_MessageReceivedFishCatch?.Invoke(message, text, playerID, fishID, fishWeight); } public void OnEvent(EventData photonEvent) { switch (photonEvent.Code) { case 10: { object[] obj5 = (object[])photonEvent.CustomData; ChatManager.Message.MessageType type4 = (ChatManager.Message.MessageType)obj5[0]; string country4 = (string)obj5[1]; string player4 = (string)obj5[2]; string playerID4 = (string)obj5[3]; string message2 = (string)obj5[4]; Event_ChatMessage(type4, country4, player4, playerID4, message2); break; } case 11: { object[] obj4 = (object[])photonEvent.CustomData; ChatManager.Message.MessageType type3 = (ChatManager.Message.MessageType)obj4[0]; string country3 = (string)obj4[1]; string player3 = (string)obj4[2]; string playerID3 = (string)obj4[3]; Event_ChatMessageJoin(type3, country3, player3, playerID3); break; } case 12: { object[] obj3 = (object[])photonEvent.CustomData; ChatManager.Message.MessageType type2 = (ChatManager.Message.MessageType)obj3[0]; string country2 = (string)obj3[1]; string player2 = (string)obj3[2]; string playerID2 = (string)obj3[3]; Event_ChatMessageLeave(type2, country2, player2, playerID2); break; } case 13: { object[] obj2 = (object[])photonEvent.CustomData; ChatManager.Message.MessageType type = (ChatManager.Message.MessageType)obj2[0]; string country = (string)obj2[1]; string player = (string)obj2[2]; string playerID = (string)obj2[3]; int fishID = (int)obj2[4]; float fishWeight = (float)obj2[5]; Event_ChatMessageFishCatch(type, country, player, playerID, fishID, fishWeight); break; } case 14: { int requestingActorNumber = (int)((object[])photonEvent.CustomData)[0]; SendChatReceivePreviousMessagesEvent(requestingActorNumber); break; } case 15: { object[] obj = (object[])photonEvent.CustomData; int num = (int)obj[0]; object[] array = (object[])obj[1]; if (num != PhotonNetwork.LocalPlayer.ActorNumber) { break; } List list = new List(); for (int i = 0; i < array.Length; i += 4) { ChatManager.Message message = new ChatManager.Message { chatmessage = (string)array[i], playerName = (string)array[i + 1], messageType = (ChatManager.Message.MessageType)(int)array[i + 2], countryCode = (string)array[i + 3] }; if (!string.IsNullOrEmpty(message.playerName)) { list.Add(message); } } ChatBackendPUN.On_ReceivePreviousMessages?.Invoke(list); break; } } } private void Awake() { if (Instance != null && Instance != this) { UnityEngine.Object.Destroy(base.gameObject); } else { Instance = this; } } private void Start() { IsConnected = false; ChatMessages = new List(); } private void OnEnable() { PhotonNetwork.AddCallbackTarget(this); SceneLoader.OnBeginSceneLoad += SceneLoader_OnBeginSceneLoad; MultiplayerManager.On_EnterRoomLocation += MultiplayerManager_On_EnterRoomLocation; } private void OnDisable() { PhotonNetwork.RemoveCallbackTarget(this); SceneLoader.OnBeginSceneLoad -= SceneLoader_OnBeginSceneLoad; MultiplayerManager.On_EnterRoomLocation -= MultiplayerManager_On_EnterRoomLocation; } private void SendChatMessageEvent(string message, ChatManager.LanguageFiltr languageFiltr) { if (IsConnected) { PhotonNetwork.RaiseEvent(10, new object[5] { ChatManager.Message.MessageType.Normal, languageFiltr.ToString(), Singleton.Instance.GetCurrentPlayerData().PlayerName, MultiplayerManager.Instance.UserId, message }, new RaiseEventOptions { Receivers = ReceiverGroup.All }, SendOptions.SendReliable); } else { Event_ChatMessage(ChatManager.Message.MessageType.Normal, languageFiltr.ToString(), Singleton.Instance.GetCurrentPlayerData().PlayerName, MultiplayerManager.Instance.UserId, message); } } private void SendChatMessageJoinEvent() { if (IsConnected) { PhotonNetwork.RaiseEvent(11, new object[4] { ChatManager.Message.MessageType.JoinInfo, LanguageManager.Instance.currentLanguage, Singleton.Instance.GetCurrentPlayerData().PlayerName, MultiplayerManager.Instance.UserId }, new RaiseEventOptions { Receivers = ReceiverGroup.All }, SendOptions.SendReliable); } else { Event_ChatMessageJoin(ChatManager.Message.MessageType.JoinInfo, LanguageManager.Instance.currentLanguage, Singleton.Instance.GetCurrentPlayerData().PlayerName, MultiplayerManager.Instance.UserId); } } private void SendChatMessageLeaveEvent() { if (IsConnected) { PhotonNetwork.RaiseEvent(12, new object[4] { ChatManager.Message.MessageType.LeaveInfo, LanguageManager.Instance.currentLanguage, Singleton.Instance.GetCurrentPlayerData().PlayerName, MultiplayerManager.Instance.UserId }, new RaiseEventOptions { Receivers = ReceiverGroup.All }, SendOptions.SendReliable); } else { Event_ChatMessageLeave(ChatManager.Message.MessageType.JoinInfo, LanguageManager.Instance.currentLanguage, Singleton.Instance.GetCurrentPlayerData().PlayerName, MultiplayerManager.Instance.UserId); } } private void SendChatMessageFishCatchEvent(int fishID, float fishWeight) { if (IsConnected) { PhotonNetwork.RaiseEvent(13, new object[6] { ChatManager.Message.MessageType.FishCatch, LanguageManager.Instance.currentLanguage, Singleton.Instance.GetCurrentPlayerData().PlayerName, MultiplayerManager.Instance.UserId, fishID, fishWeight }, new RaiseEventOptions { Receivers = ReceiverGroup.All }, SendOptions.SendReliable); } else { Event_ChatMessageFishCatch(ChatManager.Message.MessageType.FishCatch, LanguageManager.Instance.currentLanguage, Singleton.Instance.GetCurrentPlayerData().PlayerName, MultiplayerManager.Instance.UserId, fishID, fishWeight); } } private void SendChatRequestPreviousMessagesEvent() { if (!PhotonNetwork.IsMasterClient) { PhotonNetwork.RaiseEvent(14, new object[1] { PhotonNetwork.LocalPlayer.ActorNumber }, new RaiseEventOptions { Receivers = ReceiverGroup.MasterClient }, SendOptions.SendReliable); } } private void SendChatReceivePreviousMessagesEvent(int requestingActorNumber) { List list = new List(); for (int i = 0; i < previousMessagesCount; i++) { object[] array = new object[4] { "", "", ChatManager.Message.MessageType.Normal, "" }; int num = ChatMessages.Count - 1 - i; if (num >= 0) { array[0] = ChatMessages[num].chatmessage; array[1] = ChatMessages[num].playerName; array[2] = ChatMessages[num].messageType; array[3] = ChatMessages[num].countryCode; } list.Add(array); } list.Reverse(); object[] array2 = list.SelectMany((object message) => (object[])message).ToArray(); PhotonNetwork.RaiseEvent(15, new object[2] { requestingActorNumber, array2 }, new RaiseEventOptions { Receivers = ReceiverGroup.Others }, SendOptions.SendReliable); } }