//this function will only create ability without storing it //user will need to put it inside wrapper and then call storeChannel public static BlueprintAbility createChannelEnergy(ChannelType channel_type, string name, string dispaly_name, string description, string guid, ContextRankConfig rank_config, NewMechanics.ContextCalculateAbilityParamsBasedOnClasses dc_scaling, AbilityResourceLogic resource_logic) { string original_guid = ""; switch (channel_type) { case ChannelType.PositiveHeal: original_guid = "f5fc9a1a2a3c1a946a31b320d1dd31b2"; break; case ChannelType.PositiveHarm: original_guid = "279447a6bf2d3544d93a0a39c3b8e91d"; break; case ChannelType.NegativeHarm: original_guid = "89df18039ef22174b81052e2e419c728"; break; case ChannelType.NegativeHeal: original_guid = "9be3aa47a13d5654cbcb8dbd40c325f2"; break; default: throw Main.Error("Only base channel abilities can be created"); } var ability = library.CopyAndAdd <BlueprintAbility>(original_guid, name, guid); if (dispaly_name != "") { ability.SetName(dispaly_name); } if (description != "") { ability.SetDescription(description); } ability.ReplaceComponent <ContextRankConfig>(rank_config); ability.ReplaceComponent <NewMechanics.ContextCalculateAbilityParamsBasedOnClasses>(dc_scaling); if (resource_logic != null) { ability.ReplaceComponent <AbilityResourceLogic>(resource_logic); } else { ability.RemoveComponents <AbilityResourceLogic>(); } updateItemsForChannelDerivative(library.Get <BlueprintAbility>(original_guid), ability); return(ability); }
static void Postfix(AbilityData __instance, ref int __result) { if (__result == -1 && __instance.ConvertedFrom != null) { if (__instance.Blueprint != null) { AbilityResourceLogic abilityResourceLogic = __instance.Blueprint.GetComponents <AbilityResourceLogic>().FirstOrDefault <AbilityResourceLogic>(); BlueprintAbilityResource blueprintAbilityResource = (abilityResourceLogic != null && abilityResourceLogic.IsSpendResource) ? abilityResourceLogic.RequiredResource : null; if (blueprintAbilityResource != null) { __result = __instance.Fact.Owner.Resources.GetResourceAmount(blueprintAbilityResource) / abilityResourceLogic.CalculateCost(__instance); } } } }
static public BlueprintFeature Create() { if (ArcaneReservoir.resource == null) { UnityModManagerNet.UnityModManager.Logger.Log("[Arcanist ConsumeSpell]Arcane Reservoir Pool must be created before ConsumeSpells::Create()"); return(null); } if (library.BlueprintsByAssetId.ContainsKey("6e48c034817eabd99df991e0435025ed")) { return(library.Get <BlueprintFeature>("6e48c034817eabd99df991e0435025ed")); } consume_resource = Helpers.CreateAbilityResource("ArcanistClassConsumeSpellAblResource", "", "", "56e3d1e34251f5c628ae08e78dbf0360",//MD5-32[ArcanistClass.ConsumeSpell.AblResource] IconSet.vanish_icon); consume_resource.SetIncreasedByStat(3, StatType.Charisma); var variants = new List <BlueprintAbility>(); for (int i = 1; i <= 9; i++) { int least_arcanist_level = (i == 1) ? 1 : 2 * i; AbilityRequirementClassSpellLevel comp_pre = Helpers.Create <AbilityRequirementClassSpellLevel>(); comp_pre.characterClass = arcanist; comp_pre.RequiredSpellLevel = i; AbilityResourceLogic comp_res = Helpers.Create <AbilityResourceLogic>(); comp_res.Amount = 1; comp_res.IsSpendResource = true; comp_res.RequiredResource = consume_resource; comp_res.CostIsCustom = false; AbilityEffectRunAction comp_act = Helpers.Create <AbilityEffectRunAction>(); ConsumeSpellForReservoirAction act = Helpers.Create <ConsumeSpellForReservoirAction>(); act.resource = ArcaneReservoir.resource; act.spellLevel = i; act.blueprintSpellbook = arcanist.Spellbook; comp_act.Actions = new ActionList { Actions = new GameAction[] { act } }; BlueprintAbility abl_i = Helpers.CreateAbility($"ArcanistClassConsumeSpellLevel{i}Abl", "", "", OtherUtils.GetMd5($"ArcanistClassConsumeSpellLevel{i}Abl"), IconSet.magus_spellrecall, AbilityType.Supernatural, UnitCommand.CommandType.Move, AbilityRange.Personal, "", "", comp_pre, comp_res, comp_act); abl_i.SetName(Helpers.CreateString($"ArcanistClass.ConsumeSpell.Level{i}.Abl.Name")); abl_i.SetDescription(Helpers.CreateString($"ArcanistClass.ConsumeSpell.Level{i}.Abl.Desc")); abl_i.LocalizedDuration = Helpers.CreateString("ArcaneTide.Instant"); abl_i.LocalizedSavingThrow = Helpers.CreateString("ArcaneTide.NoSave"); variants.Add(abl_i); ablList.Add(abl_i); } AbilityResourceLogic comp_res0 = Helpers.Create <AbilityResourceLogic>(); comp_res0.Amount = 1; comp_res0.IsSpendResource = true; comp_res0.RequiredResource = consume_resource; comp_res0.CostIsCustom = false; abl = Helpers.CreateAbility("ArcanistClassConsumeSpellAbl", "", "", "33bec6603df0f7cfe904525e9a44432e",//MD5-32[ArcanistClass.ConsumeSpells.Abl] IconSet.magus_spellrecall, AbilityType.Supernatural, UnitCommand.CommandType.Move, AbilityRange.Personal, "", "", comp_res0); abl.SetName(Helpers.CreateString("ArcanistClass.ConsumeSpells.Abl.Name")); abl.SetDescription(Helpers.CreateString("ArcanistClass.ConsumeSpells.Abl.Desc")); abl.LocalizedDuration = Helpers.CreateString("ArcaneTide.Instant"); abl.LocalizedSavingThrow = Helpers.CreateString("ArcaneTide.NoSave"); abl.AddComponent(abl.CreateAbilityVariants(variants.ToArray <BlueprintAbility>())); ablList.Add(abl); feat = Helpers.CreateFeature("ArcanistClassConsumeSpellsFeat", "", "", "6e48c034817eabd99df991e0435025ed",//MD5-32[ArcanistClass.ConsumeSpells.Feat] IconSet.magus_spellrecall, FeatureGroup.None, Helpers.Create <AddAbilityResources>(a => a.Resource = consume_resource), Helpers.Create <AddFacts>(a => a.Facts = new BlueprintUnitFact[] { abl })); feat.SetName(Helpers.CreateString("ArcanistClass.ConsumeSpells.Name")); feat.SetDescription(Helpers.CreateString("ArcanistClass.ConsumeSpells.Desc")); return(feat); }
public static BlueprintAbility createChannelEnergy(ChannelType channel_type, string name, string guid, BlueprintFeature parent_feature, ContextRankConfig rank_config = null, AbilityResourceLogic resource_logic = null, bool update_items = false) { string original_guid = ""; BlueprintAbility prototype = null; switch (channel_type) { case ChannelType.PositiveHeal: original_guid = "f5fc9a1a2a3c1a946a31b320d1dd31b2"; prototype = positive_heal[0].ability; break; case ChannelType.PositiveHarm: original_guid = "279447a6bf2d3544d93a0a39c3b8e91d"; prototype = positive_harm[0].ability; break; case ChannelType.NegativeHarm: original_guid = "89df18039ef22174b81052e2e419c728"; prototype = negative_harm[0].ability; break; case ChannelType.NegativeHeal: original_guid = "9be3aa47a13d5654cbcb8dbd40c325f2"; prototype = negative_heal[0].ability; break; } var ability = library.CopyAndAdd <BlueprintAbility>(original_guid, name, guid); if (rank_config != null) { ability.ReplaceComponent <ContextRankConfig>(rank_config); } if (resource_logic != null) { ability.ReplaceComponent <AbilityResourceLogic>(resource_logic); } if (update_items) { updateItemsForQuick(ability, prototype); } storeChannel(ability, parent_feature, channel_type); addToQuickChannel(ability, parent_feature, channel_type); addToSelectiveChannel(parent_feature); return(ability); }