/**
         * 添加TagToAdd到container, 但会删除gameplaytags列表中TagToAdd相关的parent tag
         * 如果TagToAdd已经在gameplaytags列表中, 就不会被添加
         */
        public bool AddLeafTag(CGameplayTag TagToAdd)
        {
            // Check tag is not already explicitly in container
            if (HasTagExact(TagToAdd))
            {
                return(true);
            }

            // If this tag is parent of explicitly added tag, fail
            if (HasTag(TagToAdd))
            {
                return(false);
            }

            CGameplayTagContainer tagToAddContainer = CGameplayTagsManager.Instance.GetSingleTagContainer(TagToAdd);

            if (tagToAddContainer == null)
            {
                return(false);
            }

            // Remove any tags in the container that are a parent to TagToAdd
            foreach (CGameplayTag ParentTag in tagToAddContainer.ParentTags)
            {
                if (HasTagExact(ParentTag))
                {
                    RemoveTag(ParentTag);
                }
            }

            // Add the tag
            AddTag(TagToAdd);
            return(true);
        }
Exemple #2
0
        public CGameplayTagNode(string InTag, CGameplayTagNode InParentNode)
        {
            Tag        = InTag;
            ParentNode = InParentNode;

            List <CGameplayTag> ParentCompleteTags = new List <CGameplayTag>();
            CGameplayTagNode    CurNode            = InParentNode;

            // 只要有父亲node
            while (CurNode.IsValid())
            {
                ParentCompleteTags.Add(CurNode.GetCompleteTag());
                CurNode = CurNode.GetParentTagNode();
            }

            //完整的tag名称
            string CompleteTagString = InTag;

            if (ParentCompleteTags.Count > 0)
            {
                CompleteTagString = string.Format("{0}.{1}", ParentCompleteTags[0].GetTagName(), InTag);
            }

            CGameplayTag tag = new CGameplayTag(CompleteTagString);

            CompleteTagWithParents.GameplayTags.Add(tag);
            CompleteTagWithParents.ParentTags.AddRange(ParentCompleteTags);
        }
 /**
  * 不做唯一性判断, 直接添加tag
  */
 public void AddTagFast(CGameplayTag TagToAdd)
 {
     if (!TagToAdd.IsValid())
     {
         return;
     }
     GameplayTags.Add(TagToAdd);
     AddParentsForTag(TagToAdd);
 }
        /**
         * 精确包含. 只判断GameplayTags列表
         *{"A.1"}.HasTagExact("A") will return False
         */
        public bool HasTagExact(CGameplayTag TagToCheck)
        {
            if (!TagToCheck.IsValid())
            {
                return(false);
            }

            // Only check check explicit tag list
            return(GameplayTags.Contains(TagToCheck));
        }
        /// <summary>
        /// 返回包含本tag以及所有父亲tag的container
        /// 比如传入的a.b.c 那么 此container会包含a, a.b, a.b.c
        /// </summary>
        public CGameplayTagContainer RequestGameplayTagParents(CGameplayTag GameplayTag)
        {
            CGameplayTagContainer container = GetSingleTagContainer(GameplayTag);

            if (container != null)
            {
                return(container.GetGameplayTagParents());
            }
            return(null);
        }
        /// <summary>
        /// TagToCheck是否在本container中. 也会检查ParentTags
        /// {"A.1"}.HasTag("A") will return True, {"A"}.HasTag("A.1") will return False
        /// </summary>
        public bool HasTag(CGameplayTag TagToCheck)
        {
            if (!TagToCheck.IsValid())
            {
                return(false);
            }

            // 自己或者父亲有就可以
            return(GameplayTags.Contains(TagToCheck) || ParentTags.Contains(TagToCheck));
        }
        /**
         * Helper function to insert a tag into a tag node array
         *
         * @param Tag					Tag to insert
         * @param ParentNode			Parent node, if any, for the tag
         * @param NodeArray				Node array to insert the new node into, if necessary (if the tag already exists, no insertion will occur)
         * @return Index of the node of the tag
         */
        private int InsertTagIntoNodeArray(string Tag, CGameplayTagNode ParentNode, List <CGameplayTagNode> NodeArray)
        {
            int InsertionIdx  = -1;
            int WhereToInsert = -1;

            // See if the tag is already in the array
            for (int CurIdx = 0; CurIdx < NodeArray.Count; ++CurIdx)
            {
                var node = NodeArray[CurIdx];
                if (!node.IsValid())
                {
                    continue;
                }

                if (node.GetSimpleTagName() == Tag)
                {
                    InsertionIdx = CurIdx;
                    break;
                }

                if (WhereToInsert == -1)
                {
                    int v = string.CompareOrdinal(node.GetSimpleTagName(), Tag);
                    // Insert new node before this
                    if (v > 0)
                    {
                        WhereToInsert = CurIdx;
                    }
                }
            }

            if (InsertionIdx != -1)
            {
                return(InsertionIdx);
            }

            // Insert at end
            if (WhereToInsert == -1)
            {
                WhereToInsert = NodeArray.Count;
            }

            // Don't add the root node as parent
            CGameplayTagNode TagNode = new CGameplayTagNode(Tag, ParentNode != GameplayRootTag ? ParentNode : null);

            // Add at the sorted location
            NodeArray.Insert(WhereToInsert, TagNode);
            InsertionIdx = WhereToInsert;

            CGameplayTag GameplayTag = TagNode.GetCompleteTag();

            GameplayTagNodeMap.Add(GameplayTag.GetTagName(), TagNode);

            return(1);
        }
        /// <summary>
        /// 在node树中查找传入tag对应的container, 此container仅包含传入的tag
        /// </summary>
        public CGameplayTagContainer GetSingleTagContainer(CGameplayTag GameplayTag)
        {
            CGameplayTagNode node = FindTagNode(GameplayTag);

            if (node.IsValid())
            {
                return(node.GetSingleTagContainer());
            }

            return(null);
        }
        /// <summary>
        /// 获取传入tag所有的子tag组成的container, 不包含传入tag
        /// 例如传入a.b, 则返回的conatiner包含a.b.c, a.b.d, a.b.c.e
        /// </summary>
        public CGameplayTagContainer RequestGameplayTagChildren(CGameplayTag GameplayTag)
        {
            CGameplayTagContainer TagContainer = new CGameplayTagContainer();

            CGameplayTagNode GameplayTagNode = FindTagNode(GameplayTag);

            if (GameplayTagNode.IsValid())
            {
                AddChildrenTags(TagContainer, GameplayTagNode, true, true);
            }
            return(TagContainer);
        }
        /**
         * Tag to remove from the container
         */
        public bool RemoveTag(CGameplayTag TagToRemove)
        {
            bool succ = GameplayTags.Remove(TagToRemove);

            if (!succ)
            {
                return(false);
            }

            // Have to recompute parent table from scratch because there could be duplicates providing the same parent tag
            FillParentTags();
            return(true);
        }
        /** 添加InTag所在的container的parent tags 到 本ParentTags中*/
        protected void AddParentsForTag(CGameplayTag InTag)
        {
            CGameplayTagContainer inContainer = CGameplayTagsManager.Instance.GetSingleTagContainer(InTag);

            if (inContainer == null)
            {
                return;
            }

            // Add Parent tags from this tag to our own
            foreach (CGameplayTag ParentTag in inContainer.ParentTags)
            {
                ParentTags.AddUnique(ParentTag);
            }
        }
        /**
         * 返回直系的父亲
         * calling on x.y will return x
         */
        public CGameplayTag RequestGameplayTagDirectParent(CGameplayTag GameplayTag)
        {
            CGameplayTagNode GameplayTagNode = FindTagNode(GameplayTag);

            if (!GameplayTagNode.IsValid())
            {
                return(null);
            }

            var parent = GameplayTagNode.GetParentTagNode();

            if (parent.IsValid())
            {
                return(parent.GetCompleteTag());
            }
            return(null);
        }
