PercevalsDisciplineItemInfo.cs 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. using GadgetCore.API;
  2. using System;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Reflection;
  7. using System.Text;
  8. using UltimateNPCWeapons.Scripts;
  9. using UnityEngine;
  10. namespace UltimateNPCWeapons.Infos
  11. {
  12. public class PercevalsDisciplineItemInfo : ItemInfo
  13. {
  14. private const string RPCId = nameof(PercevalsDisciplineItemInfo) + "Attack";
  15. public PercevalsDisciplineItemInfo(ItemType Type, string Name, string Desc, Texture Tex, int Value = -1, EquipStats Stats = default, Texture HeldTex = null, Texture HeadTex = null, Texture BodyTex = null, Texture ArmTex = null)
  16. : base(Type, Name, Desc, Tex, Value, Stats, HeldTex, HeadTex, BodyTex, ArmTex)
  17. {
  18. GadgetCoreAPI.RegisterCustomRPC(RPCId, (e) => { Attack(e); });
  19. }
  20. public PercevalsDisciplineItemInfo(ItemType Type, string Name, string Desc, Material Mat, int Value = -1, EquipStats Stats = default, Material HeldMat = null, Material HeadMat = null, Material BodyMat = null, Material ArmMat = null)
  21. : base(Type, Name, Desc, Mat, Value, Stats, HeldMat, HeadMat, BodyMat, ArmMat)
  22. {
  23. GadgetCoreAPI.RegisterCustomRPC(RPCId, (e) => { Attack(e); });
  24. }
  25. private static readonly FieldInfo canAttack = typeof(PlayerScript).GetField("canAttack", BindingFlags.NonPublic | BindingFlags.Instance);
  26. private static readonly FieldInfo attacking = typeof(PlayerScript).GetField("attacking", BindingFlags.NonPublic | BindingFlags.Instance);
  27. private static readonly FieldInfo t = typeof(PlayerScript).GetField("t", BindingFlags.NonPublic | BindingFlags.Instance);
  28. private static readonly FieldInfo r = typeof(PlayerScript).GetField("r", BindingFlags.NonPublic | BindingFlags.Instance);
  29. public void CreateProjectile(string main, string trail)
  30. {
  31. Texture2D textureMain = GadgetCoreAPI.LoadTexture2D(main);
  32. Texture2D textureTrail = GadgetCoreAPI.LoadTexture2D(trail);
  33. GameObject gameObject = UnityEngine.Object.Instantiate(GadgetCoreAPI.GetWeaponProjectileResource(496));
  34. gameObject.name = "shot" + GetID();
  35. Renderer renderer = gameObject.GetComponentInChildren<Renderer>();
  36. renderer.material = new Material(renderer.material)
  37. {
  38. mainTexture = textureMain
  39. };
  40. gameObject.transform.GetChild(0).eulerAngles = new Vector3(180, 0, -45);
  41. gameObject.transform.GetChild(1).localScale = new Vector3(3, 1, 1);
  42. gameObject.transform.GetChild(1).eulerAngles = new Vector3(180, 0, 0);
  43. Renderer rendererPar = gameObject.transform.GetChild(1).GetComponentInChildren<Renderer>();
  44. rendererPar.material = new Material(rendererPar.material)
  45. {
  46. mainTexture = textureTrail
  47. };
  48. gameObject.transform.GetComponent<BoxCollider>().size = new Vector3(7, 1, 1);
  49. gameObject.GetComponent<Projectile>().onlyHorizontal = false;
  50. GadgetCoreAPI.AddCustomResource("proj/shot" + GetID(), gameObject);
  51. }
  52. private void Attack(object[] o)
  53. {
  54. Vector3 cursorPos = new Vector3((float)o[0], (float)o[1], (float)o[2]);
  55. Vector3 startPos = new Vector3((float)o[3], (float)o[4], (float)o[5]);
  56. int dmg = (int)o[6];
  57. int projRange = (int)o[7];
  58. Package2 package = new Package2(new Vector3(1, -1, 0), dmg, ProjectileID, projRange);
  59. GameObject gameObject2 = (GameObject)UnityEngine.Object.Instantiate(Resources.Load("proj/shot" + ProjectileID), startPos, Quaternion.identity);
  60. gameObject2.SendMessage("Set", package);
  61. var angle = Mathf.Atan2(cursorPos.x, cursorPos.y) * Mathf.Rad2Deg;
  62. var angleVector = Quaternion.AngleAxis(angle, Vector3.forward).eulerAngles;
  63. gameObject2.transform.eulerAngles = new Vector3(0, 0, -90 - angleVector.z);
  64. }
  65. public IEnumerator Attack(PlayerScript script)
  66. {
  67. canAttack.SetValue(script, false);
  68. attacking.SetValue(script, true);
  69. script.StartCoroutine(script.ATKSOUND());
  70. script.Animate(3);
  71. yield return new WaitForSeconds(0.3f);
  72. int dmg = GetDamage(script);
  73. if (TryCrit(script))
  74. {
  75. dmg = MultiplyCrit(script, dmg);
  76. script.GetComponent<AudioSource>().PlayOneShot(script.critSound, Menuu.soundLevel / 10f);
  77. UnityEngine.Object.Instantiate(script.crit, script.transform.position, Quaternion.identity);
  78. }
  79. {
  80. Vector3 cursorPos = Camera.main.ScreenToWorldPoint(Input.mousePosition) - ((Transform)t.GetValue(script)).position;
  81. Vector3 startPos;
  82. if (Camera.main.ScreenToWorldPoint(Input.mousePosition).x > ((Transform)t.GetValue(script)).position.x)
  83. startPos = new Vector3(((Transform)t.GetValue(script)).position.x + 5f, ((Transform)t.GetValue(script)).position.y, 0f);
  84. else
  85. startPos = new Vector3(((Transform)t.GetValue(script)).position.x - 5f, ((Transform)t.GetValue(script)).position.y, 0f);
  86. Package2 package = new Package2(new Vector3(-1, 0, 0), dmg, ProjectileID, (float)GameScript.MODS[10]);
  87. GameObject gameObject2 = (GameObject)UnityEngine.Object.Instantiate(Resources.Load("proj/shot" + ProjectileID), startPos, Quaternion.identity);
  88. gameObject2.SendMessage("Set", package);
  89. var angle = Mathf.Atan2(cursorPos.x, cursorPos.y) * Mathf.Rad2Deg;
  90. var angleVector = Quaternion.AngleAxis(angle, Vector3.forward).eulerAngles;
  91. gameObject2.transform.eulerAngles = new Vector3(0, 0, -90 - angleVector.z);
  92. GadgetCoreAPI.CallCustomRPC(RPCId, RPCMode.Others, cursorPos.x, cursorPos.y, cursorPos.z,
  93. startPos.x, startPos.y, startPos.z, dmg, PlayerGearModsTracker.GetGearMods(script)[10]);
  94. }
  95. yield return new WaitForSeconds(0.3f);
  96. attacking.SetValue(script, false);
  97. yield return new WaitForSeconds(0.1f);
  98. canAttack.SetValue(script, true);
  99. yield break;
  100. }
  101. }
  102. }