358 lines
12 KiB
C#
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);
|
|
}
|
|
}
|