using ItemAPI; using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using UnityEngine; namespace DogOnALeash { public class Module : ETGModule { public override void Start() { ItemBuilder.Init(); ETGMod.AIActor.OnPostStart += this.OnPostStart; } public static void Log(string text, string color = "#FFFFFF") { ETGModConsole.Log($"{text}"); } private void OnPostStart(AIActor actor) { if (!string.IsNullOrEmpty(actor.EnemyGuid)) { if (actor.EnemyGuid == "c07ef60ae32b404f99e294a6f9acba75") { LeashController leash = actor.gameObject.GetOrAddComponent(); leash.tugsDog = true; } else if (actor.EnemyGuid == "ededff1deaf3430eaf8321d0c6b2bd80") { LeashController leash = actor.gameObject.GetOrAddComponent(); } } } public override void Exit() { } public override void Init() { } } public class LeashController : MonoBehaviour { public LeashController() { } public void Start() { dog = base.GetComponent(); if (dog && dog.GetComponent()) { CompanionController controller = dog.GetComponent(); owner = ReflectGetField(typeof(CompanionController), "m_owner", controller); } if (owner) { this.m_cable = dog.gameObject.AddComponent(); this.m_cable.Attach1Offset = this.owner.CenterPosition - this.owner.transform.position.XY(); this.m_cable.Attach2Offset = dog.CenterPosition - dog.transform.position.XY(); this.m_cable.Initialize(this.owner.transform, dog.transform); m_cable.GetComponent().SetColors(new List() { Color.green }); } } public void FixedUpdate() { if (tugsDog && Vector2.Distance(owner.specRigidbody.UnitCenter, dog.specRigidbody.UnitCenter) > 5) { dog.knockbackDoer.ApplyKnockback(owner.specRigidbody.UnitCenter - dog.specRigidbody.UnitCenter, 10); } } public static T ReflectGetField(Type classType, string fieldName, object o = null) { FieldInfo field = classType.GetField(fieldName, BindingFlags.Public | BindingFlags.NonPublic | ((o != null) ? BindingFlags.Instance : BindingFlags.Static)); return (T)field.GetValue(o); } public bool tugsDog; private ArbitraryCableDrawer m_cable; private AIActor dog; private PlayerController owner; } }