Please disclose if your mod was created primarily using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of Team Company 2 v0.2.2
plugins/BepInEx/Nordbo.TF2Skins.dll
Decompiled 2 years agousing 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 Microsoft.CodeAnalysis; using ModelReplacement; 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: IgnoresAccessChecksTo("Assembly-CSharp")] [assembly: AssemblyCompany("Nordbo.TF2Skins")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("TF2Skins")] [assembly: AssemblyTitle("Nordbo.TF2Skins")] [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.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [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; } } } namespace TF2Skins { public class EngineerReplacement : BodyReplacementBase { protected override GameObject? LoadAssetsAndReturnModel() { GameObject val = Assets.mainAssetBundle.LoadAsset<GameObject>("engineer"); if ((Object)(object)val == (Object)null) { Plugin.Logger.LogError((object)"engineer asset is not found in the asset bundle."); } else { Plugin.Logger.LogInfo((object)"engineer asset loaded successfully."); } return val; } protected override void OnEmoteStart(int emoteId) { if (emoteId == 1) { AudioClip randomAudio = Assets.engineerE1.GetRandomAudio(StartOfRound.Instance.randomMapSeed); ((BodyReplacementBase)this).controller.movementAudio.PlayOneShot(randomAudio, 0.8f); } if (emoteId == 2) { AudioClip randomAudio2 = Assets.engineerE2.GetRandomAudio(StartOfRound.Instance.randomMapSeed); ((BodyReplacementBase)this).controller.movementAudio.PlayOneShot(randomAudio2, 0.8f); } } } public class SpyReplacement : BodyReplacementBase { protected override GameObject? LoadAssetsAndReturnModel() { GameObject val = Assets.mainAssetBundle.LoadAsset<GameObject>("spy"); if ((Object)(object)val == (Object)null) { Plugin.Logger.LogError((object)"spy asset is not found in the asset bundle."); } else { Plugin.Logger.LogInfo((object)"spy asset loaded successfully."); } return val; } protected override void OnEmoteStart(int emoteId) { if (emoteId == 1) { AudioClip randomAudio = Assets.spyE1.GetRandomAudio(StartOfRound.Instance.randomMapSeed); ((BodyReplacementBase)this).controller.movementAudio.PlayOneShot(randomAudio, 0.8f); } if (emoteId == 2) { AudioClip randomAudio2 = Assets.spyE2.GetRandomAudio(StartOfRound.Instance.randomMapSeed); ((BodyReplacementBase)this).controller.movementAudio.PlayOneShot(randomAudio2, 0.8f); } } } public class SniperReplacement : BodyReplacementBase { protected override GameObject? LoadAssetsAndReturnModel() { GameObject val = Assets.mainAssetBundle.LoadAsset<GameObject>("sniper"); if ((Object)(object)val == (Object)null) { Plugin.Logger.LogError((object)"sniper asset is not found in the asset bundle."); } else { Plugin.Logger.LogInfo((object)"sniper asset loaded successfully."); } return val; } protected override void OnEmoteStart(int emoteId) { if (emoteId == 1) { AudioClip randomAudio = Assets.sniperE1.GetRandomAudio(StartOfRound.Instance.randomMapSeed); ((BodyReplacementBase)this).controller.movementAudio.PlayOneShot(randomAudio, 0.8f); } if (emoteId == 2) { AudioClip randomAudio2 = Assets.sniperE2.GetRandomAudio(StartOfRound.Instance.randomMapSeed); ((BodyReplacementBase)this).controller.movementAudio.PlayOneShot(randomAudio2, 0.8f); } } } public class ScoutReplacement : BodyReplacementBase { protected override GameObject? LoadAssetsAndReturnModel() { GameObject val = Assets.mainAssetBundle.LoadAsset<GameObject>("scout"); if ((Object)(object)val == (Object)null) { Plugin.Logger.LogError((object)"scout asset is not found in the asset bundle."); } else { Plugin.Logger.LogInfo((object)"scout asset loaded successfully."); } return val; } protected override void OnEmoteStart(int emoteId) { if (emoteId == 1) { AudioClip randomAudio = Assets.scoutE1.GetRandomAudio(StartOfRound.Instance.randomMapSeed); ((BodyReplacementBase)this).controller.movementAudio.PlayOneShot(randomAudio, 0.8f); } if (emoteId == 2) { AudioClip randomAudio2 = Assets.scoutE2.GetRandomAudio(StartOfRound.Instance.randomMapSeed); ((BodyReplacementBase)this).controller.movementAudio.PlayOneShot(randomAudio2, 0.8f); } } } public class PyroReplacement : BodyReplacementBase { protected override GameObject? LoadAssetsAndReturnModel() { GameObject val = Assets.mainAssetBundle.LoadAsset<GameObject>("pyro"); if ((Object)(object)val == (Object)null) { Plugin.Logger.LogError((object)"pyro asset is not found in the asset bundle."); } else { Plugin.Logger.LogInfo((object)"pyro asset loaded successfully."); } return val; } protected override void OnEmoteStart(int emoteId) { if (emoteId == 1) { AudioClip randomAudio = Assets.pyroE1.GetRandomAudio(StartOfRound.Instance.randomMapSeed); ((BodyReplacementBase)this).controller.movementAudio.PlayOneShot(randomAudio, 0.8f); } if (emoteId == 2) { AudioClip randomAudio2 = Assets.pyroE2.GetRandomAudio(StartOfRound.Instance.randomMapSeed); ((BodyReplacementBase)this).controller.movementAudio.PlayOneShot(randomAudio2, 0.8f); } } } public class DemoReplacement : BodyReplacementBase { protected override GameObject? LoadAssetsAndReturnModel() { GameObject val = Assets.mainAssetBundle.LoadAsset<GameObject>("demoman"); if ((Object)(object)val == (Object)null) { Plugin.Logger.LogError((object)"demoman asset is not found in the asset bundle."); } else { Plugin.Logger.LogInfo((object)"demoman asset loaded successfully."); } return val; } protected override void OnEmoteStart(int emoteId) { if (emoteId == 1) { AudioClip randomAudio = Assets.demoE1.GetRandomAudio(StartOfRound.Instance.randomMapSeed); ((BodyReplacementBase)this).controller.movementAudio.PlayOneShot(randomAudio, 0.8f); } if (emoteId == 2) { AudioClip randomAudio2 = Assets.demoE2.GetRandomAudio(StartOfRound.Instance.randomMapSeed); ((BodyReplacementBase)this).controller.movementAudio.PlayOneShot(randomAudio2, 0.8f); } } } public class SoldierReplacement : BodyReplacementBase { protected override GameObject? LoadAssetsAndReturnModel() { GameObject val = Assets.mainAssetBundle.LoadAsset<GameObject>("soldier"); if ((Object)(object)val == (Object)null) { Plugin.Logger.LogError((object)"soldier asset is not found in the asset bundle."); } else { Plugin.Logger.LogInfo((object)"soldier asset loaded successfully."); } return val; } protected override void OnEmoteStart(int emoteId) { if (emoteId == 1) { AudioClip randomAudio = Assets.soldierE1.GetRandomAudio(StartOfRound.Instance.randomMapSeed); ((BodyReplacementBase)this).controller.movementAudio.PlayOneShot(randomAudio, 0.8f); } if (emoteId == 2) { AudioClip randomAudio2 = Assets.soldierE2.GetRandomAudio(StartOfRound.Instance.randomMapSeed); ((BodyReplacementBase)this).controller.movementAudio.PlayOneShot(randomAudio2, 0.8f); } } } public class HeavyReplacement : BodyReplacementBase { protected override GameObject? LoadAssetsAndReturnModel() { GameObject val = Assets.mainAssetBundle.LoadAsset<GameObject>("heavy"); if ((Object)(object)val == (Object)null) { Plugin.Logger.LogError((object)"heavy asset is not found in the asset bundle."); } else { Plugin.Logger.LogInfo((object)"heavy asset loaded successfully."); } return val; } protected override void OnEmoteStart(int emoteId) { if (emoteId == 1) { AudioClip randomAudio = Assets.heavyE1.GetRandomAudio(StartOfRound.Instance.randomMapSeed); ((BodyReplacementBase)this).controller.movementAudio.PlayOneShot(randomAudio, 0.8f); } if (emoteId == 2) { AudioClip randomAudio2 = Assets.heavyE2.GetRandomAudio(StartOfRound.Instance.randomMapSeed); ((BodyReplacementBase)this).controller.movementAudio.PlayOneShot(randomAudio2, 0.8f); } } } public class MedicReplacement : BodyReplacementBase { protected override GameObject? LoadAssetsAndReturnModel() { GameObject val = Assets.mainAssetBundle.LoadAsset<GameObject>("medic"); if ((Object)(object)val == (Object)null) { Plugin.Logger.LogError((object)"medic asset is not found in the asset bundle."); } else { Plugin.Logger.LogInfo((object)"medic asset loaded successfully."); } return val; } protected override void OnEmoteStart(int emoteId) { if (emoteId == 1) { AudioClip randomAudio = Assets.medicE1.GetRandomAudio(StartOfRound.Instance.randomMapSeed); ((BodyReplacementBase)this).controller.movementAudio.PlayOneShot(randomAudio, 0.8f); } if (emoteId == 2) { AudioClip randomAudio2 = Assets.medicE2.GetRandomAudio(StartOfRound.Instance.randomMapSeed); ((BodyReplacementBase)this).controller.movementAudio.PlayOneShot(randomAudio2, 0.8f); } } } public class SaxtonReplacement : BodyReplacementBase { protected override GameObject? LoadAssetsAndReturnModel() { GameObject val = Assets.mainAssetBundle.LoadAsset<GameObject>("Saxton"); if ((Object)(object)val == (Object)null) { Plugin.Logger.LogError((object)"Saxton asset is not found in the asset bundle."); } else { Plugin.Logger.LogInfo((object)"Saxton asset loaded successfully."); } return val; } protected override void OnEmoteStart(int emoteId) { if (emoteId == 1) { AudioClip randomAudio = Assets.saxtonE1.GetRandomAudio(StartOfRound.Instance.randomMapSeed); ((BodyReplacementBase)this).controller.movementAudio.PlayOneShot(randomAudio, 0.8f); } if (emoteId == 2) { AudioClip randomAudio2 = Assets.saxtonE2.GetRandomAudio(StartOfRound.Instance.randomMapSeed); ((BodyReplacementBase)this).controller.movementAudio.PlayOneShot(randomAudio2, 0.8f); } } } [BepInPlugin("nordbo.TF2Skins", "Team Fortress 2 Models", "1.0.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] public class Plugin : BaseUnityPlugin { private const string modGUID = "nordbo.TF2Skins"; private const string modName = "Team Fortress 2 Models"; private const string modVersion = "1.0.0"; internal static ManualLogSource Logger { get; private set; } internal static Harmony? Harmony { get; set; } private void Awake() { //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Expected O, but got Unknown Logger = Logger.CreateLogSource("Team Fortress 2 Models"); Logger.LogInfo((object)"Loading plugin nordbo.TF2Skins"); string location = Assembly.GetExecutingAssembly().Location; string directoryName = Path.GetDirectoryName(location); Assets.PopulateAssets(directoryName); if ((Object)(object)Assets.mainAssetBundle == (Object)null) { Logger.LogError((object)"Asset bundle failed to load."); return; } RegisterModels(); Harmony = new Harmony("nordbo.TF2Skins"); Harmony.PatchAll(); Logger.LogInfo((object)"Plugin nordbo.TF2Skins is loaded!"); } private void RegisterModels() { if ((Object)(object)Assets.mainAssetBundle != (Object)null) { ModelReplacementAPI.RegisterSuitModelReplacement("Engineer", typeof(EngineerReplacement)); ModelReplacementAPI.RegisterSuitModelReplacement("Spy", typeof(SpyReplacement)); ModelReplacementAPI.RegisterSuitModelReplacement("Sniper", typeof(SniperReplacement)); ModelReplacementAPI.RegisterSuitModelReplacement("Pyro", typeof(PyroReplacement)); ModelReplacementAPI.RegisterSuitModelReplacement("Demoman", typeof(DemoReplacement)); ModelReplacementAPI.RegisterSuitModelReplacement("Scout", typeof(ScoutReplacement)); ModelReplacementAPI.RegisterSuitModelReplacement("Soldier", typeof(SoldierReplacement)); ModelReplacementAPI.RegisterSuitModelReplacement("Heavy", typeof(HeavyReplacement)); ModelReplacementAPI.RegisterSuitModelReplacement("Medic", typeof(MedicReplacement)); ModelReplacementAPI.RegisterSuitModelReplacement("Saxton", typeof(SaxtonReplacement)); } else { Logger.LogError((object)"Failed to load asset bundle."); } } } public static class Assets { public class RandomAudioClip { private List<AudioClip> audioClipList = new List<AudioClip>(); public AudioClip GetRandomAudio(int seed) { Random random = new Random(); int num = random.Next(audioClipList.Count); Console.WriteLine($"Get audio N {audioClipList.Count} > {num}"); return audioClipList[num]; } public void AddAudio(string name) { AudioClip audioClipFromName = GetAudioClipFromName(name); if ((Object)(object)audioClipFromName != (Object)null) { audioClipList.Add(audioClipFromName); } else { Console.WriteLine("Failed to load audio clip " + name); } } } public static string mainAssetBundleName = "tf2bundle"; public static AssetBundle mainAssetBundle; public static RandomAudioClip scoutE1 = new RandomAudioClip(); public static RandomAudioClip scoutE2 = new RandomAudioClip(); public static RandomAudioClip engineerE1 = new RandomAudioClip(); public static RandomAudioClip engineerE2 = new RandomAudioClip(); public static RandomAudioClip spyE1 = new RandomAudioClip(); public static RandomAudioClip spyE2 = new RandomAudioClip(); public static RandomAudioClip sniperE1 = new RandomAudioClip(); public static RandomAudioClip sniperE2 = new RandomAudioClip(); public static RandomAudioClip pyroE1 = new RandomAudioClip(); public static RandomAudioClip pyroE2 = new RandomAudioClip(); public static RandomAudioClip demoE1 = new RandomAudioClip(); public static RandomAudioClip demoE2 = new RandomAudioClip(); public static RandomAudioClip soldierE1 = new RandomAudioClip(); public static RandomAudioClip soldierE2 = new RandomAudioClip(); public static RandomAudioClip heavyE1 = new RandomAudioClip(); public static RandomAudioClip heavyE2 = new RandomAudioClip(); public static RandomAudioClip medicE1 = new RandomAudioClip(); public static RandomAudioClip medicE2 = new RandomAudioClip(); public static RandomAudioClip saxtonE1 = new RandomAudioClip(); public static RandomAudioClip saxtonE2 = new RandomAudioClip(); private static string GetAssemblyName() { return Assembly.GetExecutingAssembly().FullName.Split(',')[0]; } public static void PopulateAssets(string path) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Expected O, but got Unknown if ((Object)mainAssetBundle == (Object)null) { mainAssetBundle = AssetBundle.LoadFromFile(Path.Combine(path, mainAssetBundleName)); } scoutE1.AddAudio("scout_laugh"); scoutE1.AddAudio("scout_boink"); scoutE1.AddAudio("scout_bonk"); scoutE2.AddAudio("scout_yousuck"); scoutE2.AddAudio("scout_dumbass"); engineerE1.AddAudio("engineer_makinbacon"); engineerE1.AddAudio("engineer_yipi"); engineerE2.AddAudio("engineer_no01"); engineerE2.AddAudio("engineer_taunts"); spyE1.AddAudio("spy_mother"); spyE1.AddAudio("spy_slaphand"); spyE2.AddAudio("spy_no"); spyE2.AddAudio("spy_yousuck"); sniperE1.AddAudio("sniper_jarate"); sniperE1.AddAudio("sniper_queen"); sniperE2.AddAudio("sniper_thxmate"); sniperE2.AddAudio("sniper_medic"); pyroE1.AddAudio("pyro_laugh"); pyroE2.AddAudio("pyro_taunts"); pyroE2.AddAudio("pyro_taunts2"); pyroE2.AddAudio("pyro_medic"); demoE1.AddAudio("demoman_gibberish"); demoE1.AddAudio("demoman_ka_booom"); demoE2.AddAudio("demoman_medic"); demoE2.AddAudio("demoman_no01"); soldierE1.AddAudio("soldier_dominated"); soldierE1.AddAudio("soldier_wannasee"); soldierE2.AddAudio("soldier_medic"); soldierE2.AddAudio("soldier_no"); heavyE1.AddAudio("heavy_specialkaboom"); heavyE2.AddAudio("heavy_kissme"); heavyE2.AddAudio("heavy_medic01"); heavyE2.AddAudio("heavy_no02"); medicE1.AddAudio("medic_cheers"); medicE1.AddAudio("medic_taunts03"); medicE2.AddAudio("medic_medic"); medicE2.AddAudio("medic_spy"); saxtonE1.AddAudio("saxton_gravity"); saxtonE1.AddAudio("saxton_rumble"); saxtonE1.AddAudio("saxton_laugh"); saxtonE2.AddAudio("saxton_highfive"); } public static AudioClip? GetAudioClipFromName(string name) { Object obj = mainAssetBundle.LoadAsset(name); return (AudioClip?)(object)((obj is AudioClip) ? obj : null); } } public static class MyPluginInfo { public const string PLUGIN_GUID = "Nordbo.TF2Skins"; public const string PLUGIN_NAME = "TF2Skins"; public const string PLUGIN_VERSION = "1.0.0"; } } namespace TF2Skins.Patches { [HarmonyPatch(typeof(TVScript))] public class ExampleTVPatch { [HarmonyPatch("SwitchTVLocalClient")] [HarmonyPrefix] private static void SwitchTVPrefix(TVScript __instance) { StartOfRound.Instance.shipRoomLights.SetShipLightsBoolean(__instance.tvOn); } } } namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] internal sealed class IgnoresAccessChecksToAttribute : Attribute { public IgnoresAccessChecksToAttribute(string assemblyName) { } } }