// using System; // using System.Collections.Generic; // using GAS; // using GAS.Runtime; // using xFrame; // // namespace CoreGame.Render // { // public static class AbilitySrv // { // private static int s_SeqGen = 1; // // private static readonly Dictionary // s_AbilityAssets = new(300); // // private static readonly Dictionary // s_GameplayEffects = new(50); // // public static void AttachActiveAbilityGroup(int groupId, CombatEntity entity, int level = 1) // { // var tbSkillGroup = SkillGroupDescMgr.Instance.GetConfig(groupId); // GrantBaseAbility(entity); // AttachActiveAbility(entity, tbSkillGroup.defaultSkill); // foreach (var skill in tbSkillGroup.skillA) // { // AttachActiveAbility(entity, skill); // } // // foreach (var skill in tbSkillGroup.skillB) // { // AttachActiveAbility(entity, skill); // } // // AttachActiveAbility(entity, tbSkillGroup.skillDeath); // } // // public static GameAbilityContext AttachTalent_WithGaParam(CombatEntity entity, int talentId, // CombatEntity granter, int level) // { // var talentDesc = TalentDescMgr.Instance.GetConfig(talentId); // if (talentDesc == null) // { // XLog.LogWarning($"AttachTalent_WithGaParam: talent {talentId} is null"); // return null; // } // // var skillIds = talentDesc.skillId; // GameplayAbilityCfg gaCfg = default; // // gaCfg.cleanOnDeactive = true; // 默认清理!!! // gaCfg.p1 = talentDesc.desc[0].Num; // gaCfg.p2 = talentDesc.desc[1].Num; // gaCfg.p3 = talentDesc.desc[2].Num; // gaCfg.p4 = talentDesc.desc[3].Num; // // gaParam.param1 = talentDesc.desc; // GameAbilityContext fristAbility = null; // for (var index = 0; index < skillIds.Length; index++) // { // var skillId = skillIds[index]; // var attachActiveAbility = GrantTransferAbility(entity, skillId, gaCfg, granter, level); // if (attachActiveAbility == null) // continue; // // fristAbility ??= attachActiveAbility; // // attachActiveAbility.abilitySpec.gaInitCfg = gaCfg; // } // // return fristAbility; // } // // public static GameAbilityContext GrantTransferAbility(CombatEntity entity, int abilityId, // in GameplayAbilityCfg gaInitCfg, CombatEntity granter = null, int level = 1) // { // if (entity.IsValid() == false) // { // XLog.LogWarning("AttachActiveAbility : entity is null"); // return null; // } // // if (entity.hasAbilitySystem == false) // { // entity.AddAbilitySystem(entity); // entity.abilitySystem.Init(null, null, null, 1); // // GrantBaseAbility(entity); // #if !GAME_RELEASE // GameplayAbilitySystem.GAS.Register(entity.abilitySystem); // #endif // } // // if (abilityId == 0) // return null; // // var tbSkill = SkillDescMgr.Instance.GetConfig(abilityId); // if (tbSkill == null) // { // XLog.LogWarning("GrantTransferAbility : tbSkill is null, abilityId is " + abilityId); // return null; // } // // Asset属于配置表,不允许篡改 // var ability = GetAbility(tbSkill); // GameAbilityContext gaCtx = null; // if (ability != null) // { // // 需要在UnGrantAbility时释放 // gaCtx = SptPool.Malloc(); // gaCtx.ownerEnt = entity; // if (granter != null) // { // gaCtx.granterEid = granter.creationIndex; // } // // gaCtx.abilityId = abilityId; // gaCtx.abilityCfg = tbSkill; // gaCtx.gaSeq = s_SeqGen++; // gaCtx.level = level; // entity.abilitySystem.GrantAbility(ability, gaCtx, gaInitCfg); // // XLog.LogDebug($"AttachActiveAbility: {tbSkill.SkillTemplatePath} {gaCtx.gaSeq}"); // } // else // { // XLog.LogWarning($"AttachActiveAbility: ability {abilityId} level {level} is null"); // } // // return gaCtx; // } // // public static GameAbilityContext AttachActiveAbility(CombatEntity entity, int abilityId, // CombatEntity granter = null, int level = 1) // { // if (entity.IsValid() == false) // { // XLog.LogWarning("AttachActiveAbility : entity is null"); // return null; // } // // if (entity.hasAbilitySystem == false) // { // entity.AddAbilitySystem(entity); // entity.abilitySystem.Init(); // // GrantBaseAbility(entity); // #if !GAME_RELEASE // // GameplayAbilitySystem.GAS.Register(entity.abilitySystem); // #endif // } // // if (abilityId == 0) // return null; // // var tbSkill = SkillDescMgr.Instance.GetConfig(abilityId); // // Asset属于配置表,不允许篡改 // var ability = GetAbility(tbSkill); // GameAbilityContext gaCtx = null; // if (ability != null) // { // // 需要在UnGrantAbility时释放 // gaCtx = SptPool.Malloc(); // gaCtx.ownerEnt = entity; // if (granter != null) // { // gaCtx.granterEid = granter.creationIndex; // } // // gaCtx.abilityId = abilityId; // gaCtx.abilityCfg = tbSkill; // gaCtx.gaSeq = s_SeqGen++; // gaCtx.level = level; // entity.abilitySystem.GrantAbility(ability, gaCtx, default); // // XLog.LogDebug($"AttachActiveAbility: {tbSkill.SkillTemplatePath} {gaCtx.gaSeq}"); // } // else // { // XLog.LogWarning($"AttachActiveAbility: ability {abilityId} level {level} is null"); // } // // return gaCtx; // } // // public static GameAbilityContext AttachAndTryActiveAbility(CombatEntity entity, int abilityId, bool dropAbility) // { // var context = AttachActiveAbility(entity, abilityId); // if (context != null) // { // context.dropAbilityWhenEnd = dropAbility; // context.asc.TryActivateAbility_WithSeq(context.gaSeq); // } // // return context; // } // // public static GameplayAbility GetAbility(SkillDesc cfg) // { // if (string.IsNullOrEmpty(cfg.SkillTemplatePath)) // return null; // // // if (s_AbilityAssets.TryGetValue(cfg.id, out var ability) == false) // { // var asset = SyncAssetLoader.GetAssetObject("AbilityAsset", cfg.SkillTemplatePath); // if (asset == null) // { // XLog.LogWarning($"GetAbility: {cfg.SkillTemplatePath} is null or not an AbilityAsset"); // return null; // } // // asset.abilityID = cfg.id; // // switch (cfg.Id) // ability = Activator.CreateInstance(asset.AbilityType(), args: asset) as GameplayAbility; // // if (asset is TimelineAbilityAssetBase timelineAbilityAsset) // { // timelineAbilityAsset.Init(); // } // // if (ability != null) // { // s_AbilityAssets.Add(cfg.id, ability); // // var abilityTagContainer = GameplayAbility.s_UseAssetTag // ? ability.Tag // : GetAbilityTagContainerFromSkillCfg(cfg); // ability.SetTagContainer(ref abilityTagContainer); // ability.NormalizeAssetsCooldownTime(); // } // } // // return ability; // } // // public static void GrantBaseAbility(CombatEntity entity) // { // var commParamDesc = CommParamDescMgr.Instance.GetConfig("DefaultGA"); // foreach (var abilityId in commParamDesc.int_list) // { // AttachActiveAbility(entity, abilityId); // 受击能力 // } // } // // public static void DetachTalent(AbilitySystemComponent asc, int talentId) // { // var talentDesc = TalentDescMgr.Instance.GetConfig(talentId); // for (int j = 0; j < talentDesc.skillId.Length; j++) // { // asc.UnGrantAbilityByCfgId(talentDesc.skillId[j]); // } // } // // public static void ResetTalentSkill(CombatEntity entity, List adds, List removes) // { // var abilitySystemComponent = entity.abilitySystem; // if (abilitySystemComponent == null) // { // entity.AddAbilitySystem(entity); // abilitySystemComponent = entity.abilitySystem; // } // // if (removes != null) // { // for (int i = 0; i < removes.Count; i++) // { // XLog.LogDebug($"【remove talent】 is {removes[i].talentId}, level is {removes[i].level}"); // DetachTalent(abilitySystemComponent, removes[i].talentId); // } // } // // if (adds != null) // { // for (int i = 0; i < adds.Count; i++) // { // XLog.LogDebug($"【add talent】 is {adds[i].talentId}, level is {adds[i].level}"); // AttachTalent_WithGaParam(entity, adds[i].talentId, null, adds[i].level); // } // } // // // // // if (entity.TagCountContainer.HasTag(GTagLib.CD_Solt_ChangeGunSkill)) // return; // // var hasAbility = entity.abilitySystem.AbilityContainer.HasAbility(GTagLib.Solt_ChangeGunSkill); // if (hasAbility == false) // return; // if (entity.isLocalPlayer) // { // var cduiData = new CDUIData(); // cduiData.slot = 1; // cduiData.type = CDUIType.ChangeGun; // cduiData.lastCd = 0; // cduiData.totalCd = 1f; // EventSrv.DispatchLogicEvent(ClientEvent.OnUICDChange, cduiData); // } // } // // // private static AbilityTagContainer GetAbilityTagContainerFromSkillCfg(SkillDesc tbSkill) // { // var assetTagsLength = tbSkill.AssetTags.Length; // var assetTags = new GameplayTag[assetTagsLength]; // for (var i = 0; i < assetTagsLength; i++) // assetTags[i] = GetGameplayTag(tbSkill.AssetTags[i]); // // var cancelAbilityWithTagsLength = tbSkill.CancelAbilityWithTags.Length; // var cancelAbilityWithTags = new GameplayTag[cancelAbilityWithTagsLength]; // for (var i = 0; i < cancelAbilityWithTagsLength; i++) // cancelAbilityWithTags[i] = GetGameplayTag(tbSkill.CancelAbilityWithTags[i]); // // var blockAbilityWithTagsLength = tbSkill.BlockAbilityWithTags.Length; // var blockAbilityWithTags = new GameplayTag[blockAbilityWithTagsLength]; // for (var i = 0; i < blockAbilityWithTagsLength; i++) // blockAbilityWithTags[i] = GetGameplayTag(tbSkill.BlockAbilityWithTags[i]); // // var activationOwnedTagsLength = tbSkill.ActivationOwnedTags.Length; // var activationOwnedTags = new GameplayTag[activationOwnedTagsLength]; // for (var i = 0; i < activationOwnedTagsLength; i++) // activationOwnedTags[i] = GetGameplayTag(tbSkill.ActivationOwnedTags[i]); // // var activationRequiredTagsLength = tbSkill.ActivationRequiredTags.Length; // var activationRequiredTags = new GameplayTag[activationRequiredTagsLength]; // for (var i = 0; i < activationRequiredTagsLength; i++) // activationRequiredTags[i] = GetGameplayTag(tbSkill.ActivationRequiredTags[i]); // // var activationBlockedTagsLength = tbSkill.ActivationBlockedTags.Length; // var activationBlockedTags = new GameplayTag[activationBlockedTagsLength]; // for (var i = 0; i < activationBlockedTagsLength; i++) // activationBlockedTags[i] = GetGameplayTag(tbSkill.ActivationBlockedTags[i]); // // var tagContainer = new AbilityTagContainer(assetTags, cancelAbilityWithTags, blockAbilityWithTags, // activationOwnedTags, activationRequiredTags, activationBlockedTags); // // return tagContainer; // } // // // public static GameplayTag GetGameplayTag(string tagName) // { // if (GTagLib.TagMap.TryGetValue(tagName, out var tag) != false) return tag; // tag = new GameplayTag(tagName); // GTagLib.TagMap.Add(tagName, tag); // return tag; // } // // // public static GameplayEffect GetGameplayEffect(string effectPath) // { // if (string.IsNullOrEmpty(effectPath)) // return null; // // // if (s_GameplayEffects.TryGetValue(effectPath, out var gea) == false) // { // var asset = SyncAssetLoader.GetAssetObject("GameplayEffectAsset", effectPath); // if (asset == null) // { // XLog.LogWarning($"GetGameplayEffect: {effectPath} is null or not an GameplayEffectAsset"); // return null; // } // // gea = new GameplayEffect(asset); // s_GameplayEffects.Add(effectPath, gea); // } // // return gea; // } // } // }