SecretAnorak

UMA Bone Cleaner

May 26th, 2019
971
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.18 KB | None | 0 0
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using UMA;
  5. using UMA.CharacterSystem;
  6. using UnityEngine;
  7.  
  8. // UMA "Extra Bone Removal System" Butchered by SecretAnorak, clever parts written by Jaimi (UMA Developer Extraordinaire)
  9.  
  10. namespace UMA
  11. {
  12.     public class UMABoneCleaner : MonoBehaviour
  13.     {
  14.         private List<string> KillBones = new List<string>();
  15.         private List<UMAJiggleBoneListing> removalRegister = new List<UMAJiggleBoneListing>();
  16.         private UMAData uMAData;
  17.         private DynamicCharacterAvatar avatar;
  18.    
  19.         public void Awake()
  20.         {
  21.             avatar = gameObject.GetComponentInChildren<DynamicCharacterAvatar>();
  22.             avatar.RecipeUpdated.AddListener(CleanBones);
  23.         }
  24.  
  25.         protected void OnDisable()
  26.         {
  27.             avatar.RecipeUpdated.RemoveListener(CleanBones);
  28.         }
  29.    
  30.         public void CleanBones(UMAData umaData)
  31.         {
  32.             uMAData = gameObject.GetComponentInChildren<UMAData>();
  33.             List<UMAJiggleBoneListing> listingsToDelete = new List<UMAJiggleBoneListing>();
  34.            
  35.             foreach(UMAJiggleBoneListing listing in removalRegister)
  36.             {
  37.                 if(avatar.GetWardrobeItemName(listing.carrierSlot) != listing.recipe)
  38.                 {
  39.                     KillBones.Add(listing.boneName);
  40.                    
  41.                     listingsToDelete.Add(listing);
  42.                 }
  43.             }
  44.            
  45.             foreach(UMAJiggleBoneListing listing in listingsToDelete)
  46.             {
  47.                 removalRegister.Remove(listing);
  48.             }
  49.             listingsToDelete.Clear();
  50.            
  51.             ProcessBones(gameObject.transform);
  52.         }
  53.    
  54.         private void ProcessBones(Transform transform)
  55.         {
  56.             foreach(Transform t in transform)
  57.             {
  58.                 if (KillBones.Contains(t.gameObject.name))
  59.                 {
  60.                     RecursivelyRemoveChildBones(t);
  61.                     GameObject.Destroy(t.gameObject);
  62.                 }
  63.                 else
  64.                 {
  65.                     ProcessBones(t);
  66.                 }
  67.             }
  68.         }
  69.    
  70.         private void RecursivelyRemoveChildBones(Transform transform)
  71.         {
  72.             uMAData.skeleton.RemoveBone(UMAUtils.StringToHash(transform.name));
  73.             foreach(Transform t in transform)
  74.             {
  75.                 RecursivelyRemoveChildBones(t);
  76.             }
  77.         }
  78.        
  79.         public void RegisterJiggleBone(UMAJiggleBoneListing boneListing)
  80.         {
  81.             removalRegister.Add(boneListing);
  82.         }
  83.     }
  84.    
  85.     public class UMAJiggleBoneListing
  86.     {
  87.         public String boneName;
  88.         public String carrierSlot;
  89.         public String recipe;
  90.     }
  91. }
Advertisement
Add Comment
Please, Sign In to add comment