// Either internal static bool Prefix(FeatureDefinitionDamageAffinity __instance, string damageType, int damage, List <string> sourceTags, ref int __result) { var fda = __instance as FeatureDefinitionDamageAffinityEx; if (fda != null) { // custom logic here, modify __result // stop original code from running return(false); } // else do nothing and let original code run return(true); }
internal static FeatureDefinitionDamageAffinityEx Create(FeatureDefinitionDamageAffinity original, string name, DamageAffinityTypeEx damageAffinity, int flatBonusAmount, double ratio) { var retval = new FeatureDefinitionDamageAffinityEx { DamageAffinityTypeEx = damageAffinity, FlatBonusAmount = flatBonusAmount, Ratio = ratio }; // TODO - copy original to retval // AccessTools etc, class builder? AccessTools.Field(retval.GetType(), "guid").SetValue(retval, Guid.NewGuid().ToString("N")); retval.name = name; return(retval); }
// Or internal static void Postfix(FeatureDefinitionDamageAffinity __instance, string damageType, int damage, List <string> sourceTags, ref int __result) { Main.Log("FeatureDefinitionDamageAffinity_ModulateSustainedDamage(Ex): Enter"); // original logic has run and damage calculated will be in __result // is this an instance of our custom affinity? var fda = __instance as FeatureDefinitionDamageAffinityEx; if (fda != null) { // custom logic here, modify __result // custom logic here, modify __result switch (fda.DamageAffinityTypeEx) { case DamageAffinityTypeEx.FlatBonus: __result = damage + fda.FlatBonusAmount; break; case DamageAffinityTypeEx.AttributeAndProficiency: __result = (int)(damage * fda.Ratio); break; case DamageAffinityTypeEx.Ratio: __result = (int)(damage * fda.Ratio); break; default: Main.Error($"Unknown damage affinity: {fda.DamageAffinityTypeEx}"); break; } } // or is it something we want to change anyway //if (__instance.Name == "") // or __instance.Guid == //{ //} // else do nothing (or something if required) }
internal static void Postfix(FeatureDefinitionDamageAffinity __instance, string damageType, int damage, List <string> sourceTags, ref int __result) { Main.Log("FeatureDefinitionDamageAffinity_ModulateSustainedDamage_ExtraProperties: Enter"); // original logic has run and damage calculated so far will be in __result // can also use __instance.Name/__instance.Guid if (damageType != "PsionicBlast") { return; } // look in dictionary, is there extra data for this __instance? if (ExtraProperties.TryGetValue(__instance, out var extraProperties)) { // custom logic here, modify __result switch (extraProperties.DamageAffinityTypeEx) { case DamageAffinityTypeEx.FlatBonus: __result = damage + extraProperties.FlatBonusAmount; break; case DamageAffinityTypeEx.AttributeAndProficiency: __result = (int)(damage * extraProperties.Ratio); break; case DamageAffinityTypeEx.Ratio: __result = (int)(damage * extraProperties.Ratio); break; default: Main.Error($"Unknown damage affinity: {extraProperties.DamageAffinityTypeEx}"); break; } } }