Exemplo n.º 1
0
 public static bool WearNTear_UpdateWear(ref WearNTear __instance)
 {
     if (OverrideWearNTear(ref __instance))
     {
         ZNetView m_nview = (ZNetView)AccessTools.Field(typeof(WearNTear), "m_nview").GetValue(__instance);
         if (m_nview == null || !m_nview.IsValid())
         {
             return(false);
         }
         bool shouldUpdate = (bool)AccessTools.Method(typeof(WearNTear), "ShouldUpdate").Invoke(__instance, new object[] { });
         if (m_nview.IsOwner() && shouldUpdate)
         {
             if (ZNetScene.instance.OutsideActiveArea(__instance.transform.position))
             {
                 float maxSupport = (float)AccessTools.Method(typeof(WearNTear), "GetMaxSupport").Invoke(__instance, new object[] { });
                 AccessTools.Field(typeof(WearNTear), "m_support").SetValue(__instance, maxSupport);
                 m_nview.GetZDO().Set("support", maxSupport);
                 return(false);
             }
             float num          = 0.0f;
             bool  haveRoof     = (bool)AccessTools.Method(typeof(WearNTear), "HaveRoof").Invoke(__instance, new object[] { });
             bool  shouldDamage = EnvMan.instance.IsWet() && !haveRoof;
             if ((bool)(UnityEngine.Object)__instance.m_wet)
             {
                 __instance.m_wet.SetActive(shouldDamage);
             }
             if (__instance.m_noRoofWear && (double)__instance.GetHealthPercentage() > minHealthPercentage)
             {
                 bool  isUnderWater = (bool)AccessTools.Method(typeof(WearNTear), "IsUnderWater").Invoke(__instance, new object[] { });
                 float rainTimer    = (float)AccessTools.Field(typeof(WearNTear), "m_rainTimer").GetValue(__instance);
                 float health       = m_nview.GetZDO().GetFloat("health", __instance.m_health);
                 if (shouldDamage || isUnderWater)
                 {
                     if ((double)rainTimer == 0.0)
                     {
                         rainTimer = Time.time;
                     }
                     else if ((double)Time.time - (double)rainTimer > 60.0)
                     {
                         rainTimer = Time.time;
                         num      += damagePerMinute.Value;
                         if (IsTooMuchDamage(ref __instance, health, num))
                         {
                             float reduceBy = HowMuchIsTooMuch(ref __instance, health, num);
                             num -= reduceBy;
                         }
                     }
                 }
                 else
                 {
                     rainTimer = 0.0f;
                 }
                 AccessTools.Field(typeof(WearNTear), "m_rainTimer").SetValue(__instance, rainTimer);
             }
             if (__instance.m_noSupportWear)
             {
                 AccessTools.Method(typeof(WearNTear), "UpdateSupport").Invoke(__instance, new object[] { });
                 bool haveSupport = (bool)AccessTools.Method(typeof(WearNTear), "HaveSupport").Invoke(__instance, new object[] { });
                 if (!haveSupport)
                 {
                     num = 100f;
                 }
             }
             bool canBeRemoved = (bool)AccessTools.Method(typeof(WearNTear), "CanBeRemoved").Invoke(__instance, new object[] { });
             if ((double)num > 0.0 && !canBeRemoved)
             {
                 num = 0.0f;
             }
             if ((double)num > 0.0)
             {
                 __instance.ApplyDamage(num / 100f * __instance.m_health);
             }
         }
         AccessTools.Method(typeof(WearNTear), "UpdateVisual").Invoke(__instance, new object[] { true });
         return(false);
     }
     else
     {
         return(true);
     }
 }