using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Logging;
using HarmonyLib;
using LCSoundTool;
using Microsoft.CodeAnalysis;
using UnityEngine;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("RustyMod")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyDescription("I CAN FLYYYYYYYYYYYYYYYYYYYYYY")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("RustyMod")]
[assembly: AssemblyTitle("RustyMod")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
internal sealed class EmbeddedAttribute : Attribute
{
}
}
namespace System.Runtime.CompilerServices
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
internal sealed class RefSafetyRulesAttribute : Attribute
{
public readonly int Version;
public RefSafetyRulesAttribute(int P_0)
{
Version = P_0;
}
}
}
internal static class Assets
{
public static AssetBundle AssetBundle { get; private set; }
private static Dictionary<string, Object> AssetList { get; set; }
private static string AssemblyName => Assembly.GetExecutingAssembly().FullName.Split(new char[1] { ',' })[0];
public static void PopulateAssets()
{
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_0011: Expected O, but got Unknown
//IL_003d: Unknown result type (might be due to invalid IL or missing references)
//IL_0048: Expected O, but got Unknown
if ((Object)AssetBundle != (Object)null)
{
RustyModBase.mls.LogWarning((object)"Attempted to load the asset bundle but the bundle was not null!");
return;
}
AssetBundle = RustyModBase.RustyBundle;
if ((Object)AssetBundle == (Object)null)
{
RustyModBase.mls.LogError((object)("Asset bundle at " + RustyModBase.location + "\rusty failed to load!"));
}
AssetList = new Dictionary<string, Object>();
Object[] array = AssetBundle.LoadAllAssets();
Object[] array2 = array;
foreach (Object val in array2)
{
AssetList.Add(val.name, val);
}
}
public static T GetAsset<T>(string name) where T : Object
{
//IL_0059: Unknown result type (might be due to invalid IL or missing references)
//IL_0064: Expected O, but got Unknown
if (!AssetList.TryGetValue(name, out var value))
{
RustyModBase.mls.LogError((object)("Attempted to load asset of name " + name + " but no asset of that name exists!"));
return default(T);
}
T val = (T)(object)((value is T) ? value : null);
if ((Object)val == (Object)null)
{
RustyModBase.mls.LogError((object)("Attempted to load an asset of type " + typeof(T).Name + " but asset of name " + name + " does not match this type!"));
return default(T);
}
return val;
}
}
[HarmonyPatch]
internal class EnemyPatches
{
[HarmonyPatch(typeof(EnemyAI), "Start")]
[HarmonyPostfix]
public static void CreateRustyModel(EnemyAI __instance)
{
//IL_0015: Unknown result type (might be due to invalid IL or missing references)
if (__instance is RadMechAI)
{
((Component)__instance).gameObject.AddComponent<RustyController>();
}
}
}
public class RustyController : MonoBehaviour
{
private List<string> baseMatNames = new List<string> { "ArmLeft", "ArmRight", "Booster", "Core", "EyeArmL", "EyeArmR" };
private Animator vanillaRadMechAnimator;
private Animator rustyAnimator;
private AudioSource rustyAudioSource;
private int loggedMisslesFired = 0;
private AudioClip audioMainSystem;
private AudioClip audioAllOrNothing;
private AudioClip audioBuddy;
private AudioClip audioDontDie;
private AudioClip audioHeyBuddy;
private AudioClip audioHopeOrDispair;
private AudioClip audioIWontMiss;
private AudioClip audioImComing1;
private AudioClip audioImComing2;
private AudioClip audioKeepYouWaiting;
private AudioClip audioLockOn;
private AudioClip audioNoChoice;
private AudioClip audioNoGraverThreat;
private AudioClip audioOnlyICanFly;
private AudioClip audioRubicon;
private AudioClip audioStayCool;
private AudioClip audioStepUpMyGame;
private AudioClip audioUnderPressure;
private AudioClip audioWatchOut;
private AudioClip audioWhatDrivesYou;
private AudioClip audioYouCanDoBetter;
private AudioClip audioYouThereBuddy;
private AudioClip audioYoureFast;
private AudioClip audioYoureGood;
private List<AudioClip> voiceLines;
private int voiceCooldown = 0;
private RadMechAI RadMechAI { get; set; }
private GameObject BaseRustyObject { get; set; }
private Material spotlightMat { get; set; }
private Material defaultMat { get; set; }
private GameObject SecondaryGokuObject { get; set; }
private bool takingStep { get; set; }
private SkinnedMeshRenderer[] skinnedMeshRenderers { get; set; }
private bool IsAttacking { get; set; }
private bool IsDead { get; set; }
private void Start()
{
RadMechAI = ((Component)this).GetComponent<RadMechAI>();
UpdateScanNodeData();
try
{
}
catch (Exception ex)
{
RustyModBase.mls.LogError((object)("RustyMod ARM ERROR: " + ex));
}
HideRadMechModel();
CreateRustyModels();
LoadSounds();
rustyAudioSource.loop = true;
rustyAudioSource.PlayOneShot(audioMainSystem);
}
private void Update()
{
try
{
bool flag = ((EnemyAI)RadMechAI).currentBehaviourState.name == "Fly";
if (RadMechAI.spotlight.activeSelf)
{
RadMechAI.spotlight.SetActive(false);
}
try
{
if (flag && !rustyAudioSource.isPlaying)
{
rustyAudioSource.Play();
}
if (!flag && rustyAudioSource.isPlaying)
{
rustyAudioSource.Pause();
}
if (flag)
{
if (voiceCooldown > 0)
{
voiceCooldown--;
}
else if (new Random().Next(1, 21) == 1)
{
int index = new Random().Next(1, voiceLines.Count);
rustyAudioSource.PlayOneShot(voiceLines[index]);
voiceCooldown = 30;
}
}
if (rustyAnimator.GetInteger("currentAnim") == 7 || (!RadMechAI.attemptingGrab && rustyAnimator.GetInteger("currentnim") == 3))
{
rustyAnimator.SetInteger("currentAnim", 0);
}
if (!RadMechAI.chargingForward)
{
rustyAnimator.SetInteger("currentAnim", 7);
}
if (vanillaRadMechAnimator.GetInteger("currentAnim") < 3)
{
if (vanillaRadMechAnimator.GetBool("leftFootForward"))
{
rustyAnimator.SetInteger("currentAnim", 2);
}
else
{
rustyAnimator.SetInteger("currentAnim", 1);
}
}
if (RadMechAI.aimingGun && RadMechAI.missilesFired != loggedMisslesFired)
{
rustyAnimator.SetInteger("currentAnim", 5);
}
if (RadMechAI.chargingForward)
{
rustyAnimator.SetInteger("currentAnim", 6);
}
if (RadMechAI.attemptingGrab)
{
rustyAnimator.SetInteger("currentAnim", 3);
}
}
catch (Exception ex)
{
RustyModBase.mls.LogError((object)("Step tracker error: " + ex));
}
}
catch (Exception ex2)
{
RustyModBase.mls.LogError((object)("CANNOT CHANGE MATERIAL: " + ex2));
}
}
private void HideRadMechModel()
{
//IL_0008: Unknown result type (might be due to invalid IL or missing references)
try
{
Renderer[] componentsInChildren = ((Component)((Component)RadMechAI).transform.Find("MeshContainer")).GetComponentsInChildren<Renderer>();
componentsInChildren[0].enabled = false;
}
catch (Exception ex)
{
RustyModBase.mls.LogError((object)("RUSTY MOD HIDE RADMECH ERROR: " + ex.Message));
}
}
private void CreateRustyModels()
{
//IL_0081: Unknown result type (might be due to invalid IL or missing references)
//IL_0096: Unknown result type (might be due to invalid IL or missing references)
//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
//IL_0112: Unknown result type (might be due to invalid IL or missing references)
//IL_011e: Unknown result type (might be due to invalid IL or missing references)
//IL_0143: Unknown result type (might be due to invalid IL or missing references)
try
{
GameObject asset = Assets.GetAsset<GameObject>("rustyPrefab");
BaseRustyObject = Object.Instantiate<GameObject>(asset, ((Component)this).gameObject.transform);
((Object)BaseRustyObject).name = "RustyModel";
try
{
rustyAudioSource = BaseRustyObject.GetComponentInChildren<AudioSource>();
}
catch (Exception ex)
{
RustyModBase.mls.LogError((object)("Audio source errer: " + ex));
}
try
{
Vector3 val = default(Vector3);
((Vector3)(ref val))..ctor(((Component)this).gameObject.transform.position.x, ((Component)this).gameObject.transform.position.y, ((Component)this).gameObject.transform.position.z);
Animator[] componentsInChildren = ((Component)((Component)RadMechAI).transform).GetComponentsInChildren<Animator>();
foreach (Animator val2 in componentsInChildren)
{
if (((Object)val2).name == "AnimContainer")
{
vanillaRadMechAnimator = val2;
}
}
BaseRustyObject.transform.SetPositionAndRotation(val, ((Component)this).gameObject.transform.rotation);
BaseRustyObject.transform.localScale = new Vector3(0.6f, 0.6f, 0.6f);
}
catch (Exception ex2)
{
RustyModBase.mls.LogError((object)("Positioning error: " + ex2));
}
try
{
rustyAnimator = BaseRustyObject.GetComponentInChildren<Animator>();
}
catch (Exception ex3)
{
RustyModBase.mls.LogError((object)("Animator errer: " + ex3));
}
try
{
rustyAnimator.SetInteger("currentAnim", 0);
}
catch (Exception ex4)
{
RustyModBase.mls.LogError((object)("ANIMATOR ERROR: " + ex4));
}
}
catch (Exception ex5)
{
RustyModBase.mls.LogError((object)("RUSTY MODEL ERROR: " + ex5));
}
}
private void LoadSounds()
{
string soundFolder = RustyModBase.soundFolder;
voiceLines = new List<AudioClip>();
audioMainSystem = SoundTool.GetAudioClip(RustyModBase.soundFolder, "mainSystem.mp3");
audioAllOrNothing = SoundTool.GetAudioClip(soundFolder, "allOrNothing.mp3");
voiceLines.Add(audioAllOrNothing);
audioBuddy = SoundTool.GetAudioClip(soundFolder, "buddy.mp3");
voiceLines.Add(audioBuddy);
audioDontDie = SoundTool.GetAudioClip(soundFolder, "dontDie.mp3");
voiceLines.Add(audioDontDie);
audioHeyBuddy = SoundTool.GetAudioClip(soundFolder, "heyBuddy.mp3");
voiceLines.Add(audioHeyBuddy);
audioHopeOrDispair = SoundTool.GetAudioClip(soundFolder, "hopeOrDispair.mp3");
voiceLines.Add(audioHopeOrDispair);
audioIWontMiss = SoundTool.GetAudioClip(soundFolder, "iWontMiss.mp3");
voiceLines.Add(audioIWontMiss);
audioImComing1 = SoundTool.GetAudioClip(soundFolder, "imComing1.mp3");
voiceLines.Add(audioImComing1);
audioImComing2 = SoundTool.GetAudioClip(soundFolder, "imComing2.mp3");
voiceLines.Add(audioImComing2);
audioKeepYouWaiting = SoundTool.GetAudioClip(soundFolder, "keepYouWaiting.mp3");
voiceLines.Add(audioKeepYouWaiting);
audioLockOn = SoundTool.GetAudioClip(soundFolder, "lockOn.mp3");
voiceLines.Add(audioLockOn);
audioNoChoice = SoundTool.GetAudioClip(soundFolder, "noChoice.mp3");
voiceLines.Add(audioNoChoice);
audioNoGraverThreat = SoundTool.GetAudioClip(soundFolder, "noGraverThreat.mp3");
voiceLines.Add(audioNoGraverThreat);
audioOnlyICanFly = SoundTool.GetAudioClip(soundFolder, "onlyICanFly.mp3");
voiceLines.Add(audioOnlyICanFly);
audioRubicon = SoundTool.GetAudioClip(soundFolder, "rubicon.mp3");
voiceLines.Add(audioRubicon);
audioStayCool = SoundTool.GetAudioClip(soundFolder, "stayCool.mp3");
voiceLines.Add(audioStayCool);
audioStepUpMyGame = SoundTool.GetAudioClip(soundFolder, "stepUpMyGame.mp3");
voiceLines.Add(audioStepUpMyGame);
audioUnderPressure = SoundTool.GetAudioClip(soundFolder, "underPressure.mp3");
voiceLines.Add(audioUnderPressure);
audioWatchOut = SoundTool.GetAudioClip(soundFolder, "watchOut.mp3");
voiceLines.Add(audioWatchOut);
audioWhatDrivesYou = SoundTool.GetAudioClip(soundFolder, "whatDrivesYou.mp3");
voiceLines.Add(audioWhatDrivesYou);
audioYouCanDoBetter = SoundTool.GetAudioClip(soundFolder, "youCanDoBetter.mp3");
voiceLines.Add(audioYouCanDoBetter);
audioYouThereBuddy = SoundTool.GetAudioClip(soundFolder, "youThereBuddy.mp3");
voiceLines.Add(audioYouThereBuddy);
audioYoureFast = SoundTool.GetAudioClip(soundFolder, "youreFast.mp3");
voiceLines.Add(audioYoureFast);
audioYoureGood = SoundTool.GetAudioClip(soundFolder, "youreGood.mp3");
voiceLines.Add(audioYoureGood);
}
public void TakeStep1()
{
rustyAnimator.SetBool("step2", false);
rustyAnimator.SetBool("step1", true);
}
public void TakeStep2()
{
rustyAnimator.SetBool("step1", false);
rustyAnimator.SetBool("step2", true);
}
private void UpdateScanNodeData()
{
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
((Component)RadMechAI).GetComponentInChildren<ScanNodeProperties>().headerText = "STEEL HAZE /\nV.IV Rusty";
}
}
internal static class SoundPatches
{
public static void Patch()
{
try
{
RustyModBase.mls.LogInfo((object)("Sound Folder: " + RustyModBase.soundFolder));
AudioClip audioClip = SoundTool.GetAudioClip(RustyModBase.soundFolder, "none.mp3");
AudioClip audioClip2 = SoundTool.GetAudioClip(RustyModBase.soundFolder, "mainSystem.mp3");
SoundTool.ReplaceAudioClip("robotTune", audioClip, "3DLradAudio2");
SoundTool.ReplaceAudioClip("RadMechAmbientSFX", audioClip, "EngineSFX");
SoundTool.ReplaceAudioClip("NeonLightFlicker", audioClip, "VoiceSFX");
SoundTool.ReplaceAudioClip("LRADAlarm3", audioClip, "3DLradAudio");
SoundTool.ReplaceAudioClip("ToWar", audioClip, "3DLradAudio2");
SoundTool.ReplaceAudioClip("LradBrainwashingSignal1", audioClip, "3DLradAudio2");
SoundTool.ReplaceAudioClip("LradBrainwashingSignal4", audioClip, "3DLradAudio2");
SoundTool.ReplaceAudioClip("LradBrainwashingSignal6", audioClip, "3DLradAudio2");
SoundTool.ReplaceAudioClip("LradBrainwashingSignal7", audioClip, "3DLradAudio2");
SoundTool.ReplaceAudioClip("LradBrainwashingSignal8", audioClip, "3DLradAudio2");
SoundTool.ReplaceAudioClip("RadMechWake", audioClip2, "CreatureSFX");
RustyModBase.mls.LogInfo((object)"AAAAAAAAAS");
}
catch (Exception ex)
{
RustyModBase.mls.LogError((object)("SOUND ERROR: " + ex));
}
}
}
[HarmonyPatch]
internal class SpawnObjectPatch
{
[HarmonyPatch(typeof(RoundManager), "SyncNestSpawnPositionsClientRpc")]
[HarmonyPostfix]
public static void GetMapObject(RoundManager __instance)
{
//IL_00e7: Unknown result type (might be due to invalid IL or missing references)
try
{
RustyModBase.mls.LogInfo((object)"Patching RadMech spawn");
List<EnemyAINestSpawnObject> enemyNestSpawnObjects = __instance.enemyNestSpawnObjects;
foreach (EnemyAINestSpawnObject item in enemyNestSpawnObjects)
{
if (!(item.enemyType.enemyName != "RadMech"))
{
EnemyAINestSpawnObject val = item;
try
{
Renderer[] componentsInChildren = ((Component)((Component)item).transform.Find("MeshContainer")).GetComponentsInChildren<Renderer>();
componentsInChildren[0].enabled = false;
((Component)item).GetComponentInChildren<ScanNodeProperties>().headerText = "STEEL HAZE /\nV.IV Rusty";
}
catch (Exception ex)
{
RustyModBase.mls.LogError((object)("Hide RadMech Error: " + ex.Message));
}
GameObject asset = Assets.GetAsset<GameObject>("rustyPrefab");
GameObject val2 = Object.Instantiate<GameObject>(asset, ((Component)val).transform);
((Object)val2).name = "RustyModel";
val2.transform.localScale = new Vector3(0.6f, 0.6f, 0.6f);
}
}
}
catch (Exception ex2)
{
RustyModBase.mls.LogError((object)("Spawn Object Error: " + ex2));
}
RustyModBase.mls.LogInfo((object)"RadMech spawn patched");
}
}
[BepInPlugin("Eyasu.OurBuddyRusty", "Our Buddy Rusty", "1.0")]
[BepInDependency(/*Could not decode attribute arguments.*/)]
public class RustyModBase : BaseUnityPlugin
{
private const string modGUID = "Eyasu.OurBuddyRusty";
private const string modName = "Our Buddy Rusty";
private const string modVersion = "1.0";
private readonly Harmony Harmony = new Harmony("Eyasu.OurBuddyRusty");
public static ManualLogSource mls;
public static AssetBundle RustyBundle;
public static Mesh shovelMesh;
public static Material shovelMat;
public static string location;
public static string soundFolder;
private static RustyModBase Instance;
private void Awake()
{
mls = Logger.CreateLogSource("Eyasu.OurBuddyRusty");
mls.LogInfo((object)"AMOGUS SUS");
if ((Object)(object)Instance == (Object)null)
{
Instance = this;
}
location = Path.Join((ReadOnlySpan<char>)Paths.PluginPath, (ReadOnlySpan<char>)"Eyasu-OurBuddyRusty");
soundFolder = location;
string text = Path.Join((ReadOnlySpan<char>)location, (ReadOnlySpan<char>)"rusty");
RustyBundle = AssetBundle.LoadFromFile(text);
mls.LogInfo((object)"Loading asset bundle...");
Assets.PopulateAssets();
if ((Object)(object)RustyBundle == (Object)null)
{
mls.LogError((object)"RUSTY BUNDLE FAILED TO LOAD");
}
Mesh[] array = RustyBundle.LoadAllAssets<Mesh>();
foreach (Mesh val in array)
{
mls.LogMessage((object)((Object)val).name);
}
Harmony.PatchAll(typeof(RustyModBase));
Harmony.PatchAll(typeof(EnemyPatches));
SoundPatches.Patch();
try
{
Harmony.PatchAll(typeof(SpawnObjectPatch));
}
catch (Exception ex)
{
mls.LogError((object)("Spawn Object Patching Error: " + ex));
}
AudioClip audioClip = SoundTool.GetAudioClip(soundFolder, "none.mp3");
AudioClip audioClip2 = SoundTool.GetAudioClip(soundFolder, "mainSystem.mp3");
}
}
namespace RustyMod
{
public static class PluginInfo
{
public const string PLUGIN_GUID = "RustyMod";
public const string PLUGIN_NAME = "RustyMod";
public const string PLUGIN_VERSION = "1.0.0";
}
}
namespace RustyModUtils
{
internal static class Assets
{
public static AssetBundle AssetBundle { get; private set; }
private static Dictionary<string, Object> AssetList { get; set; }
private static string AssemblyName => Assembly.GetExecutingAssembly().FullName.Split(new char[1] { ',' })[0];
public static void PopulateAssets()
{
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_0011: Expected O, but got Unknown
//IL_0067: Unknown result type (might be due to invalid IL or missing references)
//IL_0072: Expected O, but got Unknown
if ((Object)AssetBundle != (Object)null)
{
RustyModBase.mls.LogWarning((object)"Attempted to load the asset bundle but the bundle was not null!");
return;
}
string name = AssemblyName + ".Bundle.gokubracken";
using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(name))
{
AssetBundle = AssetBundle.LoadFromStream(stream);
}
if ((Object)AssetBundle == (Object)null)
{
RustyModBase.mls.LogError((object)("Asset bundle at " + AssemblyName + ".gokubracken failed to load!"));
}
AssetList = new Dictionary<string, Object>();
Object[] array = AssetBundle.LoadAllAssets();
Object[] array2 = array;
foreach (Object val in array2)
{
AssetList.Add(val.name, val);
}
}
}
}