Files
UltimateFishing2020/Assets/Scripts/Assembly-CSharp/ChatBackendPUN.cs
2026-03-04 10:03:45 +08:00

358 lines
12 KiB
C#

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<ChatManager.Message> ChatMessages { get; private set; }
public static event Action On_JoinRoomChat;
public static event Action On_LeaveRoomChat;
public static event Action<ChatManager.Message, string, string> On_MessageSent;
public static event Action<ChatManager.Message, string, string> On_MessageReceived;
public static event Action<ChatManager.Message, string, string, int, float> On_MessageReceivedFishCatch;
public static event Action<List<ChatManager.Message>> 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<SaveDataManager>.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<SaveDataManager>.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<ChatManager.Message>();
}
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<ChatManager.Message> list = new List<ChatManager.Message>();
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<ChatManager.Message>();
}
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<SaveDataManager>.Instance.GetCurrentPlayerData().PlayerName,
MultiplayerManager.Instance.UserId,
message
}, new RaiseEventOptions
{
Receivers = ReceiverGroup.All
}, SendOptions.SendReliable);
}
else
{
Event_ChatMessage(ChatManager.Message.MessageType.Normal, languageFiltr.ToString(), Singleton<SaveDataManager>.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<SaveDataManager>.Instance.GetCurrentPlayerData().PlayerName,
MultiplayerManager.Instance.UserId
}, new RaiseEventOptions
{
Receivers = ReceiverGroup.All
}, SendOptions.SendReliable);
}
else
{
Event_ChatMessageJoin(ChatManager.Message.MessageType.JoinInfo, LanguageManager.Instance.currentLanguage, Singleton<SaveDataManager>.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<SaveDataManager>.Instance.GetCurrentPlayerData().PlayerName,
MultiplayerManager.Instance.UserId
}, new RaiseEventOptions
{
Receivers = ReceiverGroup.All
}, SendOptions.SendReliable);
}
else
{
Event_ChatMessageLeave(ChatManager.Message.MessageType.JoinInfo, LanguageManager.Instance.currentLanguage, Singleton<SaveDataManager>.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<SaveDataManager>.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<SaveDataManager>.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<object> list = new List<object>();
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);
}
}