RingaboltsFuryItemInfo.cs 4.9 KB

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