PercevalsVolleyItemInfo.cs 4.9 KB

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