mirror of
https://github.com/All-Of-Us-Mods/MiraAPI.git
synced 2026-10-20 01:46:15 +00:00
basic options networking + refactor
This commit is contained in:
1 parent
dda353c71f
commit
f560c8ca02
17 files changed
+232
-122
No files matched your search
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
};
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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.");
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user