Brynzananas-Freaky_Eyes icon

Freaky Eyes

Adds freaky eyes to Blind Pest, Blind Vermin and Lemurians.

Last updated 3 days ago
Total downloads 1153
Total rating 0 
Categories Mods Skins Seekers of the Storm Update
Dependency string Brynzananas-Freaky_Eyes-1.3.0
Dependants 0 other packages depend on this package

This mod requires the following mods to function

Brynzananas-Body_Model_Additions_API-1.3.0 icon
Brynzananas-Body_Model_Additions_API

Adds a system to load custom objects onto characters in game and in lobby. Model additions can require selected skins, skills, skins and skills or custom condition.

Preferred version: 1.3.0

README

Created using https://thunderstore.io/package/Brynzananas/Body_Model_Additions_API/

All code as an example:

using System.Security.Permissions;
using System.Security;
using static BodyModelAdditionsAPI.Main;
using UnityEngine;
using RoR2;
using UnityEngine.AddressableAssets;
using System.Collections.Generic;
using Newtonsoft.Json.Utilities;
using System.Linq;
using UnityEngine.PlayerLoop;
using RoR2.CharacterAI;
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: HG.Reflection.SearchableAttribute.OptIn]
[assembly: HG.Reflection.SearchableAttribute.OptInAttribute]
[module: UnverifiableCode]
#pragma warning disable CS0618
#pragma warning restore CS0618
namespace FreakyEyes
{
    [BepInPlugin(ModGuid, ModName, ModVer)]
    [BepInDependency("com.brynzananas.bodymodeladditionsapi")]
    [System.Serializable]
    public class Main : BaseUnityPlugin
    {
        public const string ModGuid = "com.brynzananas.freakyeyes";
        public const string ModName = "Freaky Eyes";
        public const string ModVer = "1.3.0";
        public static AssetBundle assetBundle;
        public static PluginInfo PInfo { get; private set; }
        public static GameObject freakyEye;
        public void Awake()
        {
            PInfo = Info;
            assetBundle = AssetBundle.LoadFromFile(System.IO.Path.Combine(System.IO.Path.GetDirectoryName(PInfo.Location), "assetbundles", "freakyeye"));
            List<Material> materials = new List<Material>();
            materials.AddRange(assetBundle.LoadAllAssets<Material>());
            foreach (Material material in materials)
            {
                if (!material.shader.name.StartsWith("StubbedRoR2"))
                {
                    continue;
                }
                string shaderName = material.shader.name.Replace("StubbedRoR2", "RoR2") + ".shader";
                Shader replacementShader = Addressables.LoadAssetAsync<Shader>(shaderName).WaitForCompletion();
                if (replacementShader)
                {
                    material.shader = replacementShader;
                }
            }
            freakyEye = assetBundle.LoadAsset<GameObject>("Assets/CosmeticsMod/googlyeye.prefab");
            freakyEye.AddComponent<TrackingEye>();
            ModelPartInfo modelPartInfo = new ModelPartInfo
            {
                bodyName = "FlyingVerminBody",
                gameObject = freakyEye,
                inputString = "Body",
                codeAfterApplying = PlaceIt
            };
            new ModelPart(modelPartInfo);
            void PlaceIt(GameObject modelObject, ChildLocator childLocator, CharacterModel characterModel, ActivePartsComponent activePartsComponent)
            {
                ApplyFreakyTracking(modelObject, characterModel);
                modelObject.transform.localPosition = new Vector3(-0.45f, 0.641f, .89f);
                modelObject.transform.localScale = new Vector3(0.3f, 0.3f, 0.3f);
            }
            modelPartInfo = new ModelPartInfo
            {
                bodyName = "FlyingVerminBody",
                gameObject = freakyEye,
                inputString = "Body",
                codeAfterApplying = PlaceIt2
            };
            new ModelPart(modelPartInfo);
            void PlaceIt2(GameObject modelObject, ChildLocator childLocator, CharacterModel characterModel, ActivePartsComponent activePartsComponent)
            {
                ApplyFreakyTracking(modelObject, characterModel);
                modelObject.transform.localPosition = new Vector3(0.45f, 0.641f, .89f);
                modelObject.transform.localScale = new Vector3(0.3f, 0.3f, 0.3f);
            }
            modelPartInfo = new ModelPartInfo
            {
                bodyName = "VerminBody",
                gameObject = freakyEye,
                inputString = "Head",
                codeAfterApplying = PlaceIt3
            };
            new ModelPart(modelPartInfo);
            void PlaceIt3(GameObject modelObject, ChildLocator childLocator, CharacterModel characterModel, ActivePartsComponent activePartsComponent)
            {
                ApplyFreakyTracking(modelObject, characterModel);
                modelObject.transform.localPosition = new Vector3(-0.312f, 0.999f, -0.308f);
                modelObject.transform.localEulerAngles = new Vector3(-127.928f, 0, 0);
                modelObject.transform.localScale = new Vector3(0.2f, 0.2f, 0.2f);
            }
            modelPartInfo = new ModelPartInfo
            {
                bodyName = "VerminBody",
                gameObject = freakyEye,
                inputString = "Head",
                codeAfterApplying = PlaceIt4
            };
            new ModelPart(modelPartInfo);
            void PlaceIt4(GameObject modelObject, ChildLocator childLocator, CharacterModel characterModel, ActivePartsComponent activePartsComponent)
            {
                ApplyFreakyTracking(modelObject, characterModel);
                modelObject.transform.localPosition = new Vector3(0.312f, 0.999f, -0.308f);
                modelObject.transform.localEulerAngles = new Vector3(-127.928f, 0, 0);
                modelObject.transform.localScale = new Vector3(0.2f, 0.2f, 0.2f);
            }
            modelPartInfo = new ModelPartInfo
            {
                bodyName = "LemurianBody",
                gameObject = freakyEye,
                inputString = "Head",
                codeAfterApplying = PlaceIt5
            };
            new ModelPart(modelPartInfo);
            void PlaceIt5(GameObject modelObject, ChildLocator childLocator, CharacterModel characterModel, ActivePartsComponent activePartsComponent)
            {
                ApplyFreakyTracking(modelObject, characterModel);
                modelObject.transform.localPosition = new Vector3(1.47f, 1.86f, -0.33f);
                modelObject.transform.localEulerAngles = new Vector3(-70f, 90, 0);
                modelObject.transform.localScale = new Vector3(0.6f, 0.6f, 0.6f);
            }
            modelPartInfo = new ModelPartInfo
            {
                bodyName = "LemurianBody",
                gameObject = freakyEye,
                inputString = "Head",
                codeAfterApplying = PlaceIt6
            };
            new ModelPart(modelPartInfo);
            void PlaceIt6(GameObject modelObject, ChildLocator childLocator, CharacterModel characterModel, ActivePartsComponent activePartsComponent)
            {
                ApplyFreakyTracking(modelObject, characterModel);
                modelObject.transform.localPosition = new Vector3(-1.47f, 1.86f, -0.33f);
                modelObject.transform.localEulerAngles = new Vector3(250f, 90, 0);
                modelObject.transform.localScale = new Vector3(0.6f, 0.6f, 0.6f);
            }
            modelPartInfo = new ModelPartInfo
            {
                bodyName = "LemurianBruiserBody",
                gameObject = freakyEye,
                inputString = "Head",
                codeAfterApplying = PlaceIt7
            };
            new ModelPart(modelPartInfo);
            void PlaceIt7(GameObject modelObject, ChildLocator childLocator, CharacterModel characterModel, ActivePartsComponent activePartsComponent)
            {
                ApplyFreakyTracking(modelObject, characterModel);
                modelObject.transform.localPosition = new Vector3(1.7f, 2f, -0.2f);
                modelObject.transform.localEulerAngles = new Vector3(-75f, 90, 0);
                modelObject.transform.localScale = new Vector3(0.7f, 0.7f, 0.7f);
            }
            modelPartInfo = new ModelPartInfo
            {
                bodyName = "LemurianBruiserBody",
                gameObject = freakyEye,
                inputString = "Head",
                codeAfterApplying = PlaceIt8
            };
            new ModelPart(modelPartInfo);
            void PlaceIt8(GameObject modelObject, ChildLocator childLocator, CharacterModel characterModel, ActivePartsComponent activePartsComponent)
            {
                ApplyFreakyTracking(modelObject, characterModel);
                modelObject.transform.localPosition = new Vector3(-1.7f, 2f, -0.2f);
                modelObject.transform.localEulerAngles = new Vector3(255f, 90, 0);
                modelObject.transform.localScale = new Vector3(0.7f, 0.7f, 0.7f);
            }
            void ApplyFreakyTracking(GameObject gameObject, CharacterModel characterModel)
            {
                if (characterModel && characterModel.body && characterModel.body.master)
                {
                    BaseAI baseAI = characterModel.body.master.GetComponent<BaseAI>();
                    if (baseAI != null)
                    {
                        TrackingEye trackingEye = gameObject.GetComponent<TrackingEye>();
                        trackingEye.baseAI = baseAI;
                    }
                }
            }
        }
        public class TrackingEye : MonoBehaviour
        {
            public Transform eyeBone;
            public Transform eyeTarget;
            public BaseAI baseAI;
            public PlayerCharacterMasterController characterMasterController;
            public bool freakier = false;
            public void Start()
            {
                if (baseAI == null)
                {
                    Destroy(this);
                    return;
                }
                eyeBone = transform;
                if(eyeBone == null)
                {
                    Destroy(this);
                    return;
                }
                freakier = Util.CheckRoll(5f);
            }
            public void FixedUpdate()
            {
                if (baseAI && baseAI.enemySearch != null && baseAI.enemySearch.candidatesEnumerable != null && baseAI.enemySearch.candidatesEnumerable.Count > 0)
                {
                    HurtBox hurtBox = baseAI.enemySearch.candidatesEnumerable.FirstOrDefault().hurtBox;
                    eyeTarget = hurtBox.transform;
                    if (freakier && hurtBox && hurtBox.healthComponent.body && hurtBox.healthComponent.body.master && hurtBox.healthComponent.body.master.playerCharacterMasterController)
                    {
                        characterMasterController = hurtBox.healthComponent.body.master.playerCharacterMasterController;
                        eyeTarget = characterMasterController.networkUser.cameraRigController.sceneCam.transform;
                    }
                }
            }
            public void LateUpdate()
            {
                if (eyeTarget && eyeBone)
                {
                    eyeBone.rotation = Quaternion.LookRotation((eyeTarget.transform.position - eyeBone.position).normalized);
                }
            }
        }
        
    }
}