basic options networking + refactor

This commit is contained in:
XtraCube committed 2024-07-08 15:03:40 -04:00
1 parent dda353c71f
commit f560c8ca02
17 files changed
+232 -122

No files matched your search

+4 -4
View File
@@ -37,7 +37,7 @@ public static class CustomGameModeManager
return;
}
Logger<MiraAPIPlugin>.Error($"No gamemode with id {id} found!");
Logger<MiraApiPlugin>.Error($"No gamemode with id {id} found!");
}
/// <summary>
@@ -48,7 +48,7 @@ public static class CustomGameModeManager
{
if (!typeof(CustomGameMode).IsAssignableFrom(gameModeType))
{
Logger<MiraAPIPlugin>.Warning($"{gameModeType?.Name} does not inherit CustomGameMode!");
Logger<MiraApiPlugin>.Warning($"{gameModeType?.Name} does not inherit CustomGameMode!");
return;
}
@@ -56,13 +56,13 @@ public static class CustomGameModeManager
if (GameModes.Any(x => x.Key == gameMode?.Id))
{
Logger<MiraAPIPlugin>.Error($"ID for gamemode {gameMode?.Name} already exists!");
Logger<MiraApiPlugin>.Error($"ID for gamemode {gameMode?.Name} already exists!");
return;
}
if (gameMode == null)
{
Logger<MiraAPIPlugin>.Error($"GAMEMODE WITH TYPE {gameModeType.Name} IS NULL");
Logger<MiraApiPlugin>.Error($"GAMEMODE WITH TYPE {gameModeType.Name} IS NULL");
return;
}
+6 -2
View File
@@ -1,19 +1,23 @@
using MiraAPI.PluginLoading;
using System;
using MiraAPI.Networking;
using UnityEngine;
namespace MiraAPI.GameOptions
{
public interface IModdedOption
{
public uint Id { get; }
public ModdedOptionGroup Group { get; set; }
public IMiraPlugin ParentMod { get; set; }
public Type AdvancedRole { get; }
public OptionBehaviour OptionBehaviour { get; protected set; }
public string Title { get; }
public StringNames StringName { get; }
public Func<bool> Visible { get; set; }
public ModdedOptionGroup Group { get; set; }
public IMiraPlugin ParentMod { get; set; }
public void ValueChanged(OptionBehaviour optionBehaviour);
public OptionBehaviour CreateOption(ToggleOption toggleOpt, NumberOption numberOpt, StringOption stringOpt, Transform container);
public NetData GetNetData();
public void HandleNetData(byte[] data);
}
}
+52 -9
View File
@@ -5,15 +5,19 @@ using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using MiraAPI.Networking;
using Reactor.Networking.Rpc;
namespace MiraAPI.GameOptions
{
public class ModdedOptionsManager
{
public static List<IModdedOption> Options = [];
public static List<ModdedOptionGroup> Groups = [];
private static Dictionary<PropertyInfo, ModdedOptionAttribute> OptionAttributes = new();
public static Dictionary<Type, ModdedOptionGroup> OriginalTypes = new();
public static readonly Dictionary<uint, IModdedOption> ModdedOptions = new();
public static readonly List<IModdedOption> Options = [];
public static readonly List<ModdedOptionGroup> Groups = [];
private static readonly Dictionary<PropertyInfo, ModdedOptionAttribute> OptionAttributes = new();
public static readonly Dictionary<Type, ModdedOptionGroup> OriginalTypes = new();
public static uint NextId = 1;
public static IModdedOption RegisterOption(Type type, ModdedOptionAttribute attribute, PropertyInfo property)
{
@@ -25,20 +29,19 @@ namespace MiraAPI.GameOptions
{
var setterOriginal = property.GetSetMethod();
var setterPatch = typeof(ModdedOptionsManager).GetMethod(nameof(PropertySetterPatch));
PluginSingleton<MiraAPIPlugin>.Instance.Harmony.Patch(setterOriginal, postfix: new HarmonyMethod(setterPatch));
PluginSingleton<MiraApiPlugin>.Instance.Harmony.Patch(setterOriginal, postfix: new HarmonyMethod(setterPatch));
var getterOriginal = property.GetGetMethod();
var getterPatch = typeof(ModdedOptionsManager).GetMethod(nameof(PropertyGetterPatch));
PluginSingleton<MiraAPIPlugin>.Instance.Harmony.Patch(getterOriginal, prefix: new HarmonyMethod(getterPatch));
PluginSingleton<MiraApiPlugin>.Instance.Harmony.Patch(getterOriginal, prefix: new HarmonyMethod(getterPatch));
attribute.HolderOption = result;
Options.Add(result);
OptionAttributes.Add(property, attribute);
if (OriginalTypes.ContainsKey(type))
{
Logger<MiraAPIPlugin>.Error($"Grouping {attribute.Title} with {OriginalTypes[type].GroupName}");
Logger<MiraApiPlugin>.Error($"Grouping {attribute.Title} with {OriginalTypes[type].GroupName}");
result.Group = OriginalTypes[type];
}
}
@@ -46,6 +49,46 @@ namespace MiraAPI.GameOptions
return result;
}
public static void SyncAllOptions(int targetId)
{
List<NetData> data = [];
int count = 0;
Logger<MiraApiPlugin>.Error("num options: " + ModdedOptions.Count);
foreach (var option in ModdedOptions.Values)
{
var netData = option.GetNetData();
data.Add(netData);
count += netData.GetLength();
Logger<MiraApiPlugin>.Error($"syncing data for {netData.Id}");
if (count > 1000)
{
Rpc<SyncOptionsRpc>.Instance.SendTo(PlayerControl.LocalPlayer, targetId, data.ToArray());
data.Clear();
count = 0;
}
}
if (data.Count > 0)
{
Rpc<SyncOptionsRpc>.Instance.SendTo(PlayerControl.LocalPlayer, targetId, data.ToArray());
}
}
public static void HandleSyncOptions(NetData[] data)
{
foreach (var netData in data)
{
Logger<MiraApiPlugin>.Error($"syncing data for {netData.Id}");
if (ModdedOptions.TryGetValue(netData.Id, out var option))
{
Logger<MiraApiPlugin>.Error($"syncing data for {option.Title}");
option.HandleNetData(netData.Data);
}
}
}
public static void PropertySetterPatch(MethodBase __originalMethod, object value)
{
ModdedOptionAttribute attribute = OptionAttributes.First(pair => pair.Key.GetSetMethod().Equals(__originalMethod)).Value;
@@ -1,19 +1,15 @@
using Reactor.Localization.Utilities;
using System;
using System.Linq;
using MiraAPI.Networking;
using UnityEngine;
using Object = UnityEngine.Object;
namespace MiraAPI.GameOptions.OptionTypes
{
public class ModdedEnumOption : ModdedOption<int>
public class ModdedEnumOption(string title, int defaultValue, Type enumType, Type roleType) : ModdedOption<int>(title, defaultValue, roleType)
{
public string[] Values;
public ModdedEnumOption(string title, int defaultValue, Type enumType, Type roleType) : base(title, defaultValue, roleType)
{
Values = Enum.GetNames(enumType);
}
public string[] Values { get; set; } = Enum.GetNames(enumType);
public override OptionBehaviour CreateOption(ToggleOption toggleOpt, NumberOption numberOpt, StringOption stringOpt, Transform container)
{
@@ -41,6 +37,16 @@ namespace MiraAPI.GameOptions.OptionTypes
stringOption.SetUpFromData(stringOption.data, 20);
return stringOption;
}
public override NetData GetNetData()
{
return new NetData(Id, BitConverter.GetBytes(Value));
}
public override void HandleNetData(byte[] data)
{
SetValue(BitConverter.ToInt32(data));
}
public override string GetHudStringText()
{
@@ -57,7 +63,10 @@ namespace MiraAPI.GameOptions.OptionTypes
if (OptionBehaviour is null) return;
var opt = OptionBehaviour as StringOption;
opt.Value = newValue;
if (opt)
{
opt.Value = newValue;
}
DestroyableSingleton<HudManager>.Instance.Notifier.AddSettingsChangeMessage(StringName, OptionBehaviour.GetValueString(Value), false);
}
@@ -1,5 +1,8 @@
using MiraAPI.Utilities;
using System;
using MiraAPI.Networking;
using MiraAPI.Utilities;
using UnityEngine;
using Object = UnityEngine.Object;
namespace MiraAPI.GameOptions.OptionTypes
{
@@ -44,6 +47,16 @@ namespace MiraAPI.GameOptions.OptionTypes
return numberOption;
}
public override NetData GetNetData()
{
return new NetData(Id, BitConverter.GetBytes(Value));
}
public override void HandleNetData(byte[] data)
{
SetValue(BitConverter.ToSingle(data));
}
public override string GetHudStringText()
{
return Title + ": " + Value + Helpers.GetSuffix(SuffixType);
@@ -61,7 +74,10 @@ namespace MiraAPI.GameOptions.OptionTypes
if (OptionBehaviour is null) return;
var opt = OptionBehaviour as NumberOption;
opt.Value = newValue;
if (opt)
{
opt.Value = newValue;
}
DestroyableSingleton<HudManager>.Instance.Notifier.AddSettingsChangeMessage(StringName, OptionBehaviour.GetValueString(Value), false);
}
@@ -2,15 +2,18 @@
using MiraAPI.Roles;
using Reactor.Localization.Utilities;
using System;
using MiraAPI.Networking;
using Reactor.Utilities;
using UnityEngine;
namespace MiraAPI.GameOptions.OptionTypes
{
public abstract class ModdedOption<T> : IModdedOption
{
public T Value { get; set; }
public T DefaultValue { get; set; }
public Action<T> ChangedEvent { get; private set; }
public uint Id { get; }
public T Value { get; protected set; }
public T DefaultValue { get; init; }
public Action<T> ChangedEvent { get; set; }
public string Title { get; }
public StringNames StringName { get; }
public Func<bool> Visible { get; set; }
@@ -19,7 +22,7 @@ namespace MiraAPI.GameOptions.OptionTypes
public ModdedOptionGroup Group { get; set; } = null;
public IMiraPlugin ParentMod { get; set; } = null;
public ModdedOption(string title, T defaultValue, Type roleType)
public ModdedOption(string title, T defaultValue, Type roleType) : this()
{
Title = title;
DefaultValue = defaultValue;
@@ -32,6 +35,14 @@ namespace MiraAPI.GameOptions.OptionTypes
AdvancedRole = roleType;
}
}
public ModdedOption()
{
Logger<MiraApiPlugin>.Error("created modded option");
Id = ModdedOptionsManager.NextId++;
ModdedOptionsManager.Options.Add(this);
ModdedOptionsManager.ModdedOptions.Add(Id, this);
}
public void ValueChanged(OptionBehaviour optionBehaviour)
{
@@ -50,6 +61,9 @@ namespace MiraAPI.GameOptions.OptionTypes
OnValueChanged(newValue);
}
public abstract NetData GetNetData();
public abstract void HandleNetData(byte[] data);
public abstract void OnValueChanged(T newValue);
public abstract T GetValueFromOptionBehaviour(OptionBehaviour optionBehaviour);
@@ -1,17 +1,15 @@
using Reactor.Localization.Utilities;
using System;
using System.Linq;
using MiraAPI.Networking;
using UnityEngine;
using Object = UnityEngine.Object;
namespace MiraAPI.GameOptions.OptionTypes
{
public class ModdedStringOption : ModdedOption<int>
public class ModdedStringOption(string title, int defaultValue, string[] values, Type roleType) : ModdedOption<int>(title, defaultValue, roleType)
{
public string[] Values { get; private set; }
public ModdedStringOption(string title, int defaultValue, string[] values, System.Type roleType) : base(title, defaultValue, roleType)
{
Values = values;
}
public string[] Values { get; private set; } = values;
public override OptionBehaviour CreateOption(ToggleOption toggleOpt, NumberOption numberOpt, StringOption stringOpt, Transform container)
{
@@ -36,6 +34,16 @@ namespace MiraAPI.GameOptions.OptionTypes
return stringOption;
}
public override NetData GetNetData()
{
return new NetData(Id, BitConverter.GetBytes(Value));
}
public override void HandleNetData(byte[] data)
{
SetValue(BitConverter.ToInt32(data));
}
public override string GetHudStringText()
{
return Title + ": " + Values[Value];
@@ -51,7 +59,10 @@ namespace MiraAPI.GameOptions.OptionTypes
if (OptionBehaviour is null) return;
var opt = OptionBehaviour as StringOption;
opt.Value = newValue;
if (opt)
{
opt.Value = newValue;
}
DestroyableSingleton<HudManager>.Instance.Notifier.AddSettingsChangeMessage(StringName, OptionBehaviour.GetValueString(Value), false);
}
@@ -1,13 +1,12 @@
using UnityEngine;
using System;
using MiraAPI.Networking;
using UnityEngine;
using Object = UnityEngine.Object;
namespace MiraAPI.GameOptions.OptionTypes
{
public class ModdedToggleOption : ModdedOption<bool>
public class ModdedToggleOption(string title, bool defaultValue, System.Type roleType) : ModdedOption<bool>(title, defaultValue, roleType)
{
public ModdedToggleOption(string title, bool defaultValue, System.Type roleType) : base(title, defaultValue, roleType)
{
}
public override OptionBehaviour CreateOption(ToggleOption toggleOpt, NumberOption numberOpt, StringOption stringOpt, Transform container)
{
var toggleOption = Object.Instantiate(toggleOpt, Vector3.zero, Quaternion.identity, container);
@@ -28,6 +27,16 @@ namespace MiraAPI.GameOptions.OptionTypes
return toggleOption;
}
public override NetData GetNetData()
{
return new NetData(Id, BitConverter.GetBytes(Value));
}
public override void HandleNetData(byte[] data)
{
SetValue(BitConverter.ToBoolean(data));
}
public override string GetHudStringText()
{
return Title + ": " + (Value ? "On" : "Off");
@@ -43,7 +52,10 @@ namespace MiraAPI.GameOptions.OptionTypes
if (OptionBehaviour is null) return;
var toggleOpt = OptionBehaviour as ToggleOption;
toggleOpt.CheckMark.enabled = newValue;
if (toggleOpt)
{
toggleOpt.CheckMark.enabled = newValue;
}
DestroyableSingleton<HudManager>.Instance.Notifier.AddSettingsChangeMessage(StringName, Value ? "On" : "Off", false);
}
@@ -3,11 +3,11 @@ using BepInEx.Unity.IL2CPP;
using HarmonyLib;
using MiraAPI.PluginLoading;
using Reactor;
using Reactor.Networking;
using Reactor.Networking.Attributes;
using Reactor.Patches;
using System;
using System.Text;
using Reactor.Networking;
using Reactor.Networking.Attributes;
using UnityEngine;
namespace MiraAPI;
@@ -16,26 +16,24 @@ namespace MiraAPI;
[BepInProcess("Among Us.exe")]
[BepInDependency(ReactorPlugin.Id)]
[ReactorModFlags(ModFlags.RequireOnAllClients)]
public partial class MiraAPIPlugin : BasePlugin
public partial class MiraApiPlugin : BasePlugin
{
public Harmony Harmony { get; } = new(Id);
public static MiraAPIPlugin Instance { get; private set; }
public static MiraPluginManager PluginManager { get; private set; }
public static Color MiraColor = new Color32(238, 154, 112, 255);
public override void Load()
{
Instance = this;
Harmony.PatchAll();
PluginManager = new MiraPluginManager();
PluginManager.Initialize();
ReactorVersionShower.TextUpdated += (text) =>
ReactorVersionShower.TextUpdated += text =>
{
text.text = new StringBuilder($"{MiraColor.ToTextColor()}Mira API</color> ")
.Append(GetShortHashVersion(Version))
.Append("\n")
.Append('\n')
.Append(text.text)
.ToString();
};
+10
View File
@@ -0,0 +1,10 @@
using System;
namespace MiraAPI.Networking;
public readonly struct NetData(uint id, byte[] data)
{
public uint Id { get; } = id;
public byte[] Data { get; } = data;
public int GetLength() => BitConverter.GetBytes(Id).Length + Data.Length;
}
+18 -52
View File
@@ -1,4 +1,5 @@
using Hazel;
using MiraAPI.GameOptions;
using Reactor.Networking.Attributes;
using Reactor.Networking.Rpc;
@@ -6,76 +7,41 @@ namespace MiraAPI.Networking;
// METHOD RPC DOESNT WORK WITH THE ARRAYS AND STUFF SO THIS IS HOW WE WILL DO IT FOR NOW
[RegisterCustomRpc((uint)MiraRpc.SyncGameOptions)]
public class SyncOptionsRpc(MiraAPIPlugin plugin, uint id) : PlayerCustomRpc<MiraAPIPlugin, SyncOptionsRpc.Data>(plugin, id)
public class SyncOptionsRpc(MiraApiPlugin plugin, uint id) : PlayerCustomRpc<MiraApiPlugin, NetData[]>(plugin, id)
{
public override RpcLocalHandling LocalHandling => RpcLocalHandling.None;
public readonly struct Data
public override void Write(MessageWriter writer, NetData[] data)
{
public readonly bool[] Toggles;
public readonly float[] Numbers;
public readonly int[] StringIDs;
public Data(bool[] toggles, float[] numbers, int[] stringIDs)
writer.WritePacked((uint)data.Length);
foreach (var netData in data)
{
Toggles = toggles;
Numbers = numbers;
StringIDs = stringIDs;
writer.WritePacked(netData.Id);
writer.WriteBytesAndSize(netData.Data);
}
}
public override void Write(MessageWriter writer, Data data)
public override NetData[] Read(MessageReader reader)
{
writer.WritePacked((uint)data.Toggles.Length);
foreach (var t in data.Toggles)
var length = reader.ReadPackedUInt32();
var data = new NetData[length];
for (var i = 0; i < length; i++)
{
writer.Write(t);
var id = reader.ReadPackedUInt32();
var bytes = reader.ReadBytesAndSize();
data[i] = new NetData(id, bytes);
}
writer.WritePacked((uint)data.Numbers.Length);
foreach (var n in data.Numbers)
{
writer.Write(n);
}
writer.WritePacked((uint)data.StringIDs.Length);
foreach (var n in data.StringIDs)
{
writer.WritePacked(n);
}
return data;
}
public override Data Read(MessageReader reader)
{
var toggles = new bool[reader.ReadPackedUInt32()];
for (var i = 0; i < toggles.Length; i++)
{
toggles[i] = reader.ReadBoolean();
}
var numbers = new float[reader.ReadPackedUInt32()];
for (var i = 0; i < numbers.Length; i++)
{
numbers[i] = reader.ReadSingle();
}
var strings = new int[reader.ReadPackedUInt32()];
for (var i = 0; i < strings.Length; i++)
{
strings[i] = reader.ReadPackedInt32();
}
return new Data(toggles, numbers, strings);
}
public override void Handle(PlayerControl playerControl, Data data)
public override void Handle(PlayerControl playerControl, NetData[] data)
{
if (AmongUsClient.Instance.HostId != playerControl.OwnerId)
{
return;
}
//CustomOptionsManager.HandleOptionsSync(data.Toggles, data.Numbers, data.StringIDs);
ModdedOptionsManager.HandleSyncOptions(data);
}
}
+4 -4
View File
@@ -8,7 +8,7 @@ using Reactor.Utilities;
namespace MiraAPI.Networking;
[RegisterCustomRpc((uint)MiraRpc.SyncRoleOptions)]
public class SyncRoleOptionsRpc(MiraAPIPlugin plugin, uint id) : PlayerCustomRpc<MiraAPIPlugin, SyncRoleOptionsRpc.Data>(plugin, id)
public class SyncRoleOptionsRpc(MiraApiPlugin plugin, uint id) : PlayerCustomRpc<MiraApiPlugin, SyncRoleOptionsRpc.Data>(plugin, id)
{
public struct Data(ushort roleId, int number, int chance)
@@ -42,8 +42,8 @@ public class SyncRoleOptionsRpc(MiraAPIPlugin plugin, uint id) : PlayerCustomRpc
if (!CustomRoleManager.CustomRoles.TryGetValue(data.RoleId, out var roleBehaviour) ||
!CustomRoleManager.GetCustomRoleBehaviour(roleBehaviour.Role, out var role)) return;
PluginSingleton<MiraAPIPlugin>.Instance.Config.TryGetEntry<int>(role.NumConfigDefinition, out var numEntry);
PluginSingleton<MiraAPIPlugin>.Instance.Config.TryGetEntry<int>(role.ChanceConfigDefinition, out var chanceEntry);
PluginSingleton<MiraApiPlugin>.Instance.Config.TryGetEntry<int>(role.NumConfigDefinition, out var numEntry);
PluginSingleton<MiraApiPlugin>.Instance.Config.TryGetEntry<int>(role.ChanceConfigDefinition, out var chanceEntry);
try
{
@@ -52,7 +52,7 @@ public class SyncRoleOptionsRpc(MiraAPIPlugin plugin, uint id) : PlayerCustomRpc
}
catch (Exception e)
{
Logger<MiraAPIPlugin>.Warning(e.ToString());
Logger<MiraApiPlugin>.Warning(e.ToString());
}
}
}
+26
View File
@@ -0,0 +1,26 @@
using HarmonyLib;
using InnerNet;
using MiraAPI.GameOptions;
using MiraAPI.Roles;
namespace MiraAPI.Patches;
[HarmonyPatch(typeof(AmongUsClient), nameof(AmongUsClient.CreatePlayer))]
public static class AmongUsClientSyncPatch
{
public static void Postfix(ClientData clientData)
{
if (!AmongUsClient.Instance.AmHost)
{
return;
}
if (clientData.Id == AmongUsClient.Instance.HostId)
{
return;
}
ModdedOptionsManager.SyncAllOptions(clientData.Id);
CustomRoleManager.SyncRoleSettings(clientData.Id);
}
}
@@ -5,6 +5,7 @@ using MiraAPI.Utilities.Assets;
using Reactor.Utilities.Extensions;
using System;
using System.Linq;
using Reactor.Utilities;
using TMPro;
using UnityEngine;
using UnityEngine.Events;
@@ -80,10 +81,10 @@ namespace MiraAPI.Patches.Options
var role = roleSetting.Role as ICustomRole;
if (role.HideSettings) return;
MiraAPIPlugin.Instance.Config.TryGetEntry<int>(role.NumConfigDefinition, out var numEntry);
PluginSingleton<MiraApiPlugin>.Instance.Config.TryGetEntry<int>(role.NumConfigDefinition, out var numEntry);
numEntry.Value = roleSetting.RoleMaxCount;
MiraAPIPlugin.Instance.Config.TryGetEntry<int>(role.ChanceConfigDefinition, out var chanceEntry);
PluginSingleton<MiraApiPlugin>.Instance.Config.TryGetEntry<int>(role.ChanceConfigDefinition, out var chanceEntry);
chanceEntry.Value = roleSetting.RoleChance;
roleSetting.UpdateValuesAndText(GameOptionsManager.Instance.CurrentGameOptions.RoleOptions);
@@ -22,7 +22,7 @@ public static class RoleOptionsCollectionPatch
return false;
}
PluginSingleton<MiraAPIPlugin>.Instance.Config.TryGetEntry<int>(customRole.ChanceConfigDefinition, out var entry);
PluginSingleton<MiraApiPlugin>.Instance.Config.TryGetEntry<int>(customRole.ChanceConfigDefinition, out var entry);
__result = entry.Value;
return false;
}
@@ -44,7 +44,7 @@ public static class RoleOptionsCollectionPatch
return false;
}
PluginSingleton<MiraAPIPlugin>.Instance.Config.TryGetEntry<int>(customRole.NumConfigDefinition, out var entry);
PluginSingleton<MiraApiPlugin>.Instance.Config.TryGetEntry<int>(customRole.NumConfigDefinition, out var entry);
__result = entry.Value;
return false;
}
+1 -1
View File
@@ -39,7 +39,7 @@ public class MiraPluginManager
RegisteredPlugins.Add(assembly, info);
Logger<MiraAPIPlugin>.Info($"Registering mod {id} with Mira API.");
Logger<MiraApiPlugin>.Info($"Registering mod {id} with Mira API.");
};
}
+11 -11
View File
@@ -17,11 +17,11 @@ namespace MiraAPI.Roles;
public static class CustomRoleManager
{
public static Dictionary<ushort, RoleBehaviour> CustomRoles = new();
public static readonly Dictionary<ushort, RoleBehaviour> CustomRoles = new();
public static int GetNextRoleId(ushort requestedId)
private static int GetNextRoleId(ushort requestedId)
{
while (CustomRoles.ContainsKey(requestedId))
while (CustomRoles.ContainsKey(requestedId) || requestedId <= Enum.GetNames<RoleTypes>().Length)
{
requestedId++;
}
@@ -38,7 +38,7 @@ public static class CustomRoleManager
{
if (!(typeof(RoleBehaviour).IsAssignableFrom(roleType) && typeof(ICustomRole).IsAssignableFrom(roleType)))
{
Logger<MiraAPIPlugin>.Error($"{roleType?.Name} does not inherit from RoleBehaviour or ICustomRole.");
Logger<MiraApiPlugin>.Error($"{roleType?.Name} does not inherit from RoleBehaviour or ICustomRole.");
return null;
}
@@ -77,7 +77,7 @@ public static class CustomRoleManager
return roleBehaviour;
}
var config = PluginSingleton<MiraAPIPlugin>.Instance.Config;
var config = PluginSingleton<MiraApiPlugin>.Instance.Config;
config.Bind(customRole.NumConfigDefinition, 1);
config.Bind(customRole.ChanceConfigDefinition, 100);
@@ -141,13 +141,13 @@ public static class CustomRoleManager
foreach (var role in CustomRoles.Values)
{
ICustomRole customRole = role as ICustomRole;
if (customRole.HideSettings)
if (customRole is null or { HideSettings: true })
{
continue;
}
PluginSingleton<MiraAPIPlugin>.Instance.Config.TryGetEntry<int>(customRole.NumConfigDefinition, out var numEntry);
PluginSingleton<MiraAPIPlugin>.Instance.Config.TryGetEntry<int>(customRole.ChanceConfigDefinition, out var chanceEntry);
PluginSingleton<MiraApiPlugin>.Instance.Config.TryGetEntry<int>(customRole.NumConfigDefinition, out var numEntry);
PluginSingleton<MiraApiPlugin>.Instance.Config.TryGetEntry<int>(customRole.ChanceConfigDefinition, out var chanceEntry);
Rpc<SyncRoleOptionsRpc>.Instance.Send(new SyncRoleOptionsRpc.Data((ushort)role.Role, numEntry.Value, chanceEntry.Value));
}
@@ -158,13 +158,13 @@ public static class CustomRoleManager
foreach (var role in CustomRoles.Values)
{
ICustomRole customRole = role as ICustomRole;
if (customRole.HideSettings)
if (customRole is null or { HideSettings: true })
{
continue;
}
PluginSingleton<MiraAPIPlugin>.Instance.Config.TryGetEntry<int>(customRole.NumConfigDefinition, out var numEntry);
PluginSingleton<MiraAPIPlugin>.Instance.Config.TryGetEntry<int>(customRole.ChanceConfigDefinition, out var chanceEntry);
PluginSingleton<MiraApiPlugin>.Instance.Config.TryGetEntry<int>(customRole.NumConfigDefinition, out var numEntry);
PluginSingleton<MiraApiPlugin>.Instance.Config.TryGetEntry<int>(customRole.ChanceConfigDefinition, out var chanceEntry);
Rpc<SyncRoleOptionsRpc>.Instance.SendTo(targetId, new SyncRoleOptionsRpc.Data((ushort)role.Role, numEntry.Value, chanceEntry.Value));
}