using 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();
}
}
}