Advertisement
Guest User

Untitled

a guest
Nov 19th, 2019
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.64 KB | None | 0 0
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4.  
  5. public class DismembermentHandler : MonoBehaviour
  6. {
  7.  
  8. // General Variables
  9. private HealthManager healthHandler;
  10. private Animator animator;
  11. public AudioSource audio_source;
  12. public GameObject root;
  13. body_parts index;
  14.  
  15. public AudioClip[] global_hit_sounds;
  16.  
  17. [System.Serializable]
  18. public class dismember_part
  19. {
  20. public GameObject effect;
  21. public Transform spawn;
  22. public bool get_spawn_rotation;
  23. public bool follow_spawn;
  24. public AudioClip[] dismemberment_sounds;
  25. };
  26.  
  27. [System.Serializable]
  28. public class dismember_effect
  29. {
  30. public dismember_part[] parts;
  31. public float chance;
  32. };
  33.  
  34. [System.Serializable]
  35. public class dismember_effects
  36. {
  37. public dismember_effect[] effects;
  38. public GameObject[] dependency_part_array;
  39. }
  40.  
  41. [System.Serializable]
  42. public class body_parts
  43. {
  44.  
  45. public string part_name;
  46. public bool is_dettached = false;
  47. public GameObject[] attached_part_array;
  48. public Collider[] part_collider_array;
  49. public float damage_mulitplier;
  50. public float damage_to_dismemberment;
  51. public dismember_effects[] dismember_effects_array;
  52. public RuntimeAnimatorController animation;
  53. public string[] dependencies;
  54.  
  55. }
  56.  
  57. public body_parts[] body_parts_array;
  58.  
  59. private void Start()
  60. {
  61.  
  62. healthHandler = GetComponent<HealthManager>();
  63. animator = GetComponent<Animator>();
  64.  
  65. }
  66.  
  67. public Transform getChild(Transform _source, string _name)
  68. {
  69. if (_source.name == _name)
  70. {
  71. return _source;
  72. }
  73. foreach (Transform _i in _source.transform)
  74. {
  75. Transform _child = getChild(_i, _name);
  76. if (_child)
  77. return _child;
  78. }
  79. return null;
  80. }
  81. public void inherit( GameObject _target,GameObject _source )
  82. {
  83. Transform _part = getChild(_source.transform,_target.name);
  84. if (_part)
  85. {
  86. _target.transform.localPosition = _part.localPosition;
  87. _target.transform.localRotation = _part.localRotation;
  88. _target.transform.localScale = _part.localScale;
  89. }
  90.  
  91. foreach (Transform _i in _target.transform)
  92. {
  93. inherit(_i.gameObject, _source);
  94. }
  95. }
  96.  
  97. public void dismember(string body_part, float damage, bool dependency)
  98. {
  99.  
  100. foreach (var i in body_parts_array) if (i.part_name == body_part) index = i;
  101.  
  102. if (!dependency)
  103. {
  104.  
  105. healthHandler.applyDamage(damage, index != null ? index.damage_mulitplier : 1F);
  106. audio_source.PlayOneShot(global_hit_sounds[Random.Range(0, global_hit_sounds.Length)]);
  107.  
  108. }
  109.  
  110. if (index != null)
  111. {
  112.  
  113. index.damage_to_dismemberment -= damage * index.damage_mulitplier;
  114.  
  115. if (index.is_dettached) return;
  116. if (index.damage_to_dismemberment > 0 && !dependency) return;
  117.  
  118. index.is_dettached = true;
  119.  
  120. Dictionary<string, bool> state_part_array = new Dictionary<string, bool>();
  121.  
  122. foreach (var j in index.attached_part_array)
  123. {
  124. state_part_array[j.name] = j.active;
  125. j.SetActive(false);
  126. }
  127.  
  128. foreach (var j in index.part_collider_array)
  129. {
  130. j.enabled = false;
  131. }
  132.  
  133. if (index.animation != null && !healthHandler.is_dead) animator.runtimeAnimatorController = index.animation;
  134.  
  135. var largest_index = -1;
  136. var largest_size = 0;
  137.  
  138. var i = 0;
  139. for (i = 0; i < index.dismember_effects_array.Length; i++)
  140. {
  141. var element = index.dismember_effects_array[i];
  142.  
  143. var j = 0;
  144. for (j = 0; j < element.dependency_part_array.Length; j++)
  145. {
  146. var name = element.dependency_part_array[j].name;
  147. if (state_part_array[name] == false)
  148. {
  149. break;
  150. }
  151. }
  152.  
  153. if (j == element.dependency_part_array.Length)
  154. {
  155. if (element.dependency_part_array.Length > largest_size)
  156. {
  157. largest_index = i;
  158. largest_size = j;
  159. }
  160. }
  161. }
  162.  
  163. //Dictionary<string, bool> state_part_array = new Dictionary<string, bool>();
  164. //ArrayList candidates = new ArrayList();
  165.  
  166. if (largest_index > -1)
  167. {
  168. var effects = index.dismember_effects_array[largest_index].effects;
  169.  
  170. float chance_sum = 0, chance_floor = 0;
  171. foreach (var effect in effects)
  172. {
  173. chance_sum += effect.chance;
  174. }
  175.  
  176. if (0 == chance_sum)
  177. chance_sum = 1;
  178.  
  179. var r = Random.RandomRange(0.0f, 1.0f);
  180. foreach (var effect in effects)
  181. {
  182. chance_floor += effect.chance / chance_sum;
  183. if (chance_floor >= r)
  184. {
  185. foreach (var part in effect.parts)
  186. {
  187. GameObject temp_object = Instantiate(part.effect, part.spawn.position, part.get_spawn_rotation ? part.spawn.rotation : part.effect.transform.rotation);
  188. if (part.follow_spawn)
  189. {
  190. temp_object.transform.SetParent(part.spawn, true);
  191. }
  192. if (temp_object)
  193. {
  194. inherit(temp_object, root);
  195. }
  196. if ( part.dismemberment_sounds.Length > 0)
  197. {
  198. audio_source.PlayOneShot(part.dismemberment_sounds[Random.Range(0, part.dismemberment_sounds.Length)]);
  199. }
  200. }
  201. break;
  202. }
  203. }
  204.  
  205. }
  206.  
  207. if (!dependency)
  208. {
  209.  
  210. healthHandler.applyDamage(damage, index.damage_mulitplier);
  211.  
  212. }
  213.  
  214. foreach (var s in index.dependencies) dismember(s, 0F, true);
  215.  
  216. }
  217.  
  218. }
  219.  
  220. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement