Please disclose if any significant portion of your mod was created 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 CustomAlkari v1.4.0
BepInEx/plugins/Custom Alkari/Custom Alkari.dll
Decompiled a month agousing System; using System.Collections; 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 GameNetcodeStuff; using LethalLib.Modules; 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 = "")] [assembly: AssemblyCompany("Custom Alkari")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.4.0.0")] [assembly: AssemblyInformationalVersion("1.4.0")] [assembly: AssemblyProduct("Custom Alkari")] [assembly: AssemblyTitle("Custom Alkari")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.4.0.0")] [module: UnverifiableCode] 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; } } } namespace CustomAlkari { public class AccordionmanAI : EnemyAI { private enum State { LookingForPlayer, WalkingToPlayer } [SerializeField] private SkinnedMeshRenderer head; private int currentState = 0; private float timeSinceCollideWithPlayer = 0f; private float timeSincePlayedSound = 0f; private bool isAttackHead = false; private const float SPEED = 6f; public override void Start() { ((EnemyAI)this).Start(); currentState = 0; head.SetBlendShapeWeight(0, 0f); } private bool HasValidTarget() { return (Object)(object)base.targetPlayer != (Object)null && !base.targetPlayer.isInsideFactory && !base.targetPlayer.isPlayerDead; } public override void Update() { //IL_0110: Unknown result type (might be due to invalid IL or missing references) //IL_0120: Unknown result type (might be due to invalid IL or missing references) //IL_0190: Unknown result type (might be due to invalid IL or missing references) ((EnemyAI)this).Update(); base.creatureAnimator.SetFloat("speed", base.agent.speed); if ((double)base.agent.speed < 0.5) { base.creatureVoice.Stop(); } switch (currentState) { case 0: base.agent.speed = 0f; if (isAttackHead) { isAttackHead = false; ((MonoBehaviour)this).StartCoroutine(IdleHead()); } if (!HasValidTarget()) { ((EnemyAI)this).TargetClosestPlayer(1.5f, false, 70f); currentState = 1; } break; case 1: if (!HasValidTarget()) { currentState = 0; break; } if (timeSinceCollideWithPlayer < 2f) { base.agent.speed = 0f; break; } if (Vector3.Distance(((Component)this).transform.position, ((Component)base.targetPlayer).transform.position) < 2f) { if (!isAttackHead) { isAttackHead = true; ((MonoBehaviour)this).StartCoroutine(AttackHead()); } } else if (isAttackHead) { isAttackHead = false; ((MonoBehaviour)this).StartCoroutine(IdleHead()); } ((EnemyAI)this).SetDestinationToPosition(((Component)base.targetPlayer).transform.position, false); base.agent.speed = 6f; ((EnemyAI)this).SyncPositionToClients(); break; } } public override void DoAIInterval() { ((EnemyAI)this).DoAIInterval(); if (timeSinceCollideWithPlayer < 5f) { timeSinceCollideWithPlayer += 0.2f; } if (timeSincePlayedSound < 7f) { timeSincePlayedSound += 0.2f; } if (timeSincePlayedSound >= 7f) { if (currentState == 1 && (double)base.agent.speed > 0.5) { base.creatureVoice.PlayOneShot(base.enemyType.audioClips[0]); } timeSincePlayedSound = 0f; } } public override void OnCollideWithPlayer(Collider other) { //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) if (!(timeSinceCollideWithPlayer < 5f)) { PlayerControllerB val = ((EnemyAI)this).MeetsStandardPlayerCollisionConditions(other, false, false); if ((Object)(object)val != (Object)null) { val.DamagePlayer(20, true, true, (CauseOfDeath)0, 0, false, default(Vector3)); timeSinceCollideWithPlayer = 0f; } } } public override void HitEnemy(int force = 1, PlayerControllerB? playerWhoHit = null, bool playHitSFX = false, int hitID = -1) { ((EnemyAI)this).HitEnemy(force, playerWhoHit, playHitSFX, hitID); if (!base.isEnemyDead) { base.enemyHP -= force; if (base.enemyHP <= 0 && !base.isEnemyDead) { ((EnemyAI)this).KillEnemy(true); ((EnemyAI)this).KillEnemyOnOwnerClient(false); } } } private IEnumerator AttackHead() { while (head.GetBlendShapeWeight(0) < 100f) { head.SetBlendShapeWeight(0, head.GetBlendShapeWeight(0) + 0.01f); yield return (object)new WaitForSeconds(0.01f); } } private IEnumerator IdleHead() { while (head.GetBlendShapeWeight(0) > 0f) { head.SetBlendShapeWeight(0, head.GetBlendShapeWeight(0) - 0.01f); yield return (object)new WaitForSeconds(0.01f); } } } public class BratanAI : EnemyAI { private enum State { Idle, LookingForPlayer, WalkingToPlayer, WalkingFromPlayer } private int currentState = 0; private float timeSinceCollideWithPlayer = 0f; private float timeSincePlayedSound = 0f; private const float speed = 7f; private const float rotationSpeed = 7f; private bool HasValidTarget() { return (Object)(object)base.targetPlayer != (Object)null && base.targetPlayer.isInsideFactory && !base.targetPlayer.isPlayerDead; } private void WalkToPlayer() { //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_005c: 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_007a: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Unknown result type (might be due to invalid IL or missing references) if (!HasValidTarget()) { currentState = 1; return; } Vector3 val = base.targetPlayer.playerGlobalHead.position - ((Component)this).transform.position; Vector3 normalized = ((Vector3)(ref val)).normalized; Quaternion val2 = Quaternion.LookRotation(normalized); ((Component)this).transform.rotation = Quaternion.Slerp(((Component)this).transform.rotation, val2, Time.deltaTime * 7f); Transform transform = ((Component)this).transform; transform.position += normalized * (Time.deltaTime * 7f); } private void WalkFromPlayer() { //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0061: 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_007f: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Unknown result type (might be due to invalid IL or missing references) //IL_0095: Unknown result type (might be due to invalid IL or missing references) if (!HasValidTarget()) { currentState = 1; return; } Vector3 val = base.targetPlayer.playerGlobalHead.position - ((Component)this).transform.position; Vector3 val2 = -((Vector3)(ref val)).normalized; Quaternion val3 = Quaternion.LookRotation(val2); ((Component)this).transform.rotation = Quaternion.Slerp(((Component)this).transform.rotation, val3, Time.deltaTime * 7f); Transform transform = ((Component)this).transform; transform.position += val2 * (Time.deltaTime * 7f); } public override void Start() { ((EnemyAI)this).Start(); currentState = 1; } public override void Update() { ((EnemyAI)this).Update(); switch (currentState) { case 0: base.creatureAnimator.SetTrigger("stopWalk"); if (!(timeSinceCollideWithPlayer > 10f)) { currentState = 3; } break; case 1: if (!HasValidTarget()) { base.targetPlayer = ((EnemyAI)this).GetClosestPlayer(false, false, false); currentState = 2; } break; case 2: base.creatureAnimator.SetTrigger("startWalk"); WalkToPlayer(); break; case 3: if (timeSinceCollideWithPlayer > 10f) { currentState = 1; break; } base.creatureAnimator.SetTrigger("startWalk"); WalkFromPlayer(); break; } } public override void DoAIInterval() { ((EnemyAI)this).DoAIInterval(); if (timeSincePlayedSound < 6.6f) { timeSincePlayedSound += 0.2f; } if (timeSinceCollideWithPlayer < 10f) { timeSinceCollideWithPlayer += 0.2f; } if (timeSincePlayedSound >= 300f) { base.creatureVoice.PlayOneShot(base.enemyType.audioClips[Random.Range(0, base.enemyType.audioClips.Length)]); timeSincePlayedSound = 0f; } } public override void OnCollideWithPlayer(Collider other) { timeSinceCollideWithPlayer = 0f; currentState = 0; } } public class ValeraAI : EnemyAI { private enum State { LookingForPlayer, WalkingToPlayer, WalkingFromPlayer } private int currentState = 0; private float timeSinceCollideWithPlayer = 0f; private float timeSincePlayedSound = 300f; private const float SPEED = 5f; public override void Start() { ((EnemyAI)this).Start(); currentState = 0; base.creatureVoice.PlayOneShot(base.enemyType.audioClips[0]); } private bool HasValidTarget() { return (Object)(object)base.targetPlayer != (Object)null && !base.targetPlayer.isInsideFactory && !base.targetPlayer.isPlayerDead; } public override void Update() { //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_0133: Unknown result type (might be due to invalid IL or missing references) ((EnemyAI)this).Update(); switch (currentState) { case 0: base.agent.speed = 0f; if (!HasValidTarget()) { base.targetPlayer = ((EnemyAI)this).GetClosestPlayer(false, false, false); currentState = 1; } break; case 1: if (!HasValidTarget()) { currentState = 0; } else if (!(timeSinceCollideWithPlayer < 1f)) { if (Object.op_Implicit((Object)(object)base.targetPlayer)) { ((EnemyAI)this).SetDestinationToPosition(((Component)base.targetPlayer).transform.position, false); base.agent.speed = 5f; ((EnemyAI)this).SyncPositionToClients(); } else { currentState = 0; } } break; case 2: if (!HasValidTarget()) { currentState = 0; } else if (Object.op_Implicit((Object)(object)base.targetPlayer)) { if (timeSinceCollideWithPlayer < 5f) { ((EnemyAI)this).SetDestinationToPosition(((Component)base.targetPlayer).transform.position, false); base.agent.speed = -5f; ((EnemyAI)this).SyncPositionToClients(); } else { timeSinceCollideWithPlayer = 0f; currentState = 1; } } else { currentState = 0; } break; } } public override void DoAIInterval() { ((EnemyAI)this).DoAIInterval(); if (timeSinceCollideWithPlayer < 5f) { timeSinceCollideWithPlayer += 0.2f; } timeSincePlayedSound += 0.2f; } public override void HitEnemy(int force = 1, PlayerControllerB? playerWhoHit = null, bool playHitSFX = false, int hitID = -1) { ((EnemyAI)this).HitEnemy(force, playerWhoHit, playHitSFX, hitID); if (!base.isEnemyDead) { base.enemyHP -= force; if (base.enemyHP <= 0 && !base.isEnemyDead) { ((EnemyAI)this).KillEnemy(true); ((EnemyAI)this).KillEnemyOnOwnerClient(false); } } } public override void OnCollideWithPlayer(Collider other) { if (timeSinceCollideWithPlayer < 5f) { currentState = 2; return; } if (timeSincePlayedSound > 300f) { base.creatureVoice.PlayOneShot(base.enemyType.audioClips[0]); timeSincePlayedSound = 0f; } timeSinceCollideWithPlayer = 0f; } } public class Barbecue : PhysicsProp { private void Start() { } } public class Guitar : PhysicsProp { [SerializeField] private SkinnedMeshRenderer mesh; [SerializeField] private AudioSource audio; [SerializeField] private Transform model; [SerializeField] private ScanNodeProperties scanNode; private int isGuitarBroken = 0; private bool isGuitarEquipped = false; private int guitarStage = 0; private float time = 0f; public override int GetItemDataToSave() { ((GrabbableObject)this).GetItemDataToSave(); return isGuitarBroken; } public override void LoadItemSaveData(int saveData) { ((GrabbableObject)this).LoadItemSaveData(saveData); isGuitarBroken = saveData; if (isGuitarBroken == 1) { mesh.SetBlendShapeWeight(0, 100f); } } public override void Start() { //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Unknown result type (might be due to invalid IL or missing references) ((GrabbableObject)this).Start(); model.localPosition = new Vector3(0f, 0.1f, 0f); model.localRotation = Quaternion.identity; } public override void Update() { ((GrabbableObject)this).Update(); if (isGuitarBroken == 0 && (Object)(object)((GrabbableObject)this).playerHeldBy != (Object)null) { time += Time.deltaTime; } } public override void EquipItem() { //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Unknown result type (might be due to invalid IL or missing references) ((PhysicsProp)this).EquipItem(); time = 0f; if ((Object)(object)((GrabbableObject)this).playerHeldBy != (Object)null) { ((GrabbableObject)this).playerHeldBy.equippedUsableItemQE = true; model.localPosition = new Vector3(-0.3418f, 0f, 0f); model.localRotation = Quaternion.Euler(0f, 270f, 0f); } } public override void DiscardItem() { //IL_003b: 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) if ((Object)(object)((GrabbableObject)this).playerHeldBy != (Object)null) { ((GrabbableObject)this).playerHeldBy.equippedUsableItemQE = false; } isGuitarEquipped = false; model.localPosition = new Vector3(0f, 0.1f, 0f); model.localRotation = Quaternion.identity; ((GrabbableObject)this).DiscardItem(); } public override void ItemActivate(bool used, bool buttonDown = true) { //IL_0080: Unknown result type (might be due to invalid IL or missing references) //IL_0086: Unknown result type (might be due to invalid IL or missing references) ((GrabbableObject)this).ItemActivate(used, buttonDown); if (isGuitarBroken != 0 || !isGuitarEquipped) { return; } if (time < 2f) { if (guitarStage < 10) { guitarStage++; time = 0f; } else { isGuitarBroken = 1; ((GrabbableObject)this).playerHeldBy.DamagePlayer(10, true, true, (CauseOfDeath)0, 0, false, default(Vector3)); mesh.SetBlendShapeWeight(0, 100f); ((GrabbableObject)this).scrapValue = (int)((double)((GrabbableObject)this).scrapValue * 0.7); scanNode.scrapValue = ((GrabbableObject)this).scrapValue; } } time = 0f; audio.Play(); } public override void ItemInteractLeftRight(bool right) { //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_008c: 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_0041: Unknown result type (might be due to invalid IL or missing references) ((GrabbableObject)this).ItemInteractLeftRight(right); if (!right) { if (!isGuitarEquipped) { isGuitarEquipped = true; model.localPosition = Vector3.zero; model.localRotation = Quaternion.identity; } else { isGuitarEquipped = false; model.localPosition = new Vector3(-0.3418f, 0f, 0f); model.localRotation = Quaternion.Euler(0f, 270f, 0f); } } } } [BepInPlugin("ru.PunkPerson.customalkari", "Custom Alkari", "1.4.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] public class Plugin : BaseUnityPlugin { public const string ModGUID = "ru.PunkPerson.customalkari"; public const string ModName = "Custom Alkari"; public const string ModVersion = "1.4.0"; private string assetFile; private AssetBundle bundle; private void Awake() { ((BaseUnityPlugin)this).Logger.LogInfo((object)"Plugin Custom Alkari is loaded!"); assetFile = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "custom alkari"); bundle = AssetBundle.LoadFromFile(assetFile); Type[] types = Assembly.GetExecutingAssembly().GetTypes(); Type[] array = types; foreach (Type type in array) { MethodInfo[] methods = type.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic); MethodInfo[] array2 = methods; foreach (MethodInfo methodInfo in array2) { object[] customAttributes = methodInfo.GetCustomAttributes(typeof(RuntimeInitializeOnLoadMethodAttribute), inherit: false); if (customAttributes.Length != 0) { methodInfo.Invoke(null, null); } } } Registrator registrator = new Registrator(bundle); registrator.RegisterEnemies(); registrator.RegisterItems(); } } public class Registrator { private AssetBundle bundle; public Registrator(AssetBundle bundle) { this.bundle = bundle; } private void YaroslavInit() { Item val = bundle.LoadAsset<Item>("Assets/Yaroslav/YaroslavItem.asset"); NetworkPrefabs.RegisterNetworkPrefab(val.spawnPrefab); Utilities.FixMixerGroups(val.spawnPrefab); Items.RegisterScrap(val, 25, (LevelTypes)900); } private void ValeraInit() { EnemyType val = bundle.LoadAsset<EnemyType>("Assets/Valera/ValeraEnemy.asset"); TerminalNode val2 = bundle.LoadAsset<TerminalNode>("Assets/Valera/ValeraTerminal.asset"); TerminalKeyword val3 = bundle.LoadAsset<TerminalKeyword>("Assets/Valera/ValeraKeyword.asset"); NetworkPrefabs.RegisterNetworkPrefab(val.enemyPrefab); Enemies.RegisterEnemy(val, 15, (LevelTypes)(-1), val2, val3); } private void YuriInit() { Item val = bundle.LoadAsset<Item>("Assets/Yuri/YuriItem.asset"); NetworkPrefabs.RegisterNetworkPrefab(val.spawnPrefab); Utilities.FixMixerGroups(val.spawnPrefab); Items.RegisterScrap(val, 30, (LevelTypes)(-1)); } private void TsoiInit() { Item val = bundle.LoadAsset<Item>("Assets/Tsoi/TsoiItem.asset"); NetworkPrefabs.RegisterNetworkPrefab(val.spawnPrefab); Utilities.FixMixerGroups(val.spawnPrefab); Items.RegisterScrap(val, 10, (LevelTypes)(-1)); } private void BratanInit() { Item val = bundle.LoadAsset<Item>("Assets/Bratan/BratanItem.asset"); NetworkPrefabs.RegisterNetworkPrefab(val.spawnPrefab); Utilities.FixMixerGroups(val.spawnPrefab); Items.RegisterScrap(val, 30, (LevelTypes)(-1)); } private void BratanEnemyInit() { EnemyType val = bundle.LoadAsset<EnemyType>("Assets/BratanEnemy/BratanEnemy.asset"); NetworkPrefabs.RegisterNetworkPrefab(val.enemyPrefab); Enemies.RegisterEnemy(val, 30, (LevelTypes)(-1), (TerminalNode)null, (TerminalKeyword)null); } private void AccordionmanInit() { EnemyType val = bundle.LoadAsset<EnemyType>("Assets/Accordionman/AccordionmanEnemy.asset"); NetworkPrefabs.RegisterNetworkPrefab(val.enemyPrefab); Enemies.RegisterEnemy(val, 10, (LevelTypes)(-1), (TerminalNode)null, (TerminalKeyword)null); } private void GuitarInit() { Item val = bundle.LoadAsset<Item>("Assets/Guitar/GuitarItem.asset"); NetworkPrefabs.RegisterNetworkPrefab(val.spawnPrefab); Utilities.FixMixerGroups(val.spawnPrefab); Items.RegisterScrap(val, 20, (LevelTypes)(-1)); } public void RegisterEnemies() { ValeraInit(); AccordionmanInit(); } public void RegisterItems() { YaroslavInit(); YuriInit(); BratanInit(); TsoiInit(); GuitarInit(); } } }