using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Text;
using ACNPlus.ChatBubble;
using ACNPlus.MinimapReplacement;
using ACNPlus.Phone;
using BepInEx;
using BepInEx.Configuration;
using BombRushMP.Common.Networking;
using BombRushMP.Common.Packets;
using BombRushMP.Plugin;
using BombRushMP.Plugin.Gamemodes;
using CommonAPI.Phone;
using HarmonyLib;
using Reptile;
using Reptile.Phone;
using TMPro;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyCompany("ACNPlus")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("ACNPlus")]
[assembly: AssemblyTitle("ACNPlus")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace ACNPlus
{
public enum PrivateLobbyType
{
Normal,
FriendsOnly,
CrewOnly,
Solo
}
[BepInPlugin("com.acn.acnplus", "ACNPlus", "1.0.0")]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
public class ACNPlusPlugin : BaseUnityPlugin
{
private static Harmony _harmony;
private static string _acnPlusFolder;
private static string _friendsListPath;
private static string _blocklistPath;
private static HashSet<string> _friendsList = new HashSet<string>();
private static HashSet<string> _blocklist = new HashSet<string>();
public static ConfigEntry<bool> BlockInvites;
public static ConfigEntry<bool> BlockInvitesChatMessage;
public static ConfigEntry<bool> BlockPlayersFromJoiningLobby;
public static ConfigEntry<bool> FriendsOnlyLobby;
public static ConfigEntry<bool> CrewOnlyLobby;
public static ConfigEntry<bool> SeeWhenSomethingIsBlocked;
public static ConfigEntry<bool> ChangeMiniMapToPNG;
public static ConfigEntry<bool> CatWizardMiniMap;
public static ConfigEntry<bool> TransparentLobbyBanner;
public static ConfigEntry<bool> TransparentLobbyNameBG;
public static ConfigEntry<bool> HideLobbySettings;
public static ConfigEntry<bool> ShowChatBubbles;
public static ConfigEntry<string> ChatBubbleColor;
public static ConfigEntry<int> PrivateLobbyTypeConfig;
private static string _texturesFolder;
private static string _pluginFolder;
private void Awake()
{
//IL_01c6: Unknown result type (might be due to invalid IL or missing references)
//IL_01d0: Expected O, but got Unknown
//IL_029f: Unknown result type (might be due to invalid IL or missing references)
//IL_02a9: Expected O, but got Unknown
BlockInvites = ((BaseUnityPlugin)this).Config.Bind<bool>("Gamemodes", "BlockInvites", false, "Automatically decline all lobby invites");
BlockInvitesChatMessage = ((BaseUnityPlugin)this).Config.Bind<bool>("Gamemodes", "BlockInvitesChatMessage", false, "Show a chat message when an invite is blocked");
BlockPlayersFromJoiningLobby = ((BaseUnityPlugin)this).Config.Bind<bool>("Gamemodes", "BlockPlayersFromJoiningLobby", false, "Automatically kick players who join your lobby (only works if you are the host)");
FriendsOnlyLobby = ((BaseUnityPlugin)this).Config.Bind<bool>("Gamemodes", "FriendsOnlyLobby", false, "Automatically kick players who aren't on your friends list (only works if you are the host)");
CrewOnlyLobby = ((BaseUnityPlugin)this).Config.Bind<bool>("Gamemodes", "CrewOnlyLobby", false, "Automatically kick players who aren't in your crew (only works if you are the host)");
SeeWhenSomethingIsBlocked = ((BaseUnityPlugin)this).Config.Bind<bool>("Blocked Users", "SeeWhenSomethingIsBlocked", true, "Show chat messages when blocked users send messages, invites, or get kicked");
ChangeMiniMapToPNG = ((BaseUnityPlugin)this).Config.Bind<bool>("Minimap", "ChangeMiniMapToPNG", false, "Replace the minimap with a custom image from ACNPlus/Textures/MiniMapPNG.png");
CatWizardMiniMap = ((BaseUnityPlugin)this).Config.Bind<bool>("Minimap", "CatWizardMiniMap", false, "An example of a custom mini map (uses backendtextures/CatMiniMap.png)");
TransparentLobbyBanner = ((BaseUnityPlugin)this).Config.Bind<bool>("Lobby Banners", "TransparentLobbyBanner", false, "Use transparent image for lobby title background (from mod folder backendtextures/transparent.png)");
TransparentLobbyNameBG = ((BaseUnityPlugin)this).Config.Bind<bool>("Lobby Banners", "TransparentLobbyNameBG", false, "Use transparent image for name row background in both normal and team mode (from mod folder backendtextures/transparent.png)");
HideLobbySettings = ((BaseUnityPlugin)this).Config.Bind<bool>("Lobby UI", "HideLobbySettings", false, "Hide the game settings text beside the lobby UI when in a lobby");
ShowChatBubbles = ((BaseUnityPlugin)this).Config.Bind<bool>("Chat", "ShowChatBubbles", false, "Show chat messages above players' heads for 5 seconds when they send a message");
ChatBubbleColor = ((BaseUnityPlugin)this).Config.Bind<string>("Chat", "ChatBubbleColor", "FFFFFF", "Hex color for chat bubble text (e.g. FF0000 for red, FFFFFF for white)");
PrivateLobbyTypeConfig = ((BaseUnityPlugin)this).Config.Bind<int>("Lobby Settings", "PrivateLobbyType", 0, new ConfigDescription("Private lobby type: 0=Normal, 1=FriendsOnly, 2=CrewOnly, 3=Solo", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 3), Array.Empty<object>()));
ApplyPrivateLobbyType(GetPrivateLobbyType());
_pluginFolder = Path.GetDirectoryName(((BaseUnityPlugin)this).Info.Location);
_acnPlusFolder = Path.Combine(Paths.BepInExRootPath, "ACNPlus");
_texturesFolder = Path.Combine(_acnPlusFolder, "Textures");
_friendsListPath = Path.Combine(_acnPlusFolder, "FriendsList.txt");
_blocklistPath = Path.Combine(_acnPlusFolder, "blocklist.txt");
Directory.CreateDirectory(_acnPlusFolder);
Directory.CreateDirectory(_texturesFolder);
if (!File.Exists(_friendsListPath))
{
File.WriteAllText(_friendsListPath, "");
}
if (!File.Exists(_blocklistPath))
{
File.WriteAllText(_blocklistPath, "");
}
LoadFriendsList();
LoadBlocklist();
_harmony = new Harmony("com.acn.acnplus");
_harmony.PatchAll();
ACNPlus.ChatBubble.ChatBubble.InitColorCache();
AppACNPlus.Initialize();
}
private void OnDestroy()
{
Harmony harmony = _harmony;
if (harmony != null)
{
harmony.UnpatchSelf();
}
}
private static void LoadFriendsList()
{
_friendsList.Clear();
if (!File.Exists(_friendsListPath))
{
return;
}
string[] array = File.ReadAllLines(_friendsListPath);
for (int i = 0; i < array.Length; i++)
{
string text = array[i].Trim();
if (!string.IsNullOrEmpty(text))
{
_friendsList.Add(text);
}
}
}
private static void LoadBlocklist()
{
_blocklist.Clear();
if (!File.Exists(_blocklistPath))
{
return;
}
string[] array = File.ReadAllLines(_blocklistPath);
for (int i = 0; i < array.Length; i++)
{
string text = array[i].Trim();
if (!string.IsNullOrEmpty(text))
{
_blocklist.Add(text);
}
}
}
public static HashSet<string> GetFriendsList()
{
return _friendsList;
}
public static string GetFriendsFolder()
{
return _acnPlusFolder;
}
public static string GetTexturesFolder()
{
return _texturesFolder;
}
public static HashSet<string> GetBlocklist()
{
return _blocklist;
}
public static string GetBlocklistPath()
{
return _blocklistPath;
}
public static void ReloadBlocklist()
{
LoadBlocklist();
}
public static string GetPluginFolder()
{
return _pluginFolder;
}
public static string GetBackendTexturesPath(string filename)
{
return Path.Combine(_pluginFolder, "backendtextures", filename);
}
public static Color GetChatBubbleColor()
{
//IL_0062: Unknown result type (might be due to invalid IL or missing references)
//IL_0060: Unknown result type (might be due to invalid IL or missing references)
string text = ChatBubbleColor?.Value?.Trim().TrimStart(new char[1] { '#' }) ?? "FFFFFF";
if (text.Length == 6)
{
text += "FF";
}
Color result = default(Color);
if (ColorUtility.TryParseHtmlString("#" + text, ref result))
{
return result;
}
return Color.white;
}
public static void ShowFriendGuideInChat()
{
ChatUI instance = ChatUI.Instance;
if (instance != null)
{
instance.AddMessage("<color=green>To add a friend, have them tell you their id, which they get from the \"/AddMe\" command.</color>");
}
ChatUI instance2 = ChatUI.Instance;
if (instance2 != null)
{
instance2.AddMessage("<color=green>Then you take that ID and use it in \"/AddFriend\". Example: \"/AddFriend 99\".</color>");
}
}
public static void RunChatCommand(string command)
{
if (!string.IsNullOrEmpty(command))
{
ChatUI instance = ChatUI.Instance;
if (!((Object)(object)instance == (Object)null))
{
((object)instance).GetType().GetMethod("ProcessLocalCommand", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, new Type[1] { typeof(string) }, null)?.Invoke(instance, new object[1] { command });
}
}
}
public static PrivateLobbyType GetPrivateLobbyType()
{
int num = PrivateLobbyTypeConfig?.Value ?? 0;
if (num < 0 || num > 3)
{
num = 0;
}
return (PrivateLobbyType)num;
}
public static void SetPrivateLobbyType(PrivateLobbyType type)
{
if (PrivateLobbyTypeConfig != null)
{
PrivateLobbyTypeConfig.Value = (int)type;
ApplyPrivateLobbyType(type);
}
}
public static void ApplyPrivateLobbyType(PrivateLobbyType type)
{
switch (type)
{
case PrivateLobbyType.Normal:
if (BlockPlayersFromJoiningLobby != null)
{
BlockPlayersFromJoiningLobby.Value = false;
}
if (FriendsOnlyLobby != null)
{
FriendsOnlyLobby.Value = false;
}
if (CrewOnlyLobby != null)
{
CrewOnlyLobby.Value = false;
}
break;
case PrivateLobbyType.FriendsOnly:
if (BlockPlayersFromJoiningLobby != null)
{
BlockPlayersFromJoiningLobby.Value = false;
}
if (FriendsOnlyLobby != null)
{
FriendsOnlyLobby.Value = true;
}
if (CrewOnlyLobby != null)
{
CrewOnlyLobby.Value = false;
}
break;
case PrivateLobbyType.CrewOnly:
if (BlockPlayersFromJoiningLobby != null)
{
BlockPlayersFromJoiningLobby.Value = false;
}
if (FriendsOnlyLobby != null)
{
FriendsOnlyLobby.Value = false;
}
if (CrewOnlyLobby != null)
{
CrewOnlyLobby.Value = true;
}
break;
case PrivateLobbyType.Solo:
if (BlockPlayersFromJoiningLobby != null)
{
BlockPlayersFromJoiningLobby.Value = true;
}
if (FriendsOnlyLobby != null)
{
FriendsOnlyLobby.Value = false;
}
if (CrewOnlyLobby != null)
{
CrewOnlyLobby.Value = false;
}
break;
}
}
}
public static class PluginInfo
{
public const string PLUGIN_GUID = "com.acn.acnplus";
public const string PLUGIN_NAME = "ACNPlus";
public const string PLUGIN_VERSION = "1.0.0";
}
public static class MyPluginInfo
{
public const string PLUGIN_GUID = "ACNPlus";
public const string PLUGIN_NAME = "ACNPlus";
public const string PLUGIN_VERSION = "1.0.0";
}
}
namespace ACNPlus.Phone
{
public class AppACNPlus : CustomApp
{
public static void Initialize()
{
//IL_0026: Unknown result type (might be due to invalid IL or missing references)
//IL_002c: Expected O, but got Unknown
//IL_0062: Unknown result type (might be due to invalid IL or missing references)
//IL_0071: Unknown result type (might be due to invalid IL or missing references)
Sprite val = null;
string backendTexturesPath = ACNPlusPlugin.GetBackendTexturesPath("AppIcon.png");
if (!string.IsNullOrEmpty(backendTexturesPath) && File.Exists(backendTexturesPath))
{
try
{
byte[] array = File.ReadAllBytes(backendTexturesPath);
Texture2D val2 = new Texture2D(2, 2);
if (ImageConversion.LoadImage(val2, array))
{
((Texture)val2).wrapMode = (TextureWrapMode)1;
((Texture)val2).filterMode = (FilterMode)1;
val2.Apply();
val = Sprite.Create(val2, new Rect(0f, 0f, (float)((Texture)val2).width, (float)((Texture)val2).height), new Vector2(0.5f, 0.5f));
}
}
catch
{
}
}
if ((Object)(object)val != (Object)null)
{
PhoneAPI.RegisterApp<AppACNPlus>("ACNPlus", val);
}
else
{
PhoneAPI.RegisterApp<AppACNPlus>("ACNPlus", (Sprite)null);
}
}
public override void OnAppInit()
{
((CustomApp)this).OnAppInit();
((CustomApp)this).CreateIconlessTitleBar("ACNPlus", 80f);
base.ScrollView = PhoneScrollView.Create((CustomApp)(object)this, 275f, 1600f);
PopulateButtons();
}
public override void OnAppEnable()
{
((App)this).OnAppEnable();
PopulateButtons();
}
private void PopulateButtons()
{
base.ScrollView.RemoveAllButtons();
SimplePhoneButton val = PhoneUIUtility.CreateSimpleButton("Friends List");
((PhoneButton)val).OnConfirm = (Action)Delegate.Combine(((PhoneButton)val).OnConfirm, new Action(ShowFriendsListMenu));
base.ScrollView.AddButton((PhoneButton)(object)val);
SimplePhoneButton val2 = PhoneUIUtility.CreateSimpleButton("Crews");
((PhoneButton)val2).OnConfirm = (Action)Delegate.Combine(((PhoneButton)val2).OnConfirm, new Action(ShowCrewsMenu));
base.ScrollView.AddButton((PhoneButton)(object)val2);
SimplePhoneButton val3 = PhoneUIUtility.CreateSimpleButton("Players In This Stage");
((PhoneButton)val3).OnConfirm = (Action)Delegate.Combine(((PhoneButton)val3).OnConfirm, new Action(ShowPlayersInStageView));
base.ScrollView.AddButton((PhoneButton)(object)val3);
SimplePhoneButton val4 = PhoneUIUtility.CreateSimpleButton("Lobby Settings");
((PhoneButton)val4).OnConfirm = (Action)Delegate.Combine(((PhoneButton)val4).OnConfirm, new Action(ShowLobbySettingsView));
base.ScrollView.AddButton((PhoneButton)(object)val4);
SimplePhoneButton val5 = PhoneUIUtility.CreateSimpleButton("Chat Settings");
((PhoneButton)val5).OnConfirm = (Action)Delegate.Combine(((PhoneButton)val5).OnConfirm, new Action(ShowChatSettingsView));
base.ScrollView.AddButton((PhoneButton)(object)val5);
SimplePhoneButton val6 = PhoneUIUtility.CreateSimpleButton("Customize");
((PhoneButton)val6).OnConfirm = (Action)Delegate.Combine(((PhoneButton)val6).OnConfirm, new Action(ShowCustomizeMenu));
base.ScrollView.AddButton((PhoneButton)(object)val6);
SimplePhoneButton val7 = PhoneUIUtility.CreateSimpleButton("Blocked List");
((PhoneButton)val7).OnConfirm = (Action)Delegate.Combine(((PhoneButton)val7).OnConfirm, new Action(ShowBlockedListView));
base.ScrollView.AddButton((PhoneButton)(object)val7);
SimplePhoneButton val8 = PhoneUIUtility.CreateSimpleButton("Extra");
((PhoneButton)val8).OnConfirm = (Action)Delegate.Combine(((PhoneButton)val8).OnConfirm, new Action(ShowExtraMenu));
base.ScrollView.AddButton((PhoneButton)(object)val8);
}
private void ShowExtraMenu()
{
base.ScrollView.RemoveAllButtons();
SimplePhoneButton val = PhoneUIUtility.CreateSimpleButton("Reset Props");
((PhoneButton)val).OnConfirm = (Action)Delegate.Combine(((PhoneButton)val).OnConfirm, (Action)delegate
{
PropDisguiseController instance = PropDisguiseController.Instance;
if ((Object)(object)instance != (Object)null)
{
instance.FreezeProps();
instance.UnfreezeProps();
}
});
base.ScrollView.AddButton((PhoneButton)(object)val);
SimplePhoneButton val2 = PhoneUIUtility.CreateSimpleButton("Back");
((PhoneButton)val2).OnConfirm = (Action)Delegate.Combine(((PhoneButton)val2).OnConfirm, new Action(PopulateButtons));
base.ScrollView.AddButton((PhoneButton)(object)val2);
}
private void ShowCrewsMenu()
{
base.ScrollView.RemoveAllButtons();
SimplePhoneButton val = PhoneUIUtility.CreateSimpleButton("Crews In This Stage");
((PhoneButton)val).OnConfirm = (Action)Delegate.Combine(((PhoneButton)val).OnConfirm, (Action)delegate
{
ACNPlusPlugin.RunChatCommand("/crews");
});
base.ScrollView.AddButton((PhoneButton)(object)val);
SimplePhoneButton val2 = PhoneUIUtility.CreateSimpleButton("My Crew");
((PhoneButton)val2).OnConfirm = (Action)Delegate.Combine(((PhoneButton)val2).OnConfirm, (Action)delegate
{
ACNPlusPlugin.RunChatCommand("/mycrew");
});
base.ScrollView.AddButton((PhoneButton)(object)val2);
SimplePhoneButton val3 = PhoneUIUtility.CreateSimpleButton("Back");
((PhoneButton)val3).OnConfirm = (Action)Delegate.Combine(((PhoneButton)val3).OnConfirm, new Action(PopulateButtons));
base.ScrollView.AddButton((PhoneButton)(object)val3);
}
private void ShowBlockedListView()
{
base.ScrollView.RemoveAllButtons();
HashSet<string> blocklist = ACNPlusPlugin.GetBlocklist();
if (blocklist.Count == 0)
{
SimplePhoneButton val = PhoneUIUtility.CreateSimpleButton("Your blocklist is empty.");
((PhoneButton)val).OnConfirm = (Action)Delegate.Combine(((PhoneButton)val).OnConfirm, (Action)delegate
{
});
base.ScrollView.AddButton((PhoneButton)(object)val);
}
else
{
List<string> list = new List<string>(blocklist);
list.Sort(StringComparer.OrdinalIgnoreCase);
foreach (string item in list)
{
SimplePhoneButton val2 = PhoneUIUtility.CreateSimpleButton(item);
string capturedName = item;
((PhoneButton)val2).OnConfirm = (Action)Delegate.Combine(((PhoneButton)val2).OnConfirm, (Action)delegate
{
ShowManageBlockedPlayerView(capturedName, ShowBlockedListView);
});
base.ScrollView.AddButton((PhoneButton)(object)val2);
}
}
SimplePhoneButton val3 = PhoneUIUtility.CreateSimpleButton("Back");
((PhoneButton)val3).OnConfirm = (Action)Delegate.Combine(((PhoneButton)val3).OnConfirm, new Action(PopulateButtons));
base.ScrollView.AddButton((PhoneButton)(object)val3);
}
private void ShowManageBlockedPlayerView(string playerName, Action backAction)
{
base.ScrollView.RemoveAllButtons();
SimplePhoneButton val = PhoneUIUtility.CreateSimpleButton(playerName);
((PhoneButton)val).OnConfirm = (Action)Delegate.Combine(((PhoneButton)val).OnConfirm, (Action)delegate
{
});
base.ScrollView.AddButton((PhoneButton)(object)val);
SimplePhoneButton val2 = PhoneUIUtility.CreateSimpleButton("Unblock");
((PhoneButton)val2).OnConfirm = (Action)Delegate.Combine(((PhoneButton)val2).OnConfirm, (Action)delegate
{
HashSet<string> blocklist = ACNPlusPlugin.GetBlocklist();
if (blocklist.Remove(playerName))
{
try
{
File.WriteAllLines(ACNPlusPlugin.GetBlocklistPath(), blocklist);
ACNPlusPlugin.ReloadBlocklist();
}
catch
{
}
}
backAction();
});
base.ScrollView.AddButton((PhoneButton)(object)val2);
SimplePhoneButton val3 = PhoneUIUtility.CreateSimpleButton("Back");
((PhoneButton)val3).OnConfirm = (Action)Delegate.Combine(((PhoneButton)val3).OnConfirm, backAction);
base.ScrollView.AddButton((PhoneButton)(object)val3);
}
private void ShowCustomizeMenu()
{
base.ScrollView.RemoveAllButtons();
SimplePhoneButton val = PhoneUIUtility.CreateSimpleButton("Mini Map");
((PhoneButton)val).OnConfirm = (Action)Delegate.Combine(((PhoneButton)val).OnConfirm, new Action(ShowMiniMapMenu));
base.ScrollView.AddButton((PhoneButton)(object)val);
SimplePhoneButton val2 = PhoneUIUtility.CreateSimpleButton("Lobby");
((PhoneButton)val2).OnConfirm = (Action)Delegate.Combine(((PhoneButton)val2).OnConfirm, new Action(ShowLobbyMenu));
base.ScrollView.AddButton((PhoneButton)(object)val2);
SimplePhoneButton val3 = PhoneUIUtility.CreateSimpleButton("Back");
((PhoneButton)val3).OnConfirm = (Action)Delegate.Combine(((PhoneButton)val3).OnConfirm, new Action(PopulateButtons));
base.ScrollView.AddButton((PhoneButton)(object)val3);
}
private void ShowLobbyMenu()
{
base.ScrollView.RemoveAllButtons();
SimplePhoneButton val = PhoneUIUtility.CreateSimpleButton("Transparent Lobby: " + (ACNPlusPlugin.TransparentLobbyBanner.Value ? "On" : "Off"));
((PhoneButton)val).OnConfirm = (Action)Delegate.Combine(((PhoneButton)val).OnConfirm, (Action)delegate
{
bool value = !ACNPlusPlugin.TransparentLobbyBanner.Value;
ACNPlusPlugin.TransparentLobbyBanner.Value = value;
ACNPlusPlugin.TransparentLobbyNameBG.Value = value;
ShowLobbyMenu();
});
base.ScrollView.AddButton((PhoneButton)(object)val);
SimplePhoneButton val2 = PhoneUIUtility.CreateSimpleButton("Back");
((PhoneButton)val2).OnConfirm = (Action)Delegate.Combine(((PhoneButton)val2).OnConfirm, new Action(ShowCustomizeMenu));
base.ScrollView.AddButton((PhoneButton)(object)val2);
}
private void ShowMiniMapMenu()
{
base.ScrollView.RemoveAllButtons();
SimplePhoneButton val = PhoneUIUtility.CreateSimpleButton("Custom Mini Map Image: " + (ACNPlusPlugin.ChangeMiniMapToPNG.Value ? "On" : "Off"));
((PhoneButton)val).OnConfirm = (Action)Delegate.Combine(((PhoneButton)val).OnConfirm, (Action)delegate
{
ACNPlusPlugin.ChangeMiniMapToPNG.Value = !ACNPlusPlugin.ChangeMiniMapToPNG.Value;
ShowMiniMapMenu();
});
base.ScrollView.AddButton((PhoneButton)(object)val);
SimplePhoneButton val2 = PhoneUIUtility.CreateSimpleButton("Cat Wizard Mini Map: " + (ACNPlusPlugin.CatWizardMiniMap.Value ? "On" : "Off"));
((PhoneButton)val2).OnConfirm = (Action)Delegate.Combine(((PhoneButton)val2).OnConfirm, (Action)delegate
{
ACNPlusPlugin.CatWizardMiniMap.Value = !ACNPlusPlugin.CatWizardMiniMap.Value;
ShowMiniMapMenu();
});
base.ScrollView.AddButton((PhoneButton)(object)val2);
SimplePhoneButton val3 = PhoneUIUtility.CreateSimpleButton("Back");
((PhoneButton)val3).OnConfirm = (Action)Delegate.Combine(((PhoneButton)val3).OnConfirm, new Action(ShowCustomizeMenu));
base.ScrollView.AddButton((PhoneButton)(object)val3);
}
private void ShowChatSettingsView()
{
base.ScrollView.RemoveAllButtons();
SimplePhoneButton val = PhoneUIUtility.CreateSimpleButton("Chat Bubbles: " + (ACNPlusPlugin.ShowChatBubbles.Value ? "On" : "Off"));
((PhoneButton)val).OnConfirm = (Action)Delegate.Combine(((PhoneButton)val).OnConfirm, (Action)delegate
{
ACNPlusPlugin.ShowChatBubbles.Value = !ACNPlusPlugin.ShowChatBubbles.Value;
ShowChatSettingsView();
});
base.ScrollView.AddButton((PhoneButton)(object)val);
SimplePhoneButton val2 = PhoneUIUtility.CreateSimpleButton("See When Something Is Blocked: " + (ACNPlusPlugin.SeeWhenSomethingIsBlocked.Value ? "On" : "Off"));
((PhoneButton)val2).OnConfirm = (Action)Delegate.Combine(((PhoneButton)val2).OnConfirm, (Action)delegate
{
ACNPlusPlugin.SeeWhenSomethingIsBlocked.Value = !ACNPlusPlugin.SeeWhenSomethingIsBlocked.Value;
ShowChatSettingsView();
});
base.ScrollView.AddButton((PhoneButton)(object)val2);
SimplePhoneButton val3 = PhoneUIUtility.CreateSimpleButton("See Block Invites: " + (ACNPlusPlugin.BlockInvitesChatMessage.Value ? "On" : "Off"));
((PhoneButton)val3).OnConfirm = (Action)Delegate.Combine(((PhoneButton)val3).OnConfirm, (Action)delegate
{
ACNPlusPlugin.BlockInvitesChatMessage.Value = !ACNPlusPlugin.BlockInvitesChatMessage.Value;
ShowChatSettingsView();
});
base.ScrollView.AddButton((PhoneButton)(object)val3);
SimplePhoneButton val4 = PhoneUIUtility.CreateSimpleButton("Back");
((PhoneButton)val4).OnConfirm = (Action)Delegate.Combine(((PhoneButton)val4).OnConfirm, new Action(PopulateButtons));
base.ScrollView.AddButton((PhoneButton)(object)val4);
}
private void ShowLobbySettingsView()
{
base.ScrollView.RemoveAllButtons();
SimplePhoneButton val = PhoneUIUtility.CreateSimpleButton("Private Lobby Type: " + GetPrivateLobbyTypeLabel());
((PhoneButton)val).OnConfirm = (Action)Delegate.Combine(((PhoneButton)val).OnConfirm, (Action)delegate
{
CyclePrivateLobbyType();
ShowLobbySettingsView();
});
base.ScrollView.AddButton((PhoneButton)(object)val);
SimplePhoneButton val2 = PhoneUIUtility.CreateSimpleButton("Block Invites: " + (ACNPlusPlugin.BlockInvites.Value ? "On" : "Off"));
((PhoneButton)val2).OnConfirm = (Action)Delegate.Combine(((PhoneButton)val2).OnConfirm, (Action)delegate
{
ACNPlusPlugin.BlockInvites.Value = !ACNPlusPlugin.BlockInvites.Value;
ShowLobbySettingsView();
});
base.ScrollView.AddButton((PhoneButton)(object)val2);
SimplePhoneButton val3 = PhoneUIUtility.CreateSimpleButton("Back");
((PhoneButton)val3).OnConfirm = (Action)Delegate.Combine(((PhoneButton)val3).OnConfirm, new Action(PopulateButtons));
base.ScrollView.AddButton((PhoneButton)(object)val3);
}
private static string GetPrivateLobbyTypeLabel()
{
return ACNPlusPlugin.GetPrivateLobbyType() switch
{
PrivateLobbyType.Normal => "Normal",
PrivateLobbyType.FriendsOnly => "Friends Only",
PrivateLobbyType.CrewOnly => "Crew Only",
PrivateLobbyType.Solo => "Solo",
_ => "Normal",
};
}
private static void CyclePrivateLobbyType()
{
ACNPlusPlugin.SetPrivateLobbyType(ACNPlusPlugin.GetPrivateLobbyType() switch
{
PrivateLobbyType.Normal => PrivateLobbyType.FriendsOnly,
PrivateLobbyType.FriendsOnly => PrivateLobbyType.CrewOnly,
PrivateLobbyType.CrewOnly => PrivateLobbyType.Solo,
PrivateLobbyType.Solo => PrivateLobbyType.Normal,
_ => PrivateLobbyType.Normal,
});
}
private void ShowPlayersInStageView()
{
base.ScrollView.RemoveAllButtons();
ClientController instance = ClientController.Instance;
if ((Object)(object)instance == (Object)null)
{
SimplePhoneButton val = PhoneUIUtility.CreateSimpleButton("Not connected to server.");
((PhoneButton)val).OnConfirm = (Action)Delegate.Combine(((PhoneButton)val).OnConfirm, (Action)delegate
{
});
base.ScrollView.AddButton((PhoneButton)(object)val);
}
else
{
int? num = null;
if (instance.Players.TryGetValue(instance.LocalID, out var value) && value?.ClientState != null)
{
num = value.ClientState.Stage;
}
List<string> list = new List<string>();
foreach (MPPlayer value2 in instance.Players.Values)
{
if (value2?.ClientState != null && value2.ClientId != instance.LocalID && (!num.HasValue || value2.ClientState.Stage == num.Value))
{
string name = value2.ClientState.Name;
if (!string.IsNullOrEmpty(name))
{
list.Add(name);
}
}
}
if (list.Count == 0)
{
SimplePhoneButton val2 = PhoneUIUtility.CreateSimpleButton("No players in this stage.");
((PhoneButton)val2).OnConfirm = (Action)Delegate.Combine(((PhoneButton)val2).OnConfirm, (Action)delegate
{
});
base.ScrollView.AddButton((PhoneButton)(object)val2);
}
else
{
foreach (string item in list)
{
SimplePhoneButton val3 = PhoneUIUtility.CreateSimpleButton(item);
string capturedName = item;
((PhoneButton)val3).OnConfirm = (Action)Delegate.Combine(((PhoneButton)val3).OnConfirm, (Action)delegate
{
ShowManagePlayerView(capturedName, ShowPlayersInStageView);
});
base.ScrollView.AddButton((PhoneButton)(object)val3);
}
}
}
SimplePhoneButton val4 = PhoneUIUtility.CreateSimpleButton("Back");
((PhoneButton)val4).OnConfirm = (Action)Delegate.Combine(((PhoneButton)val4).OnConfirm, new Action(PopulateButtons));
base.ScrollView.AddButton((PhoneButton)(object)val4);
}
private void ShowManagePlayerView(string playerName, Action backAction)
{
base.ScrollView.RemoveAllButtons();
SimplePhoneButton val = PhoneUIUtility.CreateSimpleButton(playerName);
((PhoneButton)val).OnConfirm = (Action)Delegate.Combine(((PhoneButton)val).OnConfirm, (Action)delegate
{
});
base.ScrollView.AddButton((PhoneButton)(object)val);
SimplePhoneButton val2 = PhoneUIUtility.CreateSimpleButton("Block Player");
((PhoneButton)val2).OnConfirm = (Action)Delegate.Combine(((PhoneButton)val2).OnConfirm, (Action)delegate
{
BlockPlayerOnlyAndGoBack(playerName, backAction);
});
base.ScrollView.AddButton((PhoneButton)(object)val2);
SimplePhoneButton val3 = PhoneUIUtility.CreateSimpleButton("Back");
((PhoneButton)val3).OnConfirm = (Action)Delegate.Combine(((PhoneButton)val3).OnConfirm, backAction);
base.ScrollView.AddButton((PhoneButton)(object)val3);
}
private void BlockPlayerOnlyAndGoBack(string playerName, Action backAction)
{
ClientController instance = ClientController.Instance;
string text = null;
if (instance?.Players != null && instance.Players.TryGetValue(instance.LocalID, out var value) && value?.ClientState != null)
{
text = value.ClientState.Name;
}
if (text != null && playerName == text)
{
backAction();
return;
}
try
{
if (!ACNPlusPlugin.GetBlocklist().Contains(playerName))
{
File.AppendAllText(ACNPlusPlugin.GetBlocklistPath(), playerName + Environment.NewLine);
ACNPlusPlugin.ReloadBlocklist();
}
}
catch
{
}
backAction();
}
private void ShowFriendsListMenu()
{
base.ScrollView.RemoveAllButtons();
SimplePhoneButton val = PhoneUIUtility.CreateSimpleButton("In This Stage");
((PhoneButton)val).OnConfirm = (Action)Delegate.Combine(((PhoneButton)val).OnConfirm, new Action(ShowFriendsInStageView));
base.ScrollView.AddButton((PhoneButton)(object)val);
SimplePhoneButton val2 = PhoneUIUtility.CreateSimpleButton("Full List");
((PhoneButton)val2).OnConfirm = (Action)Delegate.Combine(((PhoneButton)val2).OnConfirm, new Action(ShowFullFriendsListView));
base.ScrollView.AddButton((PhoneButton)(object)val2);
SimplePhoneButton val3 = PhoneUIUtility.CreateSimpleButton("Add Friend");
((PhoneButton)val3).OnConfirm = (Action)Delegate.Combine(((PhoneButton)val3).OnConfirm, (Action)delegate
{
ACNPlusPlugin.ShowFriendGuideInChat();
});
base.ScrollView.AddButton((PhoneButton)(object)val3);
SimplePhoneButton val4 = PhoneUIUtility.CreateSimpleButton("Back");
((PhoneButton)val4).OnConfirm = (Action)Delegate.Combine(((PhoneButton)val4).OnConfirm, new Action(PopulateButtons));
base.ScrollView.AddButton((PhoneButton)(object)val4);
}
private void ShowFriendsInStageView()
{
base.ScrollView.RemoveAllButtons();
HashSet<string> friendsList = ACNPlusPlugin.GetFriendsList();
ClientController instance = ClientController.Instance;
if (friendsList.Count == 0)
{
SimplePhoneButton val = PhoneUIUtility.CreateSimpleButton("Your friends list is empty.");
((PhoneButton)val).OnConfirm = (Action)Delegate.Combine(((PhoneButton)val).OnConfirm, (Action)delegate
{
});
base.ScrollView.AddButton((PhoneButton)(object)val);
}
else if ((Object)(object)instance == (Object)null)
{
SimplePhoneButton val2 = PhoneUIUtility.CreateSimpleButton("Not connected to server.");
((PhoneButton)val2).OnConfirm = (Action)Delegate.Combine(((PhoneButton)val2).OnConfirm, (Action)delegate
{
});
base.ScrollView.AddButton((PhoneButton)(object)val2);
}
else
{
ClientLobbyManager clientLobbyManager = instance.ClientLobbyManager;
List<string> list = new List<string>();
List<string> list2 = new List<string>();
foreach (MPPlayer value in instance.Players.Values)
{
if (value.ClientState == null)
{
continue;
}
string name = value.ClientState.Name;
if (!friendsList.Contains(name))
{
continue;
}
list.Add(name);
foreach (Lobby value2 in clientLobbyManager.Lobbies.Values)
{
if (value2.LobbyState.Players.ContainsKey(value.ClientId))
{
if (value2.LobbyState.InGame)
{
list2.Add(name);
}
break;
}
}
}
if (list.Count > 0)
{
HashSet<string> hashSet = new HashSet<string>(list2);
foreach (string item in list)
{
SimplePhoneButton val3 = PhoneUIUtility.CreateSimpleButton(hashSet.Contains(item) ? (item + " (in game)") : item);
string capturedName = item;
((PhoneButton)val3).OnConfirm = (Action)Delegate.Combine(((PhoneButton)val3).OnConfirm, (Action)delegate
{
ShowManageFriendView(capturedName, ShowFriendsInStageView);
});
base.ScrollView.AddButton((PhoneButton)(object)val3);
}
}
else
{
SimplePhoneButton val4 = PhoneUIUtility.CreateSimpleButton("No friends in this stage.");
((PhoneButton)val4).OnConfirm = (Action)Delegate.Combine(((PhoneButton)val4).OnConfirm, (Action)delegate
{
});
base.ScrollView.AddButton((PhoneButton)(object)val4);
}
}
SimplePhoneButton val5 = PhoneUIUtility.CreateSimpleButton("Back");
((PhoneButton)val5).OnConfirm = (Action)Delegate.Combine(((PhoneButton)val5).OnConfirm, new Action(ShowFriendsListMenu));
base.ScrollView.AddButton((PhoneButton)(object)val5);
}
private void ShowFullFriendsListView()
{
base.ScrollView.RemoveAllButtons();
HashSet<string> friendsList = ACNPlusPlugin.GetFriendsList();
if (friendsList.Count == 0)
{
SimplePhoneButton val = PhoneUIUtility.CreateSimpleButton("Your friends list is empty.");
((PhoneButton)val).OnConfirm = (Action)Delegate.Combine(((PhoneButton)val).OnConfirm, (Action)delegate
{
});
base.ScrollView.AddButton((PhoneButton)(object)val);
}
else
{
List<string> list = new List<string>(friendsList);
for (int i = 0; i < list.Count; i++)
{
string text = list[i];
SimplePhoneButton val2 = PhoneUIUtility.CreateSimpleButton($"{i + 1}. {text}");
string capturedName = text;
((PhoneButton)val2).OnConfirm = (Action)Delegate.Combine(((PhoneButton)val2).OnConfirm, (Action)delegate
{
ShowManageFriendView(capturedName, ShowFullFriendsListView);
});
base.ScrollView.AddButton((PhoneButton)(object)val2);
}
}
SimplePhoneButton val3 = PhoneUIUtility.CreateSimpleButton("Back");
((PhoneButton)val3).OnConfirm = (Action)Delegate.Combine(((PhoneButton)val3).OnConfirm, new Action(ShowFriendsListMenu));
base.ScrollView.AddButton((PhoneButton)(object)val3);
}
private void ShowManageFriendView(string friendName, Action backAction)
{
base.ScrollView.RemoveAllButtons();
SimplePhoneButton val = PhoneUIUtility.CreateSimpleButton(friendName);
((PhoneButton)val).OnConfirm = (Action)Delegate.Combine(((PhoneButton)val).OnConfirm, (Action)delegate
{
});
base.ScrollView.AddButton((PhoneButton)(object)val);
SimplePhoneButton val2 = PhoneUIUtility.CreateSimpleButton("Remove Friend");
((PhoneButton)val2).OnConfirm = (Action)Delegate.Combine(((PhoneButton)val2).OnConfirm, (Action)delegate
{
RemoveFriendAndGoBack(friendName, backAction);
});
base.ScrollView.AddButton((PhoneButton)(object)val2);
SimplePhoneButton val3 = PhoneUIUtility.CreateSimpleButton("Block Player");
((PhoneButton)val3).OnConfirm = (Action)Delegate.Combine(((PhoneButton)val3).OnConfirm, (Action)delegate
{
BlockPlayerAndGoBack(friendName, backAction);
});
base.ScrollView.AddButton((PhoneButton)(object)val3);
SimplePhoneButton val4 = PhoneUIUtility.CreateSimpleButton("Back");
((PhoneButton)val4).OnConfirm = (Action)Delegate.Combine(((PhoneButton)val4).OnConfirm, backAction);
base.ScrollView.AddButton((PhoneButton)(object)val4);
}
private void RemoveFriendAndGoBack(string friendName, Action backAction)
{
HashSet<string> friendsList = ACNPlusPlugin.GetFriendsList();
string path = Path.Combine(ACNPlusPlugin.GetFriendsFolder(), "FriendsList.txt");
try
{
friendsList.Remove(friendName);
File.WriteAllLines(path, friendsList);
}
catch
{
}
backAction();
}
private void BlockPlayerAndGoBack(string friendName, Action backAction)
{
HashSet<string> friendsList = ACNPlusPlugin.GetFriendsList();
string path = Path.Combine(ACNPlusPlugin.GetFriendsFolder(), "FriendsList.txt");
try
{
friendsList.Remove(friendName);
File.WriteAllLines(path, friendsList);
if (!ACNPlusPlugin.GetBlocklist().Contains(friendName))
{
File.AppendAllText(ACNPlusPlugin.GetBlocklistPath(), friendName + Environment.NewLine);
ACNPlusPlugin.ReloadBlocklist();
}
}
catch
{
}
backAction();
}
}
}
namespace ACNPlus.Patches
{
[HarmonyPatch(typeof(ChatUI), "HandleServerMessage")]
public class BlocklistChatPatch
{
[HarmonyPrefix]
public static bool HandleServerMessage_Prefix(ServerChat serverMessage)
{
if (serverMessage == null || string.IsNullOrEmpty(serverMessage.Author))
{
return true;
}
if (ACNPlusPlugin.GetBlocklist().Contains(serverMessage.Author))
{
if (ACNPlusPlugin.SeeWhenSomethingIsBlocked.Value)
{
ChatUI instance = ChatUI.Instance;
if (instance != null)
{
instance.AddMessage("<color=red>Blocked message from " + serverMessage.Author + "</color>");
}
}
return false;
}
return true;
}
}
[HarmonyPatch(typeof(ChatUI), "HandleServerMessage")]
public static class ChatBubblePatches
{
private static readonly Dictionary<ushort, ACNPlus.ChatBubble.ChatBubble> _bubbles = new Dictionary<ushort, ACNPlus.ChatBubble.ChatBubble>();
private static readonly Dictionary<string, ushort> _nameToId = new Dictionary<string, ushort>();
[HarmonyPostfix]
public static void HandleServerMessage_Postfix(ServerChat serverMessage)
{
//IL_0012: Unknown result type (might be due to invalid IL or missing references)
if (!ACNPlusPlugin.ShowChatBubbles.Value || serverMessage == null || (int)serverMessage.MessageType != 0 || string.IsNullOrEmpty(serverMessage.Author))
{
return;
}
ClientController instance = ClientController.Instance;
if ((Object)(object)instance == (Object)null)
{
return;
}
MPPlayer value = null;
if (_nameToId.TryGetValue(serverMessage.Author, out var value2))
{
instance.Players.TryGetValue(value2, out value);
if (value?.ClientState?.Name != serverMessage.Author)
{
_nameToId.Remove(serverMessage.Author);
value = null;
}
}
if (value == null)
{
foreach (MPPlayer value3 in instance.Players.Values)
{
if (value3.ClientState != null && value3.ClientState.Name == serverMessage.Author)
{
value = value3;
_nameToId[serverMessage.Author] = value3.ClientId;
break;
}
}
}
if (value != null && !((Object)(object)value.Player == (Object)null) && !value.Local)
{
ACNPlus.ChatBubble.ChatBubble orCreateBubble = GetOrCreateBubble(value);
if (!((Object)(object)orCreateBubble == (Object)null))
{
orCreateBubble.ShowMessage(serverMessage.Author + ": " + serverMessage.Message);
}
}
}
private static ACNPlus.ChatBubble.ChatBubble GetOrCreateBubble(MPPlayer player)
{
if (_bubbles.TryGetValue(player.ClientId, out var value))
{
if (Object.op_Implicit((Object)(object)value))
{
return value;
}
_bubbles.Remove(player.ClientId);
}
ACNPlus.ChatBubble.ChatBubble chatBubble = ACNPlus.ChatBubble.ChatBubble.Create(((Component)player.Player).transform);
_bubbles[player.ClientId] = chatBubble;
return chatBubble;
}
public static void RemoveBubble(ushort clientId)
{
if (_bubbles.TryGetValue(clientId, out var value))
{
if (Object.op_Implicit((Object)(object)value))
{
Object.Destroy((Object)(object)((Component)value).gameObject);
}
_bubbles.Remove(clientId);
}
List<string> list = new List<string>();
foreach (KeyValuePair<string, ushort> item in _nameToId)
{
if (item.Value == clientId)
{
list.Add(item.Key);
}
}
foreach (string item2 in list)
{
_nameToId.Remove(item2);
}
}
}
[HarmonyPatch(typeof(MPPlayer), "Delete")]
public static class MPPlayerDeletePatch
{
[HarmonyPostfix]
public static void Delete_Postfix(MPPlayer __instance)
{
ChatBubblePatches.RemoveBubble(__instance.ClientId);
}
}
[HarmonyPatch(typeof(ChatUI), "ProcessLocalCommand")]
public static class ChatCommandPatch
{
private static bool Prefix(ChatUI __instance, string message)
{
if (string.IsNullOrEmpty(message))
{
return true;
}
string[] array = message.Split(new char[1] { ' ' });
switch (array[0].ToLower())
{
case "/addme":
HandleAddMeCommand();
return false;
case "/addfriend":
if (array.Length < 2)
{
ChatUI instance4 = ChatUI.Instance;
if (instance4 != null)
{
instance4.AddMessage("<color=red>Usage: /addfriend <player_id></color>");
}
return false;
}
HandleAddFriendCommand(array[1]);
return false;
case "/friendslist":
HandleFriendsListCommand();
return false;
case "/removefriend":
if (array.Length < 2)
{
ChatUI instance3 = ChatUI.Instance;
if (instance3 != null)
{
instance3.AddMessage("<color=red>Usage: /removefriend <number></color>");
}
return false;
}
HandleRemoveFriendCommand(array[1]);
return false;
case "/friends":
HandleFriendsCommand();
return false;
case "/playershelp":
HandlePlayersHelpCommand();
return false;
case "/acnplushelp":
HandleACNPlusHelpCommand();
return false;
case "/friendguide":
HandleFriendGuideCommand();
return false;
case "/crews":
HandleCrewsCommand();
return false;
case "/mycrew":
HandleMyCrewCommand();
return false;
case "/listplayers":
HandleListPlayersCommand();
return false;
case "/block":
if (array.Length < 2)
{
ChatUI instance2 = ChatUI.Instance;
if (instance2 != null)
{
instance2.AddMessage("<color=red>Usage: /block <number></color>");
}
return false;
}
HandleBlockCommand(array[1]);
return false;
case "/unblock":
if (array.Length < 2)
{
ChatUI instance = ChatUI.Instance;
if (instance != null)
{
instance.AddMessage("<color=red>Usage: /unblock <number></color>");
}
return false;
}
HandleUnblockCommand(array[1]);
return false;
case "/blocklist":
HandleBlocklistCommand();
return false;
default:
return true;
}
}
private static void HandleAddMeCommand()
{
ClientController instance = ClientController.Instance;
if ((Object)(object)instance == (Object)null)
{
ChatUI instance2 = ChatUI.Instance;
if (instance2 != null)
{
instance2.AddMessage("<color=red>Not connected to server!</color>");
}
return;
}
ushort localID = instance.LocalID;
ChatUI instance3 = ChatUI.Instance;
if (instance3 != null)
{
instance3.AddMessage($"<color=green>Your Player ID: {localID}</color>");
}
}
private static void HandleAddFriendCommand(string playerIdStr)
{
if (!ushort.TryParse(playerIdStr, out var result))
{
ChatUI instance = ChatUI.Instance;
if (instance != null)
{
instance.AddMessage("<color=red>Invalid player ID! Must be a number.</color>");
}
return;
}
ClientController instance2 = ClientController.Instance;
if ((Object)(object)instance2 == (Object)null)
{
ChatUI instance3 = ChatUI.Instance;
if (instance3 != null)
{
instance3.AddMessage("<color=red>Not connected to server!</color>");
}
return;
}
if (result == instance2.LocalID)
{
ChatUI instance4 = ChatUI.Instance;
if (instance4 != null)
{
instance4.AddMessage("<color=red>You cannot add yourself as a friend!</color>");
}
return;
}
if (!instance2.Players.TryGetValue(result, out var value) || value.ClientState == null)
{
ChatUI instance5 = ChatUI.Instance;
if (instance5 != null)
{
instance5.AddMessage($"<color=red>Player with ID {result} not found!</color>");
}
return;
}
string name = value.ClientState.Name;
HashSet<string> friendsList = ACNPlusPlugin.GetFriendsList();
if (friendsList.Contains(name))
{
ChatUI instance6 = ChatUI.Instance;
if (instance6 != null)
{
instance6.AddMessage("<color=yellow>" + name + " is already in your friends list!</color>");
}
return;
}
string path = Path.Combine(ACNPlusPlugin.GetFriendsFolder(), "FriendsList.txt");
try
{
File.AppendAllText(path, name + Environment.NewLine);
friendsList.Add(name);
ChatUI instance7 = ChatUI.Instance;
if (instance7 != null)
{
instance7.AddMessage("<color=green>Added " + name + " to your friends list!</color>");
}
}
catch (Exception)
{
ChatUI instance8 = ChatUI.Instance;
if (instance8 != null)
{
instance8.AddMessage("<color=red>Failed to save friend to list!</color>");
}
}
}
private static void HandleFriendsListCommand()
{
HashSet<string> friendsList = ACNPlusPlugin.GetFriendsList();
if (friendsList.Count == 0)
{
ChatUI instance = ChatUI.Instance;
if (instance != null)
{
instance.AddMessage("<color=yellow>Your friends list is empty!</color>");
}
ChatUI instance2 = ChatUI.Instance;
if (instance2 != null)
{
instance2.AddMessage("<color=white>Use /addfriend <player_id> to add friends</color>");
}
return;
}
ChatUI instance3 = ChatUI.Instance;
if (instance3 != null)
{
instance3.AddMessage("<color=green>=== Friends List ===</color>");
}
string[] array = friendsList.ToArray();
for (int i = 0; i < array.Length; i++)
{
ChatUI instance4 = ChatUI.Instance;
if (instance4 != null)
{
instance4.AddMessage($"<color=white>{i + 1}. {array[i]}</color>");
}
}
ChatUI instance5 = ChatUI.Instance;
if (instance5 != null)
{
instance5.AddMessage($"<color=green>Total: {friendsList.Count} friends</color>");
}
}
private static void HandleRemoveFriendCommand(string numberStr)
{
if (!int.TryParse(numberStr, out var result) || result < 1)
{
ChatUI instance = ChatUI.Instance;
if (instance != null)
{
instance.AddMessage("<color=red>Invalid number! Must be a positive number.</color>");
}
return;
}
HashSet<string> friendsList = ACNPlusPlugin.GetFriendsList();
if (friendsList.Count == 0)
{
ChatUI instance2 = ChatUI.Instance;
if (instance2 != null)
{
instance2.AddMessage("<color=yellow>Your friends list is empty!</color>");
}
return;
}
if (result > friendsList.Count)
{
ChatUI instance3 = ChatUI.Instance;
if (instance3 != null)
{
instance3.AddMessage($"<color=red>Invalid number! You only have {friendsList.Count} friends.</color>");
}
return;
}
string text = friendsList.ToArray()[result - 1];
string path = Path.Combine(ACNPlusPlugin.GetFriendsFolder(), "FriendsList.txt");
try
{
friendsList.Remove(text);
File.WriteAllLines(path, friendsList);
ChatUI instance4 = ChatUI.Instance;
if (instance4 != null)
{
instance4.AddMessage("<color=green>Removed " + text + " from your friends list!</color>");
}
}
catch (Exception)
{
ChatUI instance5 = ChatUI.Instance;
if (instance5 != null)
{
instance5.AddMessage("<color=red>Failed to remove friend from list!</color>");
}
}
}
private static void HandleFriendsCommand()
{
HashSet<string> friendsList = ACNPlusPlugin.GetFriendsList();
if (friendsList.Count == 0)
{
ChatUI instance = ChatUI.Instance;
if (instance != null)
{
instance.AddMessage("<color=yellow>Your friends list is empty!</color>");
}
return;
}
ClientController instance2 = ClientController.Instance;
if ((Object)(object)instance2 == (Object)null)
{
ChatUI instance3 = ChatUI.Instance;
if (instance3 != null)
{
instance3.AddMessage("<color=red>Not connected to server!</color>");
}
return;
}
ClientLobbyManager clientLobbyManager = instance2.ClientLobbyManager;
List<string> list = new List<string>();
List<string> list2 = new List<string>();
foreach (MPPlayer value in instance2.Players.Values)
{
if (value.ClientState == null)
{
continue;
}
string name = value.ClientState.Name;
if (!friendsList.Contains(name))
{
continue;
}
list.Add(name);
foreach (Lobby value2 in clientLobbyManager.Lobbies.Values)
{
if (value2.LobbyState.Players.ContainsKey(value.ClientId))
{
if (value2.LobbyState.InGame)
{
list2.Add(name);
}
break;
}
}
}
if (list.Count > 0)
{
string text = "<color=green>Friends Online: " + string.Join(", ", list) + "</color>";
ChatUI instance4 = ChatUI.Instance;
if (instance4 != null)
{
instance4.AddMessage(text);
}
if (list2.Count > 0)
{
string text2 = "<color=yellow>In Game: " + string.Join(", ", list2) + "</color>";
ChatUI instance5 = ChatUI.Instance;
if (instance5 != null)
{
instance5.AddMessage(text2);
}
}
}
else
{
ChatUI instance6 = ChatUI.Instance;
if (instance6 != null)
{
instance6.AddMessage("<color=yellow>No friends are currently online.</color>");
}
}
}
private static void HandlePlayersHelpCommand()
{
ChatUI instance = ChatUI.Instance;
if (instance != null)
{
instance.AddMessage("<color=green>=== ACNPlus Commands ===</color>");
}
ChatUI instance2 = ChatUI.Instance;
if (instance2 != null)
{
instance2.AddMessage("<color=white>/addme - Display your player ID</color>");
}
ChatUI instance3 = ChatUI.Instance;
if (instance3 != null)
{
instance3.AddMessage("<color=white>/addfriend <id> - Add a friend (e.g., /addfriend 51)</color>");
}
ChatUI instance4 = ChatUI.Instance;
if (instance4 != null)
{
instance4.AddMessage("<color=white>/friendslist - View all friends with numbers</color>");
}
ChatUI instance5 = ChatUI.Instance;
if (instance5 != null)
{
instance5.AddMessage("<color=white>/removefriend <number> - Remove a friend</color>");
}
ChatUI instance6 = ChatUI.Instance;
if (instance6 != null)
{
instance6.AddMessage("<color=white>/friends - Check which friends are online</color>");
}
ChatUI instance7 = ChatUI.Instance;
if (instance7 != null)
{
instance7.AddMessage("<color=white>/crews - View all crews in your current stage</color>");
}
ChatUI instance8 = ChatUI.Instance;
if (instance8 != null)
{
instance8.AddMessage("<color=white>/mycrew - View your crew members in your stage</color>");
}
ChatUI instance9 = ChatUI.Instance;
if (instance9 != null)
{
instance9.AddMessage("<color=white>/listplayers - List all online players</color>");
}
ChatUI instance10 = ChatUI.Instance;
if (instance10 != null)
{
instance10.AddMessage("<color=white>/block <number> - Block a player</color>");
}
ChatUI instance11 = ChatUI.Instance;
if (instance11 != null)
{
instance11.AddMessage("<color=white>/unblock <number> - Unblock a player</color>");
}
ChatUI instance12 = ChatUI.Instance;
if (instance12 != null)
{
instance12.AddMessage("<color=white>/blocklist - View all blocked players</color>");
}
ChatUI instance13 = ChatUI.Instance;
if (instance13 != null)
{
instance13.AddMessage("<color=white>/friendguide - Show how to add friends</color>");
}
ChatUI instance14 = ChatUI.Instance;
if (instance14 != null)
{
instance14.AddMessage("<color=white>/playershelp - Show this help message</color>");
}
}
private static void HandleACNPlusHelpCommand()
{
ChatUI instance = ChatUI.Instance;
if (instance != null)
{
instance.AddMessage("<color=green>=== ACNPlus Help ===</color>");
}
ChatUI instance2 = ChatUI.Instance;
if (instance2 != null)
{
instance2.AddMessage("<color=white>/playershelp - Show player system commands</color>");
}
ChatUI instance3 = ChatUI.Instance;
if (instance3 != null)
{
instance3.AddMessage("<color=white>/acnplushelp - Show this help message</color>");
}
}
private static void HandleFriendGuideCommand()
{
ACNPlusPlugin.ShowFriendGuideInChat();
}
private static void HandleCrewsCommand()
{
//IL_0024: Unknown result type (might be due to invalid IL or missing references)
//IL_0029: Unknown result type (might be due to invalid IL or missing references)
//IL_0032: Unknown result type (might be due to invalid IL or missing references)
//IL_0038: Expected I4, but got Unknown
ClientController instance = ClientController.Instance;
if ((Object)(object)instance == (Object)null)
{
ChatUI instance2 = ChatUI.Instance;
if (instance2 != null)
{
instance2.AddMessage("<color=red>Not connected to server!</color>");
}
return;
}
Scene activeScene = SceneManager.GetActiveScene();
int num = (int)Utility.SceneNameToStage(((Scene)(ref activeScene)).name);
Dictionary<string, int> dictionary = new Dictionary<string, int>();
Dictionary<string, int> dictionary2 = new Dictionary<string, int>();
foreach (MPPlayer value in instance.Players.Values)
{
if (value.ClientState == null || value.ClientState.Stage != num)
{
continue;
}
bool flag = false;
if (value.ClientState.User != null && value.ClientState.User.Badges != null)
{
if (value.ClientState.User.Badges.Contains(63))
{
string key = "GCN";
if (dictionary2.ContainsKey(key))
{
dictionary2[key]++;
}
else
{
dictionary2[key] = 1;
}
flag = true;
}
if (value.ClientState.User.Badges.Contains(40))
{
string key2 = "Goonforce";
if (dictionary2.ContainsKey(key2))
{
dictionary2[key2]++;
}
else
{
dictionary2[key2] = 1;
}
flag = true;
}
if (value.ClientState.User.Badges.Contains(52))
{
string key3 = "rok";
if (dictionary2.ContainsKey(key3))
{
dictionary2[key3]++;
}
else
{
dictionary2[key3] = 1;
}
flag = true;
}
if (value.ClientState.User.Badges.Contains(28))
{
string key4 = "dumfuks";
if (dictionary2.ContainsKey(key4))
{
dictionary2[key4]++;
}
else
{
dictionary2[key4] = 1;
}
flag = true;
}
}
if (!flag)
{
string key5 = (string.IsNullOrEmpty(value.ClientState.CrewName) ? "No Crew" : value.ClientState.CrewName);
if (dictionary.ContainsKey(key5))
{
dictionary[key5]++;
}
else
{
dictionary[key5] = 1;
}
}
}
if (dictionary.Count == 0 && dictionary2.Count == 0)
{
ChatUI instance3 = ChatUI.Instance;
if (instance3 != null)
{
instance3.AddMessage("<color=yellow>No players in your current stage!</color>");
}
return;
}
ChatUI instance4 = ChatUI.Instance;
if (instance4 != null)
{
instance4.AddMessage($"<color=green>=== Crews in Stage {num} ===</color>");
}
if (dictionary2.Count > 0)
{
foreach (KeyValuePair<string, int> item in dictionary2.OrderByDescending((KeyValuePair<string, int> x) => x.Value))
{
string arg = ((item.Value == 1) ? "member" : "members");
if (item.Key == "GCN")
{
ChatUI instance5 = ChatUI.Instance;
if (instance5 != null)
{
instance5.AddMessage($"<sprite=63> <color=purple>GCN</color><color=white>: {item.Value} {arg}</color>");
}
}
else if (item.Key == "Goonforce")
{
ChatUI instance6 = ChatUI.Instance;
if (instance6 != null)
{
instance6.AddMessage($"<sprite=40> <color=blue>Goon</color><color=red>force</color><color=white>: {item.Value} {arg}</color>");
}
}
else if (item.Key == "rok")
{
ChatUI instance7 = ChatUI.Instance;
if (instance7 != null)
{
instance7.AddMessage($"<sprite=52> <color=#997777>rok</color><color=white>: {item.Value} {arg}</color>");
}
}
else if (item.Key == "dumfuks")
{
ChatUI instance8 = ChatUI.Instance;
if (instance8 != null)
{
instance8.AddMessage($"<sprite=28> <color=yellow>dumfuks</color><color=white>: {item.Value} {arg}</color>");
}
}
}
if (dictionary.Count > 0)
{
ChatUI instance9 = ChatUI.Instance;
if (instance9 != null)
{
instance9.AddMessage("<color=white>---</color>");
}
}
}
foreach (KeyValuePair<string, int> item2 in dictionary.OrderByDescending((KeyValuePair<string, int> x) => x.Value))
{
string arg2 = ((item2.Value == 1) ? "member" : "members");
ChatUI instance10 = ChatUI.Instance;
if (instance10 != null)
{
instance10.AddMessage($"<color=white>{item2.Key}: {item2.Value} {arg2}</color>");
}
}
int num2 = dictionary.Values.Sum() + dictionary2.Values.Sum();
ChatUI instance11 = ChatUI.Instance;
if (instance11 != null)
{
instance11.AddMessage($"<color=green>Total: {num2} players</color>");
}
}
private static void HandleMyCrewCommand()
{
//IL_0074: Unknown result type (might be due to invalid IL or missing references)
//IL_0079: Unknown result type (might be due to invalid IL or missing references)
//IL_0082: Unknown result type (might be due to invalid IL or missing references)
//IL_0088: Expected I4, but got Unknown
ClientController instance = ClientController.Instance;
if ((Object)(object)instance == (Object)null)
{
ChatUI instance2 = ChatUI.Instance;
if (instance2 != null)
{
instance2.AddMessage("<color=red>Not connected to server!</color>");
}
return;
}
MPPlayer val = ((IEnumerable<MPPlayer>)instance.Players.Values).FirstOrDefault((Func<MPPlayer, bool>)((MPPlayer p) => p.Local));
if (val == null || val.ClientState == null)
{
ChatUI instance3 = ChatUI.Instance;
if (instance3 != null)
{
instance3.AddMessage("<color=red>Could not find local player!</color>");
}
return;
}
Scene activeScene = SceneManager.GetActiveScene();
int num = (int)Utility.SceneNameToStage(((Scene)(ref activeScene)).name);
string crewName = val.ClientState.CrewName;
bool flag = false;
string text = "";
int num2 = 0;
if (val.ClientState.User != null && val.ClientState.User.Badges != null)
{
if (val.ClientState.User.Badges.Contains(63))
{
flag = true;
text = "GCN";
num2 = 63;
}
else if (val.ClientState.User.Badges.Contains(40))
{
flag = true;
text = "Goonforce";
num2 = 40;
}
else if (val.ClientState.User.Badges.Contains(52))
{
flag = true;
text = "rok";
num2 = 52;
}
else if (val.ClientState.User.Badges.Contains(28))
{
flag = true;
text = "dumfuks";
num2 = 28;
}
}
if (!flag)
{
string playerDisplayName = MPUtility.GetPlayerDisplayName(val.ClientState);
if (playerDisplayName.Contains("<sprite=63>"))
{
flag = true;
text = "GCN";
num2 = 63;
}
else if (playerDisplayName.Contains("<sprite=40>"))
{
flag = true;
text = "Goonforce";
num2 = 40;
}
else if (playerDisplayName.Contains("<sprite=52>"))
{
flag = true;
text = "rok";
num2 = 52;
}
else if (playerDisplayName.Contains("<sprite=28>"))
{
flag = true;
text = "dumfuks";
num2 = 28;
}
}
if (!flag && string.IsNullOrEmpty(crewName))
{
ChatUI instance4 = ChatUI.Instance;
if (instance4 != null)
{
instance4.AddMessage("<color=yellow>You are not in a crew!</color>");
}
return;
}
List<string> list = new List<string>();
foreach (MPPlayer value in instance.Players.Values)
{
if (value.ClientState == null || value.ClientId == instance.LocalID || value.ClientState.Stage != num)
{
continue;
}
if (flag)
{
bool flag2 = false;
if (value.ClientState.User != null && value.ClientState.User.Badges != null && value.ClientState.User.Badges.Contains(num2))
{
flag2 = true;
}
if (!flag2 && MPUtility.GetPlayerDisplayName(value.ClientState).Contains($"<sprite={num2}>"))
{
flag2 = true;
}
if (flag2)
{
list.Add(value.ClientState.Name);
}
}
else if (value.ClientState.CrewName == crewName)
{
list.Add(value.ClientState.Name);
}
}
if (list.Count == 0)
{
if (flag)
{
switch (text)
{
case "GCN":
{
ChatUI instance8 = ChatUI.Instance;
if (instance8 != null)
{
instance8.AddMessage("<color=yellow>No other <sprite=63> <color=purple>GCN</color> crew members in your stage!</color>");
}
break;
}
case "Goonforce":
{
ChatUI instance6 = ChatUI.Instance;
if (instance6 != null)
{
instance6.AddMessage("<color=yellow>No other <sprite=40> <color=blue>Goon</color><color=red>force</color> crew members in your stage!</color>");
}
break;
}
case "rok":
{
ChatUI instance7 = ChatUI.Instance;
if (instance7 != null)
{
instance7.AddMessage("<color=yellow>No other <sprite=52> <color=#997777>rok</color> crew members in your stage!</color>");
}
break;
}
case "dumfuks":
{
ChatUI instance5 = ChatUI.Instance;
if (instance5 != null)
{
instance5.AddMessage("<color=yellow>No other <sprite=28> <color=yellow>dumfuks</color> crew members in your stage!</color>");
}
break;
}
}
}
else
{
ChatUI instance9 = ChatUI.Instance;
if (instance9 != null)
{
instance9.AddMessage("<color=yellow>No other " + crewName + " crew members in your stage!</color>");
}
}
return;
}
if (flag)
{
switch (text)
{
case "GCN":
{
ChatUI instance13 = ChatUI.Instance;
if (instance13 != null)
{
instance13.AddMessage($"<sprite=63> <color=purple>GCN</color><color=green> Members in Stage {num} ===</color>");
}
break;
}
case "Goonforce":
{
ChatUI instance11 = ChatUI.Instance;
if (instance11 != null)
{
instance11.AddMessage($"<sprite=40> <color=blue>Goon</color><color=red>force</color><color=green> Members in Stage {num} ===</color>");
}
break;
}
case "rok":
{
ChatUI instance12 = ChatUI.Instance;
if (instance12 != null)
{
instance12.AddMessage($"<sprite=52> <color=#997777>rok</color><color=green> Members in Stage {num} ===</color>");
}
break;
}
case "dumfuks":
{
ChatUI instance10 = ChatUI.Instance;
if (instance10 != null)
{
instance10.AddMessage($"<sprite=28> <color=yellow>dumfuks</color><color=green> Members in Stage {num} ===</color>");
}
break;
}
}
}
else
{
ChatUI instance14 = ChatUI.Instance;
if (instance14 != null)
{
instance14.AddMessage($"<color=green>=== {crewName} Members in Stage {num} ===</color>");
}
}
foreach (string item in list.OrderBy((string x) => x))
{
ChatUI instance15 = ChatUI.Instance;
if (instance15 != null)
{
instance15.AddMessage("<color=white>• " + item + "</color>");
}
}
string arg = ((list.Count == 1) ? "member" : "members");
ChatUI instance16 = ChatUI.Instance;
if (instance16 != null)
{
instance16.AddMessage($"<color=green>Total: {list.Count} {arg}</color>");
}
}
private static void HandleListPlayersCommand()
{
ClientController instance = ClientController.Instance;
if ((Object)(object)instance == (Object)null)
{
ChatUI instance2 = ChatUI.Instance;
if (instance2 != null)
{
instance2.AddMessage("<color=red>Not connected to server!</color>");
}
return;
}
List<MPPlayer> list = (from p in instance.Players.Values
where p.ClientState != null
orderby p.ClientState.Name
select p).ToList();
if (list.Count == 0)
{
ChatUI instance3 = ChatUI.Instance;
if (instance3 != null)
{
instance3.AddMessage("<color=yellow>No players online!</color>");
}
return;
}
ChatUI instance4 = ChatUI.Instance;
if (instance4 != null)
{
instance4.AddMessage("<color=green>=== All Players ===</color>");
}
for (int i = 0; i < list.Count; i++)
{
MPPlayer val = list[i];
string arg = (ACNPlusPlugin.GetBlocklist().Contains(val.ClientState.Name) ? " <color=red>[BLOCKED]</color>" : "");
ChatUI instance5 = ChatUI.Instance;
if (instance5 != null)
{
instance5.AddMessage($"<color=white>{i + 1}. {val.ClientState.Name}{arg}</color>");
}
}
ChatUI instance6 = ChatUI.Instance;
if (instance6 != null)
{
instance6.AddMessage($"<color=green>Total: {list.Count} players</color>");
}
}
private static void HandleBlockCommand(string numberStr)
{
if (!int.TryParse(numberStr, out var result) || result < 1)
{
ChatUI instance = ChatUI.Instance;
if (instance != null)
{
instance.AddMessage("<color=red>Invalid number! Must be a positive number.</color>");
}
return;
}
ClientController instance2 = ClientController.Instance;
if ((Object)(object)instance2 == (Object)null)
{
ChatUI instance3 = ChatUI.Instance;
if (instance3 != null)
{
instance3.AddMessage("<color=red>Not connected to server!</color>");
}
return;
}
List<MPPlayer> list = (from p in instance2.Players.Values
where p.ClientState != null
orderby p.ClientState.Name
select p).ToList();
if (result > list.Count)
{
ChatUI instance4 = ChatUI.Instance;
if (instance4 != null)
{
instance4.AddMessage($"<color=red>Invalid number! Only {list.Count} players online.</color>");
}
return;
}
MPPlayer obj = list[result - 1];
string name = obj.ClientState.Name;
if (obj.ClientId == instance2.LocalID)
{
ChatUI instance5 = ChatUI.Instance;
if (instance5 != null)
{
instance5.AddMessage("<color=red>You cannot block yourself!</color>");
}
return;
}
if (ACNPlusPlugin.GetBlocklist().Contains(name))
{
ChatUI instance6 = ChatUI.Instance;
if (instance6 != null)
{
instance6.AddMessage("<color=yellow>" + name + " is already blocked!</color>");
}
return;
}
try
{
File.AppendAllText(ACNPlusPlugin.GetBlocklistPath(), name + Environment.NewLine);
ACNPlusPlugin.ReloadBlocklist();
ChatUI instance7 = ChatUI.Instance;
if (instance7 != null)
{
instance7.AddMessage("<color=green>Blocked " + name + "!</color>");
}
}
catch (Exception)
{
ChatUI instance8 = ChatUI.Instance;
if (instance8 != null)
{
instance8.AddMessage("<color=red>Failed to save to blocklist!</color>");
}
}
}
private static void HandleUnblockCommand(string numberStr)
{
if (!int.TryParse(numberStr, out var result) || result < 1)
{
ChatUI instance = ChatUI.Instance;
if (instance != null)
{
instance.AddMessage("<color=red>Invalid number! Must be a positive number.</color>");
}
return;
}
HashSet<string> blocklist = ACNPlusPlugin.GetBlocklist();
if (blocklist.Count == 0)
{
ChatUI instance2 = ChatUI.Instance;
if (instance2 != null)
{
instance2.AddMessage("<color=yellow>Your blocklist is empty!</color>");
}
return;
}
if (result > blocklist.Count)
{
ChatUI instance3 = ChatUI.Instance;
if (instance3 != null)
{
instance3.AddMessage($"<color=red>Invalid number! You only have {blocklist.Count} blocked users.</color>");
}
return;
}
string text = blocklist.ToArray()[result - 1];
try
{
blocklist.Remove(text);
File.WriteAllLines(ACNPlusPlugin.GetBlocklistPath(), blocklist);
ACNPlusPlugin.ReloadBlocklist();
ChatUI instance4 = ChatUI.Instance;
if (instance4 != null)
{
instance4.AddMessage("<color=green>Unblocked " + text + "!</color>");
}
}
catch (Exception)
{
ChatUI instance5 = ChatUI.Instance;
if (instance5 != null)
{
instance5.AddMessage("<color=red>Failed to update blocklist!</color>");
}
}
}
private static void HandleBlocklistCommand()
{
HashSet<string> blocklist = ACNPlusPlugin.GetBlocklist();
if (blocklist.Count == 0)
{
ChatUI instance = ChatUI.Instance;
if (instance != null)
{
instance.AddMessage("<color=yellow>Your blocklist is empty!</color>");
}
return;
}
ChatUI instance2 = ChatUI.Instance;
if (instance2 != null)
{
instance2.AddMessage("<color=green>=== Blocked Players ===</color>");
}
string[] array = blocklist.ToArray();
for (int i = 0; i < array.Length; i++)
{
ChatUI instance3 = ChatUI.Instance;
if (instance3 != null)
{
instance3.AddMessage($"<color=white>{i + 1}. {array[i]}</color>");
}
}
ChatUI instance4 = ChatUI.Instance;
if (instance4 != null)
{
instance4.AddMessage($"<color=green>Total: {blocklist.Count} blocked</color>");
}
}
}
public class FriendsListPatches
{
}
public static class LobbyBannerPatches
{
[HarmonyPatch(typeof(LobbyUI), "UpdateUI")]
private class LobbyUIUpdateUIPatch
{
private static void Postfix(LobbyUI __instance)
{
FieldInfo field = typeof(LobbyUI).GetField("_lobbySettings", BindingFlags.Instance | BindingFlags.NonPublic);
if (!(field == null))
{
object? value = field.GetValue(__instance);
Component val = (Component)((value is Component) ? value : null);
if ((Object)(object)val != (Object)null)
{
val.gameObject.SetActive(!ACNPlusPlugin.HideLobbySettings.Value);
}
}
}
}
[HarmonyPatch(typeof(LobbyUI), "Awake")]
private class LobbyUIAwakePatch
{
private static void Postfix(LobbyUI __instance)
{
//IL_00f3: Unknown result type (might be due to invalid IL or missing references)
FieldInfo field = typeof(LobbyUI).GetField("_lobbySettings", BindingFlags.Instance | BindingFlags.NonPublic);
if (field != null)
{
object? value = field.GetValue(__instance);
Component val = (Component)((value is Component) ? value : null);
if (val != null)
{
val.gameObject.SetActive(!ACNPlusPlugin.HideLobbySettings.Value);
}
}
if (!ACNPlusPlugin.TransparentLobbyBanner.Value)
{
return;
}
Sprite val2 = LoadTransparentSprite();
if ((Object)(object)val2 == (Object)null)
{
return;
}
FieldInfo field2 = typeof(LobbyUI).GetField("_canvas", BindingFlags.Instance | BindingFlags.NonPublic);
if (field2 == null)
{
return;
}
object? value2 = field2.GetValue(__instance);
GameObject val3 = (GameObject)((value2 is GameObject) ? value2 : null);
if ((Object)(object)val3 == (Object)null)
{
return;
}
Transform val4 = val3.transform.Find("Lobby Name BG");
if ((Object)(object)val4 == (Object)null)
{
return;
}
Type type = Type.GetType("UnityEngine.UI.Image, UnityEngine.UI");
if (!(type == null))
{
Component component = ((Component)val4).GetComponent(type);
if ((Object)(object)component != (Object)null)
{
SetImageSprite(component, val2);
SetImageColor(component, Color.white);
}
}
}
}
[HarmonyPatch(typeof(LobbyPlayerUI), "Awake")]
private class LobbyPlayerUIAwakePatch
{
private static void Postfix(LobbyPlayerUI __instance)
{
if (!ACNPlusPlugin.TransparentLobbyNameBG.Value)
{
return;
}
Sprite val = LoadTransparentSprite();
if (!((Object)(object)val == (Object)null))
{
FieldInfo? field = typeof(LobbyPlayerUI).GetField("_bg", BindingFlags.Instance | BindingFlags.NonPublic);
FieldInfo field2 = typeof(LobbyPlayerUI).GetField("_teamBg", BindingFlags.Instance | BindingFlags.NonPublic);
object obj = field?.GetValue(__instance);
object obj2 = field2?.GetValue(__instance);
if (obj != null)
{
SetImageSprite(obj, val);
}
if (obj2 != null)
{
SetImageSprite(obj2, val);
}
}
}
}
[HarmonyPatch(typeof(LobbyPlayerUI), "SetTeam")]
private class LobbyPlayerUISetTeamPatch
{
private static void Postfix(LobbyPlayerUI __instance)
{
//IL_004c: Unknown result type (might be due to invalid IL or missing references)
if (ACNPlusPlugin.TransparentLobbyNameBG.Value)
{
object obj = typeof(LobbyPlayerUI).GetField("_teamBg", BindingFlags.Instance | BindingFlags.NonPublic)?.GetValue(__instance);
if (obj != null)
{
float imageColorA = GetImageColorA(obj);
SetImageColor(obj, new Color(1f, 1f, 1f, imageColorA));
}
}
}
}
[HarmonyPatch(typeof(LobbyPlayerUI), "SetPlayer")]
private class LobbyPlayerUISetPlayerPatch
{
private static void Postfix(LobbyPlayerUI __instance)
{
//IL_004c: Unknown result type (might be due to invalid IL or missing references)
if (ACNPlusPlugin.TransparentLobbyNameBG.Value)
{
object obj = typeof(LobbyPlayerUI).GetField("_teamBg", BindingFlags.Instance | BindingFlags.NonPublic)?.GetValue(__instance);
if (obj != null)
{
float imageColorA = GetImageColorA(obj);
SetImageColor(obj, new Color(1f, 1f, 1f, imageColorA));
}
}
}
}
private static Sprite _cachedTransparent;
private static Sprite LoadTransparentSprite()
{
//IL_0031: Unknown result type (might be due to invalid IL or missing references)
//IL_0037: Expected O, but got Unknown
//IL_0061: Unknown result type (might be due to invalid IL or missing references)
//IL_0070: Unknown result type (might be due to invalid IL or missing references)
if ((Object)(object)_cachedTransparent != (Object)null)
{
return _cachedTransparent;
}
string backendTexturesPath = ACNPlusPlugin.GetBackendTexturesPath("transparent.png");
if (!File.Exists(backendTexturesPath))
{
return null;
}
byte[] array = File.ReadAllBytes(backendTexturesPath);
Texture2D val = new Texture2D(2, 2);
if (!ImageConversion.LoadImage(val, array))
{
return null;
}
val.Apply();
_cachedTransparent = Sprite.Create(val, new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), new Vector2(0.5f, 0.5f));
return _cachedTransparent;
}
private static void SetImageSprite(object image, Sprite sprite)
{
if (image != null && !((Object)(object)sprite == (Object)null))
{
image.GetType().GetProperty("sprite", BindingFlags.Instance | BindingFlags.Public)?.SetValue(image, sprite);
}
}
private static void SetImageColor(object image, Color color)
{
//IL_001c: Unknown result type (might be due to invalid IL or missing references)
image?.GetType().GetProperty("color", BindingFlags.Instance | BindingFlags.Public)?.SetValue(image, color);
}
private static float GetImageColorA(object image)
{
//IL_0032: Unknown result type (might be due to invalid IL or missing references)
//IL_0037: Unknown result type (might be due to invalid IL or missing references)
//IL_0038: Unknown result type (might be due to invalid IL or missing references)
if (image == null)
{
return 1f;
}
if (image.GetType().GetProperty("color", BindingFlags.Instance | BindingFlags.Public)?.GetValue(image) is Color val)
{
return val.a;
}
return 1f;
}
}
[HarmonyPatch(typeof(ClientController), "OnMessageReceived")]
public class LobbyInvitePatches
{
[HarmonyPrefix]
public static bool OnMessageReceived_Prefix(object sender, MessageReceivedEventArgs e)
{
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
//IL_000a: Invalid comparison between Unknown and I4
//IL_000f: Unknown result type (might be due to invalid IL or missing references)
Packets val = (Packets)e.MessageId;
if ((int)val == 27)
{
Packet obj = PacketFactory.PacketFromMessage(val, e.Message);
ServerLobbyInvite val2 = (ServerLobbyInvite)(object)((obj is ServerLobbyInvite) ? obj : null);
if (val2 != null)
{
ClientController instance = ClientController.Instance;
if ((Object)(object)instance != (Object)null)
{
string text = "Unknown";
if (instance.Players.TryGetValue(val2.InviterId, out var value) && value.ClientState != null)
{
text = value.ClientState.Name;
}
if (ACNPlusPlugin.GetBlocklist().Contains(text))
{
instance.ClientLobbyManager.DeclineInvite(val2.LobbyId);
if (ACNPlusPlugin.SeeWhenSomethingIsBlocked.Value)
{
ChatUI instance2 = ChatUI.Instance;
if (instance2 != null)
{
instance2.AddMessage("<color=red>Blocked invite from " + text + "</color>");
}
}
return false;
}
if (ACNPlusPlugin.BlockInvites.Value)
{
instance.ClientLobbyManager.DeclineInvite(val2.LobbyId);
if (ACNPlusPlugin.BlockInvitesChatMessage.Value)
{
string text2 = "Unknown";
if (instance.ClientLobbyManager.Lobbies.TryGetValue(val2.LobbyId, out var _))
{
text2 = instance.ClientLobbyManager.GetLobbyName(val2.LobbyId);
}
ChatUI instance3 = ChatUI.Instance;
if (instance3 != null)
{
instance3.AddMessage("<color=yellow>Blocked invite from " + text + " to " + text2 + " lobby</color>");
}
}
return false;
}
}
}
}
return true;
}
}
[HarmonyPatch(typeof(MPMapUI), "Awake")]
public static class MinimapReplacementPatch
{
private const string RawImageTypeName = "UnityEngine.UI.RawImage";
[HarmonyPostfix]
public static void Awake_Postfix(MPMapUI __instance)
{
//IL_00de: Unknown result type (might be due to invalid IL or missing references)
//IL_00e5: Expected O, but got Unknown
string text = null;
ConfigEntry<bool> catWizardMiniMap = ACNPlusPlugin.CatWizardMiniMap;
if (catWizardMiniMap != null && catWizardMiniMap.Value)
{
text = ACNPlusPlugin.GetBackendTexturesPath("CatMiniMap.png");
}
else
{
ConfigEntry<bool> changeMiniMapToPNG = ACNPlusPlugin.ChangeMiniMapToPNG;
if (changeMiniMapToPNG != null && changeMiniMapToPNG.Value)
{
string texturesFolder = ACNPlusPlugin.GetTexturesFolder();
if (!string.IsNullOrEmpty(texturesFolder) && Directory.Exists(texturesFolder))
{
text = Path.Combine(texturesFolder, "MiniMapPNG.png");
}
}
}
if (text == null || !File.Exists(text))
{
return;
}
Transform val = ((Component)__instance).transform.Find("Map Texture");
if ((Object)(object)val == (Object)null)
{
return;
}
Component val2 = null;
Component[] components = ((Component)val).GetComponents<Component>();
foreach (Component val3 in components)
{
if ((Object)(object)val3 != (Object)null && ((object)val3).GetType().FullName == "UnityEngine.UI.RawImage")
{
val2 = val3;
break;
}
}
if ((Object)(object)val2 == (Object)null)
{
return;
}
try
{
byte[] array = File.ReadAllBytes(text);
Texture2D val4 = new Texture2D(2, 2);
if (ImageConversion.LoadImage(val4, array))
{
((object)val2).GetType().GetProperty("texture", BindingFlags.Instance | BindingFlags.Public)?.SetValue(val2, val4);
((Component)__instance).gameObject.AddComponent<MinimapTextureHolder>().SetTexture((Texture)(object)val4);
}
else
{
Object.Destroy((Object)(object)val4);
}
}
catch (Exception)
{
}
}
}
[HarmonyPatch(typeof(ClientLobbyManager), "OnPacketReceived")]
public class PrivateLobbyPatches
{
private static HashSet<ushort> _allowedPlayers = new HashSet<ushort>();
private static bool _wasHost = false;
[HarmonyPostfix]
public static void OnPacketReceived_Postfix(Packets packetId, Packet packet)
{
//IL_00be: Unknown result type (might be due to invalid IL or missing references)
//IL_00c1: Invalid comparison between Unknown and I4
//IL_00c3: Unknown result type (might be due to invalid IL or missing references)
//IL_00c6: Invalid comparison between Unknown and I4
ClientController instance = ClientController.Instance;
if ((Object)(object)instance == (Object)null)
{
return;
}
ClientLobbyManager clientLobbyManager = instance.ClientLobbyManager;
Lobby currentLobby = clientLobbyManager.CurrentLobby;
if (currentLobby == null)
{
_allowedPlayers.Clear();
_wasHost = false;
return;
}
bool flag = currentLobby.LobbyState.HostId == instance.LocalID;
if (flag && !_wasHost)
{
_allowedPlayers.Clear();
foreach (ushort key in currentLobby.LobbyState.Players.Keys)
{
_allowedPlayers.Add(key);
}
_wasHost = true;
}
else if (!flag)
{
_wasHost = false;
_allowedPlayers.Clear();
return;
}
if (((int)packetId != 47 && (int)packetId != 13) || !flag)
{
return;
}
HashSet<string> blocklist = ACNPlusPlugin.GetBlocklist();
HashSet<string> friendsList = ACNPlusPlugin.GetFriendsList();
MPPlayer value;
MPPlayer val = (instance.Players.TryGetValue(instance.LocalID, out value) ? value : null);
string text = "";
int num = -1;
if (val != null && val.ClientState != null)
{
text = val.ClientState.CrewName;
if (val.ClientState.User != null && val.ClientState.User.Badges != null)
{
if (val.ClientState.User.Badges.Contains(63))
{
num = 63;
}
else if (val.ClientState.User.Badges.Contains(40))
{
num = 40;
}
else if (val.ClientState.User.Badges.Contains(52))
{
num = 52;
}
else if (val.ClientState.User.Badges.Contains(28))
{
num = 28;
}
}
if (num == -1)
{
string playerDisplayName = MPUtility.GetPlayerDisplayName(val.ClientState);
if (playerDisplayName.Contains("<sprite=63>"))
{
num = 63;
}
else if (playerDisplayName.Contains("<sprite=40>"))
{
num = 40;
}
else if (playerDisplayName.Contains("<sprite=52>"))
{
num = 52;
}
else if (playerDisplayName.Contains("<sprite=28>"))
{
num = 28;
}
}
}
foreach (ushort key2 in currentLobby.LobbyState.Players.Keys)
{
if (key2 == instance.LocalID)
{
continue;
}
if (instance.Players.TryGetValue(key2, out var value2) && value2.ClientState != null)
{
string name = value2.ClientState.Name;
if (blocklist.Contains(name))
{
clientLobbyManager.KickPlayer(key2);
if (ACNPlusPlugin.SeeWhenSomethingIsBlocked.Value)
{
ChatUI instance2 = ChatUI.Instance;
if (instance2 != null)
{
instance2.AddMessage("<color=red>Auto-kicked blocked user " + name + " from your lobby</color>");
}
}
continue;
}
if (ACNPlusPlugin.CrewOnlyLobby.Value)
{
bool flag2 = false;
if (num != -1)
{
if (value2.ClientState.User != null && value2.ClientState.User.Badges != null && value2.ClientState.User.Badges.Contains(num))
{
flag2 = true;
}
if (!flag2 && MPUtility.GetPlayerDisplayName(value2.ClientState).Contains($"<sprite={num}>"))
{
flag2 = true;
}
}
else if (!string.IsNullOrEmpty(text) && value2.ClientState.CrewName == text)
{
flag2 = true;
}
if (!flag2)
{
clientLobbyManager.KickPlayer(key2);
ChatUI instance3 = ChatUI.Instance;
if (instance3 != null)
{
instance3.AddMessage("<color=yellow>Auto-kicked " + name + " (not in your crew)</color>");
}
continue;
}
}
if (ACNPlusPlugin.FriendsOnlyLobby.Value && !friendsList.Contains(name))
{
clientLobbyManager.KickPlayer(key2);
ChatUI instance4 = ChatUI.Instance;
if (instance4 != null)
{
instance4.AddMessage("<color=yellow>Auto-kicked " + name + " (not on friends list)</color>");
}
continue;
}
}
if (ACNPlusPlugin.BlockPlayersFromJoiningLobby.Value && !_allowedPlayers.Contains(key2))
{
clientLobbyManager.KickPlayer(key2);
string text2 = "Unknown";
if (instance.Players.TryGetValue(key2, out var value3) && value3.ClientState != null)
{
text2 = value3.ClientState.Name;
}
ChatUI instance5 = ChatUI.Instance;
if (instance5 != null)
{
instance5.AddMessage("<color=yellow>Auto-kicked " + text2 + " from your lobby</color>");
}
}
}
}
}
}
namespace ACNPlus.MinimapReplacement
{
public class MinimapTextureHolder : MonoBehaviour
{
private Texture _texture;
public void SetTexture(Texture texture)
{
_texture = texture;
}
private void OnDestroy()
{
if ((Object)(object)_texture != (Object)null)
{
Object.Destroy((Object)(object)_texture);
_texture = null;
}
}
}
}
namespace ACNPlus.ChatBubble
{
public class ChatBubble : MonoBehaviour
{
private const float DisplayTime = 5f;
private const float FadeTime = 0.5f;
private const float HeightOffset = 2.5f;
private TextMeshPro _label;
private Transform _followTarget;
private float _timer;
private bool _active;
private static Color _cachedColor = Color.white;
private static bool _colorCacheValid = false;
public static void InitColorCache()
{
//IL_0000: Unknown result type (might be due to invalid IL or missing references)
//IL_0005: Unknown result type (might be due to invalid IL or missing references)
_cachedColor = ACNPlusPlugin.GetChatBubbleColor();
_colorCacheValid = true;
ACNPlusPlugin.ChatBubbleColor.SettingChanged += delegate
{
//IL_0000: Unknown result type (might be due to invalid IL or missing references)
//IL_0005: Unknown result type (might be due to invalid IL or missing references)
_cachedColor = ACNPlusPlugin.GetChatBubbleColor();
};
}
private static Color GetColor()
{
//IL_0017: Unknown result type (might be due to invalid IL or missing references)
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
//IL_000c: Unknown result type (might be due to invalid IL or missing references)
if (!_colorCacheValid)
{
_cachedColor = ACNPlusPlugin.GetChatBubbleColor();
_colorCacheValid = true;
}
return _cachedColor;
}
public static ChatBubble Create(Transform followTarget)
{
//IL_0005: Unknown result type (might be due to invalid IL or missing references)
//IL_000b: Expected O, but got Unknown
GameObject val = new GameObject("ChatBubble");
ChatBubble chatBubble = val.AddComponent<ChatBubble>();
chatBubble._followTarget = followTarget;
chatBubble._label = val.AddComponent<TextMeshPro>();
((TMP_Text)chatBubble._label).fontSize = 1.6f;
chatBubble._label.sortingOrder = 2;
((TMP_Text)chatBubble._label).horizontalAlignment = (HorizontalAlignmentOptions)2;
((TMP_Text)chatBubble._label).verticalAlignment = (VerticalAlignmentOptions)512;
MPAssets instance = MPAssets.Instance;
if (instance != null)
{
((TMP_Text)chatBubble._label).spriteAsset = instance.Sprites;
}
val.SetActive(false);
return chatBubble;
}
private static string WrapText(string text, int lineLength)
{
StringBuilder stringBuilder = new StringBuilder();
int num = 0;
bool flag = false;
int num2 = 0;
while (num2 < text.Length)
{
if (text[num2] == '<')
{
int num3 = text.IndexOf('>', num2);
if (num3 >= 0)
{
stringBuilder.Append(text, num2, num3 - num2 + 1);
num2 = num3 + 1;
continue;
}
}
if (flag && text[num2] == ' ')
{
stringBuilder.Append('\n');
flag = false;
num = 0;
num2++;
continue;
}
if (num > 0 && num % lineLength == 0)
{
flag = true;
}
stringBuilder.Append(text[num2]);
num++;
num2++;
}
return stringBuilder.ToString();
}
public void ShowMessage(string message)
{
//IL_003f: Unknown result type (might be due to invalid IL or missing references)
//IL_004f: Unknown result type (might be due to invalid IL or missing references)
//IL_0054: Unknown result type (might be due to invalid IL or missing references)
int num = message.IndexOf(": ");
string text = ((num >= 0) ? message.Substring(num + 2) : message);
text = MPUtility.ParseMessageEmojis(text);
text = WrapText(text, 15);
((TMP_Text)_label).text = text;
((Graphic)_label).color = GetColor();
((TMP_Text)_label).outlineColor = Color32.op_Implicit(Color.black);
((TMP_Text)_label).outlineWidth = 0.2f;
_timer = 5.5f;
_active = true;
((Component)this).gameObject.SetActive(true);
}
private void LateUpdate()
{
//IL_0037: Unknown result type (might be due to invalid IL or missing references)
//IL_003c: Unknown result type (might be due to invalid IL or missing references)
//IL_0046: Unknown result type (might be due to invalid IL or missing references)
//IL_004b: Unknown result type (might be due to invalid IL or missing references)
//IL_0095: Unknown result type (might be due to invalid IL or missing references)
//IL_009a: Unknown result type (might be due to invalid IL or missing references)
//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
//IL_00ba: Unknown result type (might be due to invalid IL or missing references)
//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
if (!_active)
{
return;
}
if ((Object)(object)_followTarget == (Object)null)
{
((Component)this).gameObject.SetActive(false);
_active = false;
return;
}
((Component)this).transform.position = _followTarget.position + Vector3.up * 2.5f;
_timer -= Time.deltaTime;
if (_timer <= 0f)
{
((Component)this).gameObject.SetActive(false);
_active = false;
}
else if (_timer < 0.5f)
{
Color color = GetColor();
float num = _timer / 0.5f;
((Graphic)_label).color = new Color(color.r, color.g, color.b, num);
((TMP_Text)_label).outlineColor = new Color32((byte)0, (byte)0, (byte)0, (byte)(num * 255f));
}
}
private void OnWillRenderObject()
{
//IL_001d: Unknown result type (might be due to invalid IL or missing references)
if ((Object)(object)Camera.current != (Object)null)
{
((Component)this).transform.rotation = ((Component)Camera.current).transform.rotation;
}
}
}
}