using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using EmotesAPI;
using MonoMod.RuntimeDetour;
using R2API.Networking;
using R2API.Networking.Interfaces;
using RiskOfOptions;
using RiskOfOptions.OptionConfigs;
using RiskOfOptions.Options;
using RoR2;
using UnityEngine;
using UnityEngine.Networking;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("EngineerTurretTaunt")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("EngineerTurretTaunt")]
[assembly: AssemblyCopyright("Copyright © 2023")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("412f3f43-5a2f-4e54-b86e-c94a7fc5a879")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace EngineerTurretTaunt;
public delegate void PlayAnimationOrig(string animationName, int pos);
public delegate void PlayAnimationHandler(PlayAnimationOrig orig, string animationName, int pos);
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInPlugin("com.kanggamming.EngineerTurretTaunt", "Engineer Turret Taunt", "0.2.2")]
public class EngineerTurretTauntPlugin : BaseUnityPlugin
{
private IDetour _playAnimHook;
public static ConfigEntry<bool> allAlliesEmote;
public static ConfigEntry<KeyboardShortcut> stopEmotingSolo;
public static ConfigEntry<KeyboardShortcut> joinEmoteSolo;
public static ConfigEntry<KeyboardShortcut> stopEmotingAllies;
public static ConfigEntry<KeyboardShortcut> joinEmoteAllies;
public EngineerTurretTauntPlugin()
{
//IL_0036: Unknown result type (might be due to invalid IL or missing references)
//IL_005a: Unknown result type (might be due to invalid IL or missing references)
//IL_007e: Unknown result type (might be due to invalid IL or missing references)
//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
allAlliesEmote = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "All allies emote", false, "Whether all of your allies will taunt with you. (Does not make other players or their allies taunt)");
stopEmotingSolo = ((BaseUnityPlugin)this).Config.Bind<KeyboardShortcut>("Keybinds", "Stop emoting (yourself)", KeyboardShortcut.Empty, "Keybind to make only yourself stop emoting.");
joinEmoteSolo = ((BaseUnityPlugin)this).Config.Bind<KeyboardShortcut>("Keybinds", "Join emote (yourself)", KeyboardShortcut.Empty, "Keybind to join a Join Spot without making your allies join with you. (alternatively you can just press Sync With Nearest Emote in the original mod)");
stopEmotingAllies = ((BaseUnityPlugin)this).Config.Bind<KeyboardShortcut>("Keybinds", "Stop emoting (allies only)", KeyboardShortcut.Empty, "Keybind to make only your allies stop emoting.");
joinEmoteAllies = ((BaseUnityPlugin)this).Config.Bind<KeyboardShortcut>("Keybinds", "Join emote (allies only)", KeyboardShortcut.Empty, "Keybind to make only your allies join a Join Spot or sync with you. (the join spot can be buggy... for reasons I don't know)");
}
public void Awake()
{
//IL_0019: Unknown result type (might be due to invalid IL or missing references)
//IL_0023: Expected O, but got Unknown
//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_0042: Unknown result type (might be due to invalid IL or missing references)
//IL_004d: Unknown result type (might be due to invalid IL or missing references)
//IL_005d: Expected O, but got Unknown
//IL_0058: Unknown result type (might be due to invalid IL or missing references)
//IL_0062: Expected O, but got Unknown
//IL_0067: Unknown result type (might be due to invalid IL or missing references)
//IL_006c: Unknown result type (might be due to invalid IL or missing references)
//IL_0077: 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_0092: Expected O, but got Unknown
//IL_008d: Unknown result type (might be due to invalid IL or missing references)
//IL_0097: Expected O, but got Unknown
//IL_009c: Unknown result type (might be due to invalid IL or missing references)
//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
//IL_00c7: Expected O, but got Unknown
//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
//IL_00cc: Expected O, but got Unknown
//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
//IL_00d6: Unknown result type (might be due to invalid IL or missing references)
//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
//IL_00ec: Unknown result type (might be due to invalid IL or missing references)
//IL_00fc: Expected O, but got Unknown
//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
//IL_0101: Expected O, but got Unknown
//IL_0106: Unknown result type (might be due to invalid IL or missing references)
//IL_010b: Unknown result type (might be due to invalid IL or missing references)
//IL_0116: Unknown result type (might be due to invalid IL or missing references)
//IL_0121: Unknown result type (might be due to invalid IL or missing references)
//IL_0131: Expected O, but got Unknown
//IL_012c: Unknown result type (might be due to invalid IL or missing references)
//IL_0136: Expected O, but got Unknown
_playAnimHook = (IDetour)new Hook((Delegate)new PlayAnimationOrig(CustomEmotesAPI.PlayAnimation), (Delegate)new PlayAnimationHandler(OnPlayAnimation));
ModSettingsManager.SetModDescription("A mod that makes your turrets taunt/emote with you. Need I say more?");
ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(allAlliesEmote, new CheckBoxConfig
{
category = "General",
description = "Whether all of your allies will taunt/emote with you. (Does not make other players or their allies taunt.)",
name = "All Allies Emote"
}));
ModSettingsManager.AddOption((BaseOption)new KeyBindOption(stopEmotingSolo, new KeyBindConfig
{
category = "General",
description = "Keybind to make only yourself stop emoting.",
name = "Stop emoting (yourself)"
}));
ModSettingsManager.AddOption((BaseOption)new KeyBindOption(stopEmotingAllies, new KeyBindConfig
{
category = "General",
description = "Keybind to make only your allies stop emoting.",
name = "Stop emoting (allies only)"
}));
ModSettingsManager.AddOption((BaseOption)new KeyBindOption(joinEmoteSolo, new KeyBindConfig
{
category = "General",
description = "Keybind to join a Join Spot without making your allies join with you. (alternatively you can just press Sync With Nearest Emote in the original mod)",
name = "Join emote spot (yourself)"
}));
ModSettingsManager.AddOption((BaseOption)new KeyBindOption(joinEmoteAllies, new KeyBindConfig
{
category = "General",
description = "Keybind to make only your allies join a Join Spot or sync with you. Only allies within the Join Spot will join your emote. If it's a non-join emote, the allies will instead sync with your emote. (the join spot can be a little jank)",
name = "Join emote spot (allies only)"
}));
}
private void OpenBMCLink()
{
Process.Start("https://buymeacoffee.com/kaangamgimginnkagnagnking");
}
public void Update()
{
//IL_002b: Unknown result type (might be due to invalid IL or missing references)
//IL_0030: Unknown result type (might be due to invalid IL or missing references)
//IL_004d: Unknown result type (might be due to invalid IL or missing references)
//IL_0052: Unknown result type (might be due to invalid IL or missing references)
//IL_0068: Unknown result type (might be due to invalid IL or missing references)
//IL_006d: Unknown result type (might be due to invalid IL or missing references)
//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
if (!((Object)(object)Run.instance != (Object)null))
{
return;
}
CharacterBody body = NetworkUser.readOnlyLocalPlayersList[0].master.GetBody();
KeyboardShortcut value = stopEmotingSolo.Value;
if (((KeyboardShortcut)(ref value)).IsDown())
{
SendAnimation(body, "none");
}
value = joinEmoteSolo.Value;
if (((KeyboardShortcut)(ref value)).IsDown())
{
JoinAnimation(body);
}
value = stopEmotingAllies.Value;
if (((KeyboardShortcut)(ref value)).IsDown())
{
List<CharacterBody> allyTargets = GetAllyTargets(body, allAlliesEmote.Value);
for (int i = 0; i < allyTargets.Count; i++)
{
SendAnimation(allyTargets[i], "none");
}
}
value = joinEmoteAllies.Value;
if (((KeyboardShortcut)(ref value)).IsDown())
{
List<CharacterBody> allyTargets2 = GetAllyTargets(body, allAlliesEmote.Value);
for (int j = 0; j < allyTargets2.Count; j++)
{
JoinAnimation(allyTargets2[j]);
}
}
}
private void SendAnimation(CharacterBody body, string animationName, int pos = -2)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0008: Unknown result type (might be due to invalid IL or missing references)
//IL_0013: Expected O, but got Unknown
NetMessageExtensions.Send((INetMessage)new SyncAnimationToServer(((NetworkBehaviour)body).netId, animationName, pos), (NetworkDestination)2);
}
private void JoinAnimation(CharacterBody body)
{
BoneMapper boneMapper = GetBoneMapper(body);
if ((Object)(object)boneMapper.currentEmoteSpot != (Object)null)
{
boneMapper.JoinEmoteSpot();
}
}
private BoneMapper GetBoneMapper(CharacterBody body)
{
return ((List<BoneMapper>)typeof(BoneMapper).GetField("allMappers").GetValue(null)).Find((BoneMapper x) => (Object)(object)x.mapperBody == (Object)(object)body);
}
private List<CharacterBody> GetAllyTargets(CharacterBody playerBody, bool turretsOnly)
{
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
ReadOnlyCollection<TeamComponent> teamMembers = TeamComponent.GetTeamMembers(playerBody.teamComponent.teamIndex);
List<CharacterBody> list = new List<CharacterBody>();
for (int i = 0; i < teamMembers.Count; i++)
{
if ((teamMembers[i].body.baseNameToken == "ENGITURRET_BODY_NAME" || (turretsOnly && !Object.op_Implicit((Object)(object)teamMembers[i].body.master.playerCharacterMasterController))) && OwnershipCheck(teamMembers[i].body.master, playerBody.master))
{
list.Add(teamMembers[i].body);
}
}
return list;
}
private bool OwnershipCheck(CharacterMaster minion, CharacterMaster owner)
{
if ((Object)(object)owner != (Object)null)
{
((BaseUnityPlugin)this).Logger.LogInfo((object)(minion.GetBody().GetDisplayName() + "'s owner is " + owner.GetBody().GetDisplayName()));
}
else
{
((BaseUnityPlugin)this).Logger.LogInfo((object)(minion.GetBody().GetDisplayName() + " doesnt have an owner"));
}
return (Object)(object)minion.minionOwnership.ownerMaster == (Object)(object)owner;
}
private void OnPlayAnimation(PlayAnimationOrig orig, string animationName, int pos)
{
//IL_0045: Unknown result type (might be due to invalid IL or missing references)
//IL_004c: Unknown result type (might be due to invalid IL or missing references)
//IL_0057: Expected O, but got Unknown
orig(animationName, pos);
CharacterBody body = NetworkUser.readOnlyLocalPlayersList[0].master.GetBody();
List<CharacterBody> allyTargets = GetAllyTargets(body, allAlliesEmote.Value);
if (allyTargets.Count >= 1)
{
for (int i = 0; i < allyTargets.Count; i++)
{
NetMessageExtensions.Send((INetMessage)new SyncAnimationToServer(((NetworkBehaviour)allyTargets[i]).netId, animationName, pos), (NetworkDestination)2);
}
}
}
}