Exemple #13
0
        private void ReadExpr(CGameplayTagQueryExpression E)
        {
            E.ExprType = (CGameplayTagQueryExprType)GetToken();
            if (bReadError)
            {
                return;
            }

            if (E.UsesTagSet())
            {
                // parse tag set
                byte NumTags = GetToken();
                if (bReadError)
                {
                    return;
                }

                for (byte Idx = 0; Idx < NumTags; ++Idx)
                {
                    byte TagIdx = GetToken();
                    if (bReadError)
                    {
                        return;
                    }

                    CGameplayTag Tag = Query.GetTagFromIndex(TagIdx);
                    E.AddTag(Tag);
                }
            }
            else
            {
                // parse expr set
                byte NumExprs = GetToken();
                if (bReadError)
                {
                    return;
                }

                for (byte Idx = 0; Idx < NumExprs; ++Idx)
                {
                    CGameplayTagQueryExpression Exp = new CGameplayTagQueryExpression();
                    ReadExpr(Exp);
                    Exp.AddExpr(Exp);
                }
            }
        }
Exemple #14
0
        private bool EvalNoTagsMatch(CGameplayTagContainer Tags, bool bSkip)
        {
            // parse tagset
            byte NumTags = GetToken();

            if (bReadError)
            {
                return(false);
            }

            if (bSkip)
            {
                GetTokenNext(NumTags);
                if (bReadError)
                {
                    return(false);
                }
            }
            else
            {
                //交叉比较, 如果有一个就结果失败
                for (byte Idx = 0; Idx < NumTags; ++Idx)
                {
                    byte TagIdx = GetToken();
                    if (bReadError)
                    {
                        return(false);
                    }

                    CGameplayTag Tag     = Query.GetTagFromIndex(TagIdx);
                    bool         bHasTag = Tags.HasTag(Tag);
                    if (bHasTag)
                    {
                        return(false);
                    }
                }
            }

            return(true);
        }
