ManualReload.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.Events;
  5. public class ManualReload : CustomInteractible
  6. {
  7. [Space]
  8. public Transform ReloadObject,Zatvor,HummerRevolver; //reload object, bolt, revolver hummer
  9. public Vector2 ClampPosition; //position limits
  10. public Vector2 ClampAngle; //angle limits
  11. //[HideInInspector]
  12. public bool reloadHalf,reloadEnd=true,reloadFinish=true,handDrop,boltAngleTrue=false,boltSlideTrue = true; //reload maintaince variables
  13. public bool reloadLikeAR; //AR type ( bolt handle not moving when shooting )
  14. public TypeReload typeReload; //reload type
  15. public enum TypeReload{
  16. Slider,
  17. Cracking,
  18. LeverAction,
  19. BoltAction,
  20. Revolver,
  21. }
  22. public UnityEvent BulletOff,BulletOn;
  23. public float returnAddSpeed=0.01f,knockback; //bolt return, recoil
  24. [Header("SwingReload")]
  25. public Transform PointSwingReload; //swing calculation points
  26. public Vector3 localDirSwing,bulletOffSwingDir; //drum return direction / casings extraction direction
  27. public float MaxAngleDir=45, substractSpeed=100, returnSpeedMultiply=500,substractSpeedBullet=300,returnSpeedMultiplyBullet=500;//угол в котором просчитывается направление, мертвая зона если скорость руки ниже этой, умножение скорости
  28. Vector3 oldPosSwing, speedSwing, oldSpeedSwing, Velosity;
  29. [Header("shotgun fix")]
  30. public Transform[] grabColliderObject; //fix of cracked barrel colliders
  31. public Transform[] reloadColliderObject;
  32. float PositionReload;
  33. float returnStart,returnSpeed;
  34. float tempAngle;
  35. Magazine magazineRevolver;
  36. Trigger trigger;
  37. Vector3 revolverDrumDirection;
  38. [Header("Sounds Events")]
  39. public UnityEvent clampReloadHalf;
  40. public UnityEvent clampReloadEnd;
  41. public UnityEvent clampX,clampY;
  42. public UnityEvent boltPosition,boltAngle;
  43. // [HideInInspector]
  44. public int revolverBulletID=0;
  45. public enum TypeHandGrabRotation{
  46. freeze,
  47. free,
  48. vertical,
  49. horizontal,
  50. }
  51. public TypeHandGrabRotation typeHandGrabRotation; //bolt grip type
  52. bool revolverReadyShoot,clampXCheck,clampYCheck;
  53. void Start()
  54. {
  55. enabled = false;
  56. if (reloadHalf == reloadEnd) {
  57. reloadHalf = !reloadEnd;
  58. }
  59. magazineRevolver = GetComponentInParent<PrimitiveWeapon> ().GetComponentInChildren<Magazine> ();
  60. trigger = GetComponentInParent<PrimitiveWeapon> ().GetComponentInChildren<Trigger> ();
  61. }
  62. void FixedUpdate()
  63. {
  64. if (typeReload == TypeReload.Slider&&returnAddSpeed > 0 || knockback > 0) {
  65. if (reloadHalf||handDrop) {
  66. returnSpeed += returnAddSpeed*Time.deltaTime;
  67. PositionReload=Mathf.MoveTowards(returnStart,ClampPosition.y,returnSpeed*Time.deltaTime);
  68. if (PositionReload >= ClampPosition.y) {
  69. enabled = false;
  70. if (!reloadEnd && reloadHalf) {
  71. handDrop = false;
  72. reloadEnd = true;
  73. reloadHalf = false;
  74. BulletOn.Invoke ();
  75. clampReloadEnd.Invoke ();
  76. returnSpeed = 0;
  77. }
  78. }
  79. } else {//reloadEnd
  80. PositionReload=Mathf.MoveTowards(PositionReload,ClampPosition.x,knockback*Time.deltaTime);
  81. if (PositionReload <= ClampPosition.x) {
  82. reloadHalf = true;
  83. reloadEnd = false;
  84. BulletOff.Invoke ();
  85. clampReloadHalf.Invoke ();
  86. reloadFinish = ReloadObject.localPosition.z >= ClampPosition.y;
  87. }
  88. }
  89. if (reloadLikeAR) {
  90. if (PositionReload > ReloadObject.localPosition.z) {
  91. ReloadObject.localPosition = Vector3.forward * PositionReload;
  92. }
  93. } else {
  94. ReloadObject.localPosition = Vector3.forward * PositionReload;
  95. }
  96. if (Zatvor)
  97. Zatvor.localPosition = Vector3.forward * PositionReload;
  98. reloadFinish = PositionReload >= ClampPosition.y;
  99. if (reloadFinish)
  100. handDrop = false;
  101. if (ReloadObject.localPosition.z == ClampPosition.x) {
  102. if (!clampXCheck) {
  103. clampX.Invoke ();
  104. clampXCheck = true;
  105. }
  106. } else {
  107. clampXCheck = false;
  108. }
  109. if (ReloadObject.localPosition.z == ClampPosition.y) {
  110. if (!clampYCheck) {
  111. clampY.Invoke ();
  112. clampYCheck = true;
  113. }
  114. } else {
  115. clampYCheck = false;
  116. }
  117. }
  118. if (typeReload == TypeReload.Cracking&&PointSwingReload) {
  119. if (!reloadFinish&&tempAngle>ClampAngle.x&&!leftHand&&!rightHand) {
  120. tempAngle -= returnAddSpeed*Time.deltaTime;
  121. }
  122. if (Vector3.Angle (Velosity, transform.parent.TransformDirection (localDirSwing)) < MaxAngleDir) {
  123. float tempSwingReload = Mathf.Clamp(Velosity.magnitude - substractSpeed*Time.deltaTime,0,float.MaxValue)*returnSpeedMultiply;
  124. tempAngle += tempSwingReload*Time.deltaTime;
  125. if (!reloadHalf&&tempAngle < ClampAngle.x) {
  126. reloadHalf = true;
  127. reloadEnd = false;
  128. BulletOff.Invoke ();
  129. clampReloadHalf.Invoke ();
  130. reloadFinish = false;
  131. }
  132. if (!reloadEnd && reloadHalf && tempAngle >= ClampAngle.y) {
  133. reloadEnd = true;
  134. reloadFinish = true;
  135. reloadHalf = false;
  136. clampReloadEnd.Invoke ();
  137. BulletOn.Invoke ();
  138. enabled = false;
  139. }
  140. }
  141. tempAngle = Mathf.Clamp (tempAngle, ClampAngle.x, ClampAngle.y);
  142. ReloadObject.localEulerAngles = new Vector3 (-tempAngle, 0, 0);
  143. speedSwing = (PointSwingReload.position - oldPosSwing);
  144. Velosity = (speedSwing - oldSpeedSwing)/Time.deltaTime;
  145. oldSpeedSwing = speedSwing;
  146. oldPosSwing = PointSwingReload.position;
  147. if (grabColliderObject != null && reloadColliderObject != null && grabColliderObject.Length == reloadColliderObject.Length) {
  148. for (int i = 0; i < grabColliderObject.Length; i++) {
  149. grabColliderObject [i].SetPositionAndRotation (reloadColliderObject [i].position, reloadColliderObject [i].rotation);
  150. }
  151. }
  152. if (tempAngle == ClampAngle.x) {
  153. if (!clampXCheck) {
  154. clampX.Invoke ();
  155. clampXCheck = true;
  156. }
  157. } else {
  158. clampXCheck = false;
  159. }
  160. if (tempAngle == ClampAngle.y) {
  161. if (!clampYCheck) {
  162. clampY.Invoke ();
  163. clampYCheck = true;
  164. }
  165. } else {
  166. clampYCheck = false;
  167. }
  168. }
  169. if (typeReload == TypeReload.LeverAction) {
  170. tempAngle=Mathf.MoveTowards(tempAngle,ClampAngle.y,returnAddSpeed*Time.deltaTime);
  171. if (!reloadEnd && reloadHalf && tempAngle >= ClampAngle.y) {
  172. reloadEnd = true;
  173. reloadFinish = true;
  174. reloadHalf = false;
  175. BulletOn.Invoke ();
  176. clampReloadEnd.Invoke ();
  177. }
  178. reloadFinish = tempAngle >= ClampAngle.y;
  179. if (reloadFinish){
  180. enabled = false;
  181. }
  182. tempAngle = Mathf.Clamp (tempAngle, ClampAngle.x, ClampAngle.y);
  183. ReloadObject.localEulerAngles = new Vector3 (tempAngle, 0, 0);
  184. if (tempAngle == ClampAngle.y) {
  185. if (!clampYCheck) {
  186. clampY.Invoke ();
  187. clampYCheck = true;
  188. }
  189. } else {
  190. clampYCheck = false;
  191. }
  192. }
  193. if (typeReload == TypeReload.Revolver&&PointSwingReload) {
  194. ReloadObject.localEulerAngles = new Vector3 (0, 0, tempAngle);
  195. if (tempAngle<ClampAngle.y&&!leftHand&&!rightHand&!reloadFinish) {
  196. tempAngle += returnAddSpeed*Time.deltaTime;
  197. }
  198. if (Vector3.Angle (Velosity, transform.parent.TransformDirection (localDirSwing)) < MaxAngleDir) {
  199. float tempSwingReload = Mathf.Clamp(Velosity.magnitude - substractSpeed*Time.deltaTime,0,float.MaxValue)*returnSpeedMultiply;
  200. tempAngle -= tempSwingReload*Time.deltaTime;
  201. }
  202. if (!reloadFinish&&Vector3.Angle (Velosity, transform.parent.TransformDirection (bulletOffSwingDir)) < MaxAngleDir) {//вылет патронов с магазина
  203. float tempSwingReload = Mathf.Clamp(Velosity.magnitude - substractSpeedBullet*Time.deltaTime,0,float.MaxValue)*returnSpeedMultiplyBullet;
  204. if (tempSwingReload > 0) {
  205. BulletOff.Invoke ();
  206. }
  207. }
  208. if (reloadEnd && !reloadHalf && tempAngle >= ClampAngle.y) {
  209. reloadHalf = true;
  210. reloadEnd = false;
  211. clampReloadHalf.Invoke ();
  212. }
  213. if (!reloadEnd && reloadHalf && tempAngle <= ClampAngle.x) {
  214. reloadEnd = true;
  215. reloadFinish = true;
  216. reloadHalf = false;
  217. clampReloadEnd.Invoke ();
  218. }
  219. tempAngle = Mathf.Clamp (tempAngle, ClampAngle.x, ClampAngle.y);
  220. speedSwing = PointSwingReload.position - oldPosSwing;
  221. Velosity = (speedSwing - oldSpeedSwing)/Time.deltaTime;
  222. oldSpeedSwing = speedSwing;
  223. oldPosSwing = PointSwingReload.position;
  224. }
  225. }
  226. public void CustomRevolverUpdate(){
  227. if (trigger.Axis < 0.1f)
  228. revolverReadyShoot = true;
  229. if (revolverReadyShoot) {
  230. HummerRevolver.localEulerAngles = new Vector3 (Mathf.Lerp (ClampPosition.x, ClampPosition.y, trigger.Axis), 0);
  231. if (reloadFinish)
  232. ReloadObject.GetChild (0).localEulerAngles = new Vector3 (0, 0, (revolverBulletID - trigger.Axis) * 360 / magazineRevolver.capacity);
  233. } else {
  234. HummerRevolver.localEulerAngles = new Vector3 (ClampPosition.x, 0);
  235. }
  236. }
  237. public void RevolverDrunClose(){
  238. revolverBulletID= magazineRevolver.getBulletIdRevolver (ReloadObject.GetChild (0).localEulerAngles.z);
  239. ReloadObject.GetChild (0).localEulerAngles = new Vector3 (0, 0, revolverBulletID * 360/magazineRevolver.capacity);
  240. }
  241. public void RevolverNextBullet(){
  242. if (typeReload == TypeReload.Revolver) {
  243. if (revolverReadyShoot) {
  244. revolverReadyShoot = false;
  245. HummerRevolver.localEulerAngles = new Vector3 (ClampPosition.x, 0);
  246. if (reloadFinish) {
  247. revolverBulletID = ((revolverBulletID - 1) + magazineRevolver.capacity) % magazineRevolver.capacity;
  248. ReloadObject.GetChild (0).localEulerAngles = new Vector3 (0, 0, revolverBulletID * 360 / magazineRevolver.capacity);
  249. }
  250. }
  251. }
  252. }
  253. public void GrabStart(CustomHand hand){
  254. SetInteractibleVariable (hand);
  255. revolverDrumDirection=hand.PivotPoser.InverseTransformDirection (ReloadObject.GetChild (0).up);
  256. }
  257. public void GrabUpdate(CustomHand hand){
  258. Vector3 localHand=Vector3.zero;
  259. switch (typeReload) {
  260. case TypeReload.Slider:
  261. ReloadObject.transform.position = hand.PivotPoser.position;
  262. if (!reloadHalf && ReloadObject.localPosition.z < ClampPosition.x) {
  263. reloadHalf = true;
  264. reloadEnd = false;
  265. BulletOff.Invoke ();
  266. clampReloadHalf.Invoke ();
  267. }
  268. handDrop = true;
  269. if (!reloadEnd && reloadHalf && ReloadObject.localPosition.z > ClampPosition.y) {
  270. reloadEnd = true;
  271. reloadHalf = false;
  272. BulletOn.Invoke ();
  273. clampReloadEnd.Invoke ();
  274. }
  275. reloadFinish = ReloadObject.localPosition.z >= ClampPosition.y;
  276. ReloadObject.localPosition = new Vector3 (0, 0, Mathf.Clamp (ReloadObject.transform.localPosition.z, ClampPosition.x, ClampPosition.y));
  277. if (Zatvor)
  278. Zatvor.localPosition = ReloadObject.localPosition;
  279. if (typeHandGrabRotation != TypeHandGrabRotation.freeze) {
  280. if (typeHandGrabRotation == TypeHandGrabRotation.horizontal) {
  281. grabPoints [0].transform.rotation = Quaternion.LookRotation (-grabPoints [0].transform.parent.right, hand.PivotPoser.up);
  282. } else {
  283. if (typeHandGrabRotation == TypeHandGrabRotation.vertical) {
  284. grabPoints [0].transform.rotation = Quaternion.LookRotation (grabPoints [0].transform.parent.up, hand.PivotPoser.up);
  285. } else {
  286. grabPoints [0].transform.rotation = hand.PivotPoser.rotation;
  287. }
  288. }
  289. }
  290. if (ReloadObject.localPosition.z == ClampPosition.x) {
  291. if (!clampXCheck) {
  292. clampX.Invoke ();
  293. clampXCheck = true;
  294. }
  295. } else {
  296. clampXCheck = false;
  297. }
  298. if (ReloadObject.localPosition.z == ClampPosition.y) {
  299. if (!clampYCheck) {
  300. clampY.Invoke ();
  301. clampYCheck = true;
  302. }
  303. } else {
  304. clampYCheck = false;
  305. }
  306. PositionReload = ReloadObject.localPosition.z;
  307. break;
  308. case TypeReload.Cracking:
  309. localHand = transform.InverseTransformPoint (hand.PivotPoser.position);
  310. tempAngle = -Vector2.SignedAngle (new Vector2 (localHand.z, localHand.y), Vector2.right);
  311. if (!reloadHalf && tempAngle < ClampAngle.x) {
  312. reloadHalf = true;
  313. reloadEnd = false;
  314. BulletOff.Invoke ();
  315. clampReloadHalf.Invoke ();
  316. reloadFinish = false;
  317. }
  318. if (!reloadEnd && reloadHalf && tempAngle > ClampAngle.y) {
  319. reloadEnd = true;
  320. reloadFinish = true;
  321. reloadHalf = false;
  322. BulletOn.Invoke ();
  323. clampReloadEnd.Invoke ();
  324. }
  325. reloadFinish = tempAngle >= ClampAngle.y;
  326. tempAngle = Mathf.Clamp (tempAngle, ClampAngle.x, ClampAngle.y);
  327. ReloadObject.localEulerAngles = new Vector3 (0, 0, tempAngle);
  328. enabled = true;
  329. //для дробовика с разломаным стволом фикс
  330. if (grabColliderObject != null && reloadColliderObject != null && grabColliderObject.Length == reloadColliderObject.Length) {
  331. for (int i = 0; i < grabColliderObject.Length; i++) {
  332. grabColliderObject [i].SetPositionAndRotation (reloadColliderObject [i].position, reloadColliderObject [i].rotation);
  333. }
  334. }
  335. if (tempAngle == ClampAngle.x) {
  336. if (!clampXCheck) {
  337. clampX.Invoke ();
  338. clampXCheck = true;
  339. }
  340. } else {
  341. clampXCheck = false;
  342. }
  343. if (tempAngle == ClampAngle.y) {
  344. if (!clampYCheck) {
  345. clampY.Invoke ();
  346. clampYCheck = true;
  347. }
  348. } else {
  349. clampYCheck = false;
  350. }
  351. break;
  352. case TypeReload.LeverAction:
  353. localHand = transform.InverseTransformPoint (hand.PivotPoser.position);
  354. tempAngle = Vector2.SignedAngle (new Vector2 (localHand.z, localHand.y), Vector2.left);
  355. ClampPosition.x = tempAngle;
  356. if (!reloadHalf && tempAngle < ClampAngle.x) {
  357. reloadHalf = true;
  358. reloadEnd = false;
  359. BulletOff.Invoke ();
  360. clampReloadHalf.Invoke ();
  361. }
  362. if (!reloadEnd && reloadHalf && tempAngle > ClampAngle.y) {
  363. reloadEnd = true;
  364. reloadFinish = true;
  365. reloadHalf = false;
  366. BulletOn.Invoke ();
  367. clampReloadEnd.Invoke ();
  368. }
  369. reloadFinish = tempAngle >= ClampAngle.y;
  370. tempAngle = Mathf.Clamp (tempAngle, ClampAngle.x, ClampAngle.y);
  371. ReloadObject.localEulerAngles = new Vector3 (Mathf.Clamp (tempAngle, ClampAngle.x, ClampAngle.y), 0, 0);
  372. enabled = true;
  373. if (tempAngle == ClampAngle.x) {
  374. if (!clampXCheck) {
  375. clampX.Invoke ();
  376. clampXCheck = true;
  377. }
  378. } else {
  379. clampXCheck = false;
  380. }
  381. if (tempAngle == ClampAngle.y) {
  382. if (!clampYCheck) {
  383. clampY.Invoke ();
  384. clampYCheck = true;
  385. }
  386. } else {
  387. clampYCheck = false;
  388. }
  389. break;
  390. case TypeReload.BoltAction:
  391. ReloadObject.position = hand.PivotPoser.position;
  392. ReloadObject.rotation = Quaternion.LookRotation (transform.forward, hand.PivotPoser.position - transform.position);
  393. if (boltSlideTrue) {
  394. if (Vector3.SignedAngle (transform.up, ReloadObject.up, transform.forward) < ClampAngle.x) {
  395. ReloadObject.localEulerAngles = new Vector3 (0, 0, ClampAngle.x);
  396. if (!reloadEnd && reloadHalf){
  397. reloadEnd = true;
  398. reloadFinish = true;
  399. reloadHalf = false;
  400. BulletOn.Invoke ();
  401. clampReloadEnd.Invoke ();
  402. }
  403. }
  404. if (Vector3.SignedAngle (transform.up, ReloadObject.up, transform.forward) > ClampAngle.y) {
  405. ReloadObject.localEulerAngles = new Vector3 (0, 0, ClampAngle.y);
  406. if (!boltAngleTrue) {
  407. boltAngle.Invoke ();
  408. }
  409. boltAngleTrue = true;
  410. } else {
  411. boltAngleTrue = false;
  412. }
  413. ReloadObject.localEulerAngles = new Vector3 (0, 0, Mathf.Clamp (Vector3.SignedAngle (transform.up, ReloadObject.up, transform.forward), ClampAngle.x, ClampAngle.y));
  414. } else {
  415. ReloadObject.localEulerAngles = new Vector3 (0, 0, ClampAngle.y);
  416. }
  417. if (boltAngleTrue) {
  418. if (ReloadObject.localPosition.z < ClampPosition.x) {
  419. if (!reloadHalf) {
  420. reloadHalf = true;
  421. reloadEnd = false;
  422. BulletOff.Invoke ();
  423. clampReloadHalf.Invoke ();
  424. }
  425. }
  426. if (ReloadObject.localPosition.z > ClampPosition.y) {
  427. if (!boltSlideTrue) {
  428. boltPosition.Invoke ();
  429. }
  430. boltSlideTrue = true;
  431. } else {
  432. boltSlideTrue = false;
  433. }
  434. ReloadObject.localPosition = new Vector3 (0, 0, Mathf.Clamp (ReloadObject.transform.localPosition.z, ClampPosition.x, ClampPosition.y));
  435. } else {
  436. ReloadObject.localPosition = new Vector3 (0, 0, ClampPosition.y);
  437. }
  438. reloadFinish = Vector3.SignedAngle (transform.up, ReloadObject.up, transform.forward) <= ClampAngle.x;
  439. if (ReloadObject.localPosition.z == ClampPosition.x) {
  440. if (!clampXCheck) {
  441. clampX.Invoke ();
  442. clampXCheck = true;
  443. }
  444. } else {
  445. clampXCheck = false;
  446. }
  447. if (ReloadObject.localPosition.z == ClampPosition.y) {
  448. if (!clampYCheck) {
  449. clampY.Invoke ();
  450. clampYCheck = true;
  451. }
  452. } else {
  453. clampYCheck = false;
  454. }
  455. break;
  456. case TypeReload.Revolver:
  457. localHand = transform.InverseTransformPoint (hand.PivotPoser.position);
  458. tempAngle = -Vector2.SignedAngle (new Vector2 (localHand.x, localHand.y), Vector2.up);
  459. if (reloadEnd && !reloadHalf && tempAngle >= ClampAngle.y) {
  460. reloadHalf = true;
  461. reloadEnd = false;
  462. clampReloadHalf.Invoke ();
  463. // BulletOff.Invoke ();
  464. }
  465. if (!reloadEnd && reloadHalf && tempAngle <= ClampAngle.x) {
  466. reloadEnd = true;
  467. reloadFinish = true;
  468. reloadHalf = false;
  469. clampReloadEnd.Invoke ();
  470. }
  471. enabled = true;
  472. reloadFinish = tempAngle <= ClampAngle.x;
  473. tempAngle = Mathf.Clamp (tempAngle, ClampAngle.x, ClampAngle.y);
  474. ReloadObject.localEulerAngles = new Vector3 (0, 0, tempAngle);
  475. ReloadObject.GetChild (0).rotation = Quaternion.LookRotation (ReloadObject.forward, hand.PivotPoser.TransformDirection(revolverDrumDirection));
  476. GetMyGrabPoserTransform(hand).rotation=Quaternion.LookRotation (ReloadObject.forward, hand.PivotPoser.up);
  477. break;
  478. default:
  479. break;
  480. }
  481. }
  482. public void GrabEnd(CustomHand hand){
  483. if (typeReload == TypeReload.Slider) {
  484. enabled = true;
  485. returnSpeed = 0;
  486. returnStart = ReloadObject.localPosition.z;
  487. }
  488. if (typeReload == TypeReload.LeverAction) {
  489. enabled = true;
  490. }
  491. if (typeReload == TypeReload.Revolver) {
  492. if (reloadFinish) {
  493. BulletOn.Invoke ();
  494. ReloadObject.GetChild (0).localEulerAngles = new Vector3 (0, 0, revolverBulletID * 360 / magazineRevolver.capacity);
  495. }
  496. if (HummerRevolver) {
  497. HummerRevolver.localEulerAngles=new Vector3(ClampPosition.x,0);
  498. }
  499. }
  500. DettachHand (hand);
  501. }
  502. }