using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Logging;
using HarmonyLib;
using UnityEngine;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("StinkyEnemyPlugin")]
[assembly: AssemblyDescription("A plugin made for R.E.P.O. requires BepInEx and RepoLib")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("StinkyEnemyPlugin")]
[assembly: AssemblyCopyright("Copyright © 2025")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("7a38e5b0-3017-4c5f-9f17-502058a1a921")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace StinkyEnemy;
[BepInPlugin("LnadoZor.StinkyEnemy", "Stinky Enemy", "1.0.0")]
public class StinkyEnemyBase : BaseUnityPlugin
{
private const string modUID = "LnadoZor.StinkyEnemy";
private const string modName = "Stinky Enemy";
private const string modVersion = "1.0.0";
internal static StinkyEnemyBase instance;
internal ManualLogSource logger;
private static Mesh StinkyBody;
private static Texture2D StinkyTexture;
private readonly Harmony harmony = new Harmony("LnadoZor.StinkyEnemy");
private void Awake()
{
logger = ((BaseUnityPlugin)this).Logger;
logger.LogInfo((object)"Loading Stinky Enemy mod...");
if ((Object)(object)instance == (Object)null)
{
instance = this;
harmony.PatchAll();
string directoryName = Path.GetDirectoryName(((BaseUnityPlugin)this).Info.Location);
AssetBundle val = AssetBundle.LoadFromFile(Path.Combine(directoryName, "stinky_assets"));
if ((Object)(object)val == (Object)null)
{
logger.LogError((object)"Failed to load asset bundle!");
return;
}
GameObject val2 = val.LoadAsset<GameObject>("stinkmodel");
if ((Object)(object)val2 == (Object)null)
{
logger.LogError((object)"Failed to load 'stinkmodel.fbx' from asset bundle!");
return;
}
MeshFilter componentInChildren = val2.GetComponentInChildren<MeshFilter>();
if ((Object)(object)componentInChildren != (Object)null && (Object)(object)componentInChildren.sharedMesh != (Object)null)
{
StinkyBody = componentInChildren.sharedMesh;
StinkyTexture = val.LoadAsset<Texture2D>("stinkyTexture");
if ((Object)(object)StinkyTexture == (Object)null)
{
logger.LogError((object)"Failed to load 'stinkyTexture.png'!");
}
else
{
logger.LogInfo((object)"Successfully loaded assets for Stinky Enemy mod!");
}
}
else
{
logger.LogError((object)"Failed to extract mesh from stinkmodel.fbx!");
}
}
else
{
Object.Destroy((Object)(object)this);
}
}
private static void DisableMeshRenderersExcept(Transform parent)
{
if ((Object)(object)parent == (Object)null)
{
instance.logger.LogError((object)"Parent transform is null!");
return;
}
Transform[] componentsInChildren = ((Component)parent).GetComponentsInChildren<Transform>(true);
foreach (Transform val in componentsInChildren)
{
if (!(((Object)val).name == "Head Top") && !(((Object)val).name == "Head Top_Mouth Half Open"))
{
MeshRenderer component = ((Component)val).GetComponent<MeshRenderer>();
if ((Object)(object)component != (Object)null)
{
((Renderer)component).enabled = false;
}
}
}
}
public static void ModifyEnemyHead(GameObject enemyHead)
{
Transform val = enemyHead.transform.Find("Enable/Mesh/Animation System/Main Animation/Top Mesh/Offset/Top Animation/Mesh/Enemy Head Top - Idle/Head Top");
Transform val2 = enemyHead.transform.Find("Enable/Mesh/Animation System/Main Animation/Top Mesh/Offset/Top Animation/Mesh/Enemy Head Top - Chase/Headman_Mouth Half Open/Head Top_Mouth Half Open");
if ((Object)(object)val == (Object)null)
{
instance.logger.LogError((object)"Head Top object not found!");
return;
}
ModifyMeshAndMaterial(val);
if ((Object)(object)val2 == (Object)null)
{
instance.logger.LogError((object)"Head Top_Mouth Half Open object not found!");
}
else
{
ModifyMeshAndMaterial(val2);
}
Transform parent = val.parent;
Transform val3 = ((parent != null) ? parent.parent : null);
if ((Object)(object)val3 == (Object)null)
{
instance.logger.LogError((object)"Head Top's parent parent is null!");
return;
}
DisableMeshRenderersExcept(val3);
instance.logger.LogInfo((object)"Finished modifying enemy head.");
}
private static void ModifyMeshAndMaterial(Transform target)
{
//IL_0161: Unknown result type (might be due to invalid IL or missing references)
//IL_017c: Unknown result type (might be due to invalid IL or missing references)
//IL_0197: Unknown result type (might be due to invalid IL or missing references)
if ((Object)(object)target == (Object)null)
{
return;
}
MeshFilter component = ((Component)target).GetComponent<MeshFilter>();
if ((Object)(object)component != (Object)null)
{
component.mesh = StinkyBody;
}
else
{
instance.logger.LogError((object)("MeshFilter not found on " + ((Object)target).name + "!"));
}
MeshRenderer component2 = ((Component)target).GetComponent<MeshRenderer>();
if ((Object)(object)component2 != (Object)null)
{
Material sharedMaterial = ((Renderer)component2).sharedMaterial;
if ((Object)(object)sharedMaterial != (Object)null)
{
if (sharedMaterial.HasProperty("_AlbedoTexture"))
{
sharedMaterial.SetTexture("_AlbedoTexture", (Texture)(object)StinkyTexture);
}
else if (sharedMaterial.HasProperty("_MainTex"))
{
sharedMaterial.SetTexture("_MainTex", (Texture)(object)StinkyTexture);
}
if (sharedMaterial.HasProperty("_NormalStrength"))
{
sharedMaterial.SetFloat("_NormalStrength", 0f);
}
}
else
{
instance.logger.LogError((object)("Material not found on " + ((Object)target).name + "!"));
}
}
else
{
instance.logger.LogError((object)("MeshRenderer not found on " + ((Object)target).name + "!"));
}
target.localPosition = new Vector3(0f, -0.08f, -2.23f);
target.localRotation = Quaternion.Euler(-90f, 0f, 180f);
target.localScale = new Vector3(40f, 40f, 40f);
}
public static void ModifyBotMeshes(GameObject enemyHead)
{
//IL_0064: Unknown result type (might be due to invalid IL or missing references)
//IL_006b: Expected O, but got Unknown
//IL_00de: Unknown result type (might be due to invalid IL or missing references)
//IL_00e5: Expected O, but got Unknown
//IL_0101: Unknown result type (might be due to invalid IL or missing references)
//IL_0115: Unknown result type (might be due to invalid IL or missing references)
//IL_011a: Unknown result type (might be due to invalid IL or missing references)
Transform val = enemyHead.transform.Find("Enable/Mesh/Animation System/Main Animation/Bot Mesh/Offset/Bot Animation/Mesh");
if ((Object)(object)val == (Object)null)
{
instance.logger.LogError((object)"Bot Mesh object not found!");
return;
}
Transform val2 = val.Find("Enemy Head Bot - Idle");
if ((Object)(object)val2 != (Object)null)
{
foreach (Transform item in val2)
{
Transform val3 = item;
MeshRenderer component = ((Component)val3).GetComponent<MeshRenderer>();
if ((Object)(object)component != (Object)null)
{
((Renderer)component).enabled = false;
}
}
}
else
{
instance.logger.LogError((object)"'Enemy Head Bot - Idle' object not found under Bot Mesh!");
}
int num = 0;
foreach (Transform item2 in val)
{
Transform val4 = item2;
if (((Object)val4).name != "Enemy Head Bot - Idle")
{
val4.localPosition += new Vector3(0.02f, 0f, 0.335f);
num++;
}
}
}
}
[HarmonyPatch(typeof(EnemyHeadController), "Awake")]
public class Patch_EnemyHeadController
{
[HarmonyPostfix]
public static void Postfix(EnemyHeadController __instance)
{
if ((Object)(object)__instance == (Object)null)
{
StinkyEnemyBase.instance.logger.LogError((object)"EnemyHeadController instance is null!");
return;
}
Transform parent = ((Component)__instance).transform.parent;
object obj;
if (parent == null)
{
obj = null;
}
else
{
Transform parent2 = parent.parent;
obj = ((parent2 != null) ? ((Component)parent2).gameObject : null);
}
GameObject val = (GameObject)obj;
if ((Object)(object)val == (Object)null)
{
StinkyEnemyBase.instance.logger.LogError((object)"Enemy head parent is null!");
return;
}
StinkyEnemyBase.ModifyEnemyHead(val);
StinkyEnemyBase.ModifyBotMeshes(val);
}
}