Exemple #15
0
 /**
  * 清理现有tag, 用传入的tag填充
  * Replaces existing tags with passed in tag. Does not modify the tag query expression logic.
  * Useful when you need to cache off and update often used query.
  */
 public void ReplaceTagFast(CGameplayTag Tag)
 {
     TagDictionary.Clear();
     TagDictionary.Add(Tag);
 }
Exemple #16
0
 public CGameplayTagQueryExpression AddTag(CGameplayTag Tag)
 {
     TagSet.Add(Tag);
     return(this);
 }
 /**
  * 检测 两个tag有多相近, 返回值越好说明越相近
  * 比如A.b.c 和A.b.d 就比 A.b.c和A.c更相近
  */
 public int GameplayTagsMatchDepth(CGameplayTag GameplayTagOne, CGameplayTag GameplayTagTwo)
 {
     return(1);
 }
        /// <summary>
        /// 将tag a.b.c 变成数组[a, b, c]
        /// </summary>
        public void SplitGameplayTagFName(CGameplayTag Tag, List <string> OutNames)
        {
            var list = Tag.GetTagName().Split('.');

            OutNames.AddRange(list);
        }
        /// <summary>
        /// 找到tag对应的node
        /// </summary>
        public CGameplayTagNode FindTagNode(string TagName)
        {
            CGameplayTag PossibleTag = new CGameplayTag(TagName);

            return(FindTagNode(PossibleTag));
        }
        /// <summary>
        /// 找到tag对应的node
        /// </summary>
        public CGameplayTagNode FindTagNode(CGameplayTag GameplayTag)
        {
            CGameplayTagNode Node = GameplayTagNodeMap[GameplayTag.GetTagName()];

            return(Node);
        }