using System;
using System.Collections;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using GameNetcodeStuff;
using HarmonyLib;
using LethalLib.Modules;
using UncannyJackBlack.src.main.c_sharp.net.alien.UncannyJackBlack.item;
using UncannyJackBlack.src.main.c_sharp.net.alien.UncannyJackBlack.sound;
using UncannyJackBlack.src.main.c_sharp.net.alien.UncannyJackBlack.util;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.AI;
using uncannyJackBlack;
using uncannyJackBlack.Behaviours;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("UncannyJackBlack")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("UncannyJackBlack")]
[assembly: AssemblyCopyright("Copyright © 2024")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("482e497d-a94a-4a11-b6e2-ee1a1d13054f")]
[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 UncannyJackBlack.src.main.c_sharp.net.alien.UncannyJackBlack.util
{
public static class ModRegisters
{
public static void registerSimpleScrap(Item item, int rarity = 0, LevelTypes moons = 1)
{
//IL_001b: Unknown result type (might be due to invalid IL or missing references)
NetworkPrefabs.RegisterNetworkPrefab(item.spawnPrefab);
Utilities.FixMixerGroups(item.spawnPrefab);
Items.RegisterScrap(item, rarity, moons);
}
public static void registerSimpleEnemy(EnemyType enemyType, int spawnWeight, LevelTypes moons, TerminalNode terminalNode = null, TerminalKeyword terminalKeyword = null)
{
//IL_001b: Unknown result type (might be due to invalid IL or missing references)
NetworkPrefabs.RegisterNetworkPrefab(enemyType.enemyPrefab);
Utilities.FixMixerGroups(enemyType.enemyPrefab);
Enemies.RegisterEnemy(enemyType, spawnWeight, moons, terminalNode, terminalKeyword);
}
}
}
namespace UncannyJackBlack.src.main.c_sharp.net.alien.UncannyJackBlack.sound
{
public class ModSounds
{
public static AudioClip GROWL_AUDIO;
public static AudioClip SCREAM_AUDIO;
public static AudioClip OOF;
public static void init()
{
GROWL_AUDIO = ModMain.BUNDLE.LoadAsset<AudioClip>("Assets/Unity/MOD_ASSETS/uncannyJackBlack/Growl.mp3");
SCREAM_AUDIO = ModMain.BUNDLE.LoadAsset<AudioClip>("Assets/Unity/MOD_ASSETS/uncannyJackBlack/Scream.mp3");
OOF = ModMain.BUNDLE.LoadAsset<AudioClip>("Assets/Unity/MOD_ASSETS/uncannyJackBlack/OOF.mp3");
ModMain.LOGGER.LogInfo((object)"Registered sounds!");
}
}
}
namespace UncannyJackBlack.src.main.c_sharp.net.alien.UncannyJackBlack.item
{
public class ModEnemies
{
public static EnemyType JACK_BLACK_ENEMY;
public static void init()
{
//IL_0069: Unknown result type (might be due to invalid IL or missing references)
//IL_007d: 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_00e4: Unknown result type (might be due to invalid IL or missing references)
JACK_BLACK_ENEMY = ModMain.BUNDLE.LoadAsset<EnemyType>("Assets/Unity/MOD_ASSETS/uncannyJackBlack/JackBlackEnemy.asset");
JackBlackBehaviour jackBlackBehaviour = JACK_BLACK_ENEMY.enemyPrefab.AddComponent<JackBlackBehaviour>();
((EnemyAI)jackBlackBehaviour).enemyType = JACK_BLACK_ENEMY;
((EnemyAI)jackBlackBehaviour).eye = JACK_BLACK_ENEMY.enemyPrefab.transform.Find("Eye");
Transform obj = JACK_BLACK_ENEMY.enemyPrefab.transform.Find("Eye");
obj.position += new Vector3(0f, 1f, 0f);
((EnemyAI)jackBlackBehaviour).agent = JACK_BLACK_ENEMY.enemyPrefab.GetComponent<NavMeshAgent>();
((Component)JACK_BLACK_ENEMY.enemyPrefab.transform.Find("Body")).GetComponent<EnemyAICollisionDetect>().mainScript = (EnemyAI)(object)jackBlackBehaviour;
JACK_BLACK_ENEMY.enemyPrefab.transform.localScale = new Vector3(2f, 2f, 2f);
jackBlackBehaviour.growlAudio = ModSounds.GROWL_AUDIO;
jackBlackBehaviour.screamAudio = ModSounds.SCREAM_AUDIO;
((EnemyAI)jackBlackBehaviour).creatureAnimator = JACK_BLACK_ENEMY.enemyPrefab.GetComponent<Animator>();
((EnemyAI)jackBlackBehaviour).enemyHP = 5;
jackBlackBehaviour.deathScrap = ModItems.DIAMOND_PICKAXE;
ModRegisters.registerSimpleEnemy(JACK_BLACK_ENEMY, ModMain.CONFIGURATION.spawnWeight.Value, (LevelTypes)(-1));
ModMain.LOGGER.LogInfo((object)"Registered enemies!");
}
}
public class ModItems
{
public static Item DIAMOND_PICKAXE;
public static void init()
{
//IL_0033: Unknown result type (might be due to invalid IL or missing references)
DIAMOND_PICKAXE = ModMain.BUNDLE.LoadAsset<Item>("Assets/Unity/MOD_ASSETS/uncannyJackBlack/DiamondPickaxeItem.asset");
DIAMOND_PICKAXE.spawnPrefab.transform.localScale = new Vector3(0.03f, 0.03f, 0.03f);
DIAMOND_PICKAXE.syncGrabFunction = false;
DIAMOND_PICKAXE.syncUseFunction = true;
DIAMOND_PICKAXE.syncDiscardFunction = false;
DIAMOND_PICKAXE.syncInteractLRFunction = false;
ModRegisters.registerSimpleScrap(DIAMOND_PICKAXE, 0, (LevelTypes)1);
ModMain.LOGGER.LogInfo((object)"Registered items!");
}
}
}
namespace uncannyJackBlack
{
public class ModConfiguration
{
public ConfigEntry<int> spawnWeight;
public ModConfiguration(ConfigFile config)
{
//IL_002b: Unknown result type (might be due to invalid IL or missing references)
//IL_0035: Expected O, but got Unknown
spawnWeight = config.Bind<int>("Spawn Weight", "Jack Black Spawn Weight", 25, new ConfigDescription("The spawn-weight/rarity of Uncanny Jack Black.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 1000), Array.Empty<object>()));
}
}
[BepInPlugin("Alien.UncannyJackBlack", "Uncanny Jack Jack", "1.0.1")]
public class ModMain : BaseUnityPlugin
{
private const string modGUID = "Alien.UncannyJackBlack";
private const string modName = "Uncanny Jack Jack";
private const string modVersion = "1.0.1";
private readonly Harmony harmony = new Harmony("Alien.UncannyJackBlack");
private static ModMain instance;
public static ManualLogSource LOGGER;
public static AssetBundle BUNDLE;
public static ModConfiguration CONFIGURATION { get; internal set; }
private void Awake()
{
if ((Object)(object)instance == (Object)null)
{
instance = this;
}
LOGGER = Logger.CreateLogSource("Alien.UncannyJackBlack");
LOGGER.LogInfo((object)"hey buddy");
CONFIGURATION = new ModConfiguration(((BaseUnityPlugin)this).Config);
string text = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Alien.UncannyJackBlack".Contains(".") ? (string.Join("", "Alien.UncannyJackBlack".Split(new char[1] { '.' }).Skip(1)).ToLower() + "assets") : ("Alien.UncannyJackBlack".ToLower() + "assets"));
BUNDLE = AssetBundle.LoadFromFile(text);
ModSounds.init();
ModItems.init();
ModEnemies.init();
((BaseUnityPlugin)this).Logger.LogInfo((object)"Plugin Alien.UncannyJackBlack is loaded! IRTHGRTUIGHOIERGHUEHGERHU");
}
}
}
namespace uncannyJackBlack.Behaviours
{
public class JackBlackBehaviour : EnemyAI
{
public enum behaviourStates
{
wanderingState,
growlingState,
chasingState
}
public AISearchRoutine searchRoutine;
private const float jackBlackSearchWidth = 65f;
private Vector3 lastPlayerSeenPos;
private Collider[] nearPlayerColliders;
private PlayerControllerB player;
private bool playerFound = false;
private bool lostPlayer = false;
private bool isGrowling = false;
private bool isScreaming = false;
private Transform hair;
private float sinceLastKill = 0f;
private float defaultSpeed;
private const float chaseSpeed = 12f;
private const float growlDuration = 7f;
public AudioClip growlAudio;
public AudioClip screamAudio;
public Item deathScrap;
public AudioSource audioSource;
private EnemyBehaviourState wanderingState = new EnemyBehaviourState();
private EnemyBehaviourState growlingState = new EnemyBehaviourState();
private EnemyBehaviourState chasingState = new EnemyBehaviourState();
private Random enemyRandom;
public override void Start()
{
//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
((EnemyAI)this).Start();
enemyRandom = new Random(StartOfRound.Instance.randomMapSeed + base.thisEnemyIndex);
nearPlayerColliders = (Collider[])(object)new Collider[4];
wanderingState.name = "WANDERING";
growlingState.name = "GROWLING";
chasingState.name = "CHASING";
base.creatureAnimator.SetTrigger("startWalk");
base.enemyBehaviourStates = (EnemyBehaviourState[])(object)new EnemyBehaviourState[3] { wanderingState, growlingState, chasingState };
base.currentBehaviourStateIndex = 0;
audioSource = ((Component)this).GetComponent<AudioSource>();
((EnemyAI)this).StartSearch(((Component)this).transform.position, searchRoutine);
defaultSpeed = base.agent.speed;
}
public override void DoAIInterval()
{
((EnemyAI)this).DoAIInterval();
checkPlayers();
behaviourHandler();
}
public override void HitEnemy(int force = 1, PlayerControllerB playerWhoHit = null, bool playHitSFX = false, int hitID = -1)
{
if (!base.isEnemyDead)
{
base.enemyHP -= force;
if (base.enemyHP <= 0)
{
killJackBlack();
((EnemyAI)this).KillEnemy(false);
Object.Destroy((Object)(object)((Component)this).gameObject);
}
}
}
private void behaviourHandler()
{
//IL_011f: Unknown result type (might be due to invalid IL or missing references)
switch (base.currentBehaviourStateIndex)
{
case 0:
if (Object.op_Implicit((Object)(object)player))
{
ModMain.LOGGER.LogInfo((object)"Found player; beginning to growl");
((EnemyAI)this).SwitchToBehaviourState(1);
sinceLastKill = Time.time;
}
else
{
checkPlayers();
base.agent.speed = defaultSpeed;
ModMain.LOGGER.LogInfo((object)"Wandering...");
}
break;
case 1:
if (!isGrowling)
{
((MonoBehaviour)this).StartCoroutine(growl());
}
break;
case 2:
{
PlayerControllerB closestPlayer = ((EnemyAI)this).GetClosestPlayer(false, false, false);
((EnemyAI)this).SetMovingTowardsTargetPlayer(closestPlayer);
ModMain.LOGGER.LogInfo((object)sinceLastKill);
if (Time.time - sinceLastKill >= 20f)
{
ModMain.LOGGER.LogInfo((object)"Switching back to wandering!");
base.creatureAnimator.SetTrigger("stopChase");
((EnemyAI)this).SwitchToBehaviourState(0);
((EnemyAI)this).StartSearch(((Component)this).transform.position, searchRoutine);
}
else
{
audioSource.PlayOneShot(screamAudio);
((EnemyAI)this).StopSearch(searchRoutine, true);
base.agent.speed = 12f;
ModMain.LOGGER.LogInfo((object)"Chasing closest player");
}
break;
}
}
}
private void playLoopedAudio(AudioClip audioClip)
{
audioSource.clip = audioClip;
audioSource.loop = true;
audioSource.Play();
WalkieTalkie.TransmitOneShotAudio(audioSource, audioSource.clip, 1f);
}
private void stopLoopedAudio()
{
audioSource.clip = null;
audioSource.Stop();
}
private void killJackBlack()
{
//IL_001e: 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)
if (!base.isEnemyDead)
{
base.isEnemyDead = true;
Landmine.SpawnExplosion(((Component)this).transform.position, true, 0f, 0f, 0, 0f, (GameObject)null, false);
GameObject val = Object.Instantiate<GameObject>(deathScrap.spawnPrefab, ((Component)this).transform.position, Quaternion.identity, RoundManager.Instance.spawnedScrapContainer);
val.GetComponent<NetworkObject>().Spawn(false);
PhysicsProp component = val.GetComponent<PhysicsProp>();
((GrabbableObject)component).SetScrapValue(Random.Range(350, 500));
}
}
private IEnumerator growl()
{
isGrowling = true;
base.agent.speed = 0f;
float shakeSpeed = 50f;
float shakeAmount = 50f;
float elapsedTime = 0f;
base.creatureAnimator.SetTrigger("stopWalk");
Quaternion originalRotation = ((Component)this).transform.localRotation;
while (elapsedTime < 7f)
{
ModMain.LOGGER.LogInfo((object)"You spin me right round baby");
float currentSpinSpeed = Mathf.Sin(Time.time * shakeSpeed) * shakeAmount;
audioSource.PlayOneShot(growlAudio);
((Component)this).transform.Rotate(Vector3.up, currentSpinSpeed * Time.deltaTime, (Space)1);
elapsedTime += Time.deltaTime;
yield return null;
}
base.agent.speed = defaultSpeed;
isGrowling = false;
((Component)this).transform.localRotation = originalRotation;
stopLoopedAudio();
((EnemyAI)this).SwitchToBehaviourState(2);
base.creatureAnimator.SetTrigger("startWalk");
base.creatureAnimator.SetTrigger("startChase");
}
public override void OnCollideWithPlayer(Collider other)
{
//IL_002e: Unknown result type (might be due to invalid IL or missing references)
//IL_0038: 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)
PlayerControllerB val = ((EnemyAI)this).MeetsStandardPlayerCollisionConditions(other, false, false);
if ((Object)(object)val != (Object)null)
{
val.BreakLegsSFXServerRpc();
val.KillPlayer(new Vector3(30f, 30f, 30f), true, (CauseOfDeath)6, 7, default(Vector3));
ModMain.LOGGER.LogInfo((object)"Killed player!");
}
}
private void foundPlayer()
{
ModMain.LOGGER.LogInfo((object)"Found a player!");
}
private void noPlayer()
{
player = null;
ModMain.LOGGER.LogInfo((object)"No player found.");
}
private void checkPlayers()
{
//IL_0048: Unknown result type (might be due to invalid IL or missing references)
//IL_0069: Unknown result type (might be due to invalid IL or missing references)
//IL_007d: Unknown result type (might be due to invalid IL or missing references)
player = ((EnemyAI)this).CheckLineOfSightForPlayer(65f, 45, -1);
if (Object.op_Implicit((Object)(object)player))
{
foundPlayer();
}
else
{
noPlayer();
}
if (GameNetworkManager.Instance.localPlayerController.HasLineOfSightToPosition(((Component)this).transform.position, 70f, 25, -1f))
{
float num = Vector3.Distance(((Component)this).transform.position, ((Component)GameNetworkManager.Instance.localPlayerController).transform.position);
if (num < 4f)
{
GameNetworkManager.Instance.localPlayerController.JumpToFearLevel(0.9f, true);
}
else if (num < 9f)
{
GameNetworkManager.Instance.localPlayerController.JumpToFearLevel(0.4f, true);
}
}
}
}